Red de Espejos Comunitarios de Software Libre sobre IPFS

Infraestructura de distribución soberana, descentralizada y de alta resiliencia para distribuciones Linux de la familia RPM, operada por la Fundación MxOS bajo el dominio canónico mirrors.mx-os.mx.

Propósito y Misión

Históricamente, los usuarios e instituciones en México y Latinoamérica han dependido de espejos universitarios aislados o enlaces transfronterizos hacia redes de entrega de contenido comerciales en Estados Unidos. Esta dependencia genera latencia, costos recurrentes de transferencia y vulnerabilidad ante caídas de enlaces internacionales.

La red de espejos de MxOS replantea la entrega de paquetes utilizando el Sistema de Archivos Interplanetario IPFS. Al emplear direccionamiento por contenido y distribución entre pares P2P, el espejo se convierte en una red colaborativa donde cualquier integrante de la comunidad o institución académica puede donar almacenamiento y ancho de banda local, deduplicando transferencias y acelerando descargas dentro de redes locales o nacionales.

Aviso de Fase Experimental

Este proyecto se encuentra actualmente en fase de experimentación activa y prueba de concepto. Operamos bajo una arquitectura de guerrilla diseñada para maximizar la soberanía sin requerir grandes presupuestos de infraestructura:

Servicios y Puntos de Acceso Canónicos

Fundación MxOS opera servicios web públicos con responsabilidades y alcances claramente delimitados:

Catálogo de Software Libre: mirrors.mx-os.mx

El dominio mirrors.mx-os.mx es el portal web canónico y catálogo curado de distribución de paquetes y medios de instalación de software libre de Fundación MxOS.

Pasarela Pública Universal: ipfs.mx-os.mx y gateway.mx-os.mx

El dominio ipfs.mx-os.mx, junto con su alias gateway.mx-os.mx, constituye la pasarela pública y abierta de IPFS de Fundación MxOS, alojada sobre la infraestructura soberana de HOBOPS.IO.

Observatorio Vigía: Cartografía y Salud del Enjambre P2P

La salud, redundancia territorial y disponibilidad de los repositorios no es una caja negra: es auditable abiertamente por cualquier integrante de la comunidad en tiempo real mediante el tablero oficial Vigía:

Estructura del Catálogo Canónico

El árbol publicado bajo /ipns/mirrors.mx-os.mx respeta rigurosamente las convenciones de rutas de Fedora y CentOS Stream, organizando el herramental y los portales en niveles específicos:

mirrors.mx-os.mx/
├── index.html                     <- Portal principal de bienvenida y módulos
├── README.html                    <- Manual de operación responsivo
├── bitacora-cids.json             <- Registro histórico de instantáneas y CIDs raíz
├── docs/                          <- Especificaciones técnicas y manuales en Sphinx
├── vigia/                         <- Tablero de telemetría y cartografía P2P
│   ├── index.html                 <- Aplicación web autocontenida
│   ├── guardianes.json            <- Directorio comunitario de nodos custodios
│   └── telemetry.json             <- Instantánea JSON de nodos guardianes
├── nodo/                          <- Herramientas de operador, scripts y configuraciones
│   ├── bin/                       <- Scripts de automatización y sincronización
│   └── config/                    <- Configuraciones de servicios (caddy, nginx, systemd)
├── fedora/
│   ├── iso/                       <- Imágenes de instalación de Fedora
│   ├── releases/                  <- Árbol Everything por versión y arquitectura
│   └── updates/                   <- Repositorios de actualizaciones continuas
└── centos-stream/
    ├── iso/                       <- Medios de instalación de CentOS Stream
    ├── 10-stream/
    │   ├── BaseOS/                <- Paquetes base y núcleo del sistema
    │   ├── AppStream/             <- Módulos y aplicaciones adicionales
    │   ├── CRB/                   <- CodeReady Linux Builder
    │   ├── HighAvailability/     <- Paquetes para clústeres de alta disponibilidad
    │   ├── NFV/                   <- Virtualización de funciones de red
    │   └── RT/                    <- Núcleo y herramientas en tiempo real
    └── SIGs/
        └── 10-stream/
            └── extras/            <- Paquetería complementaria de SIGs (extras-common)

Módulos de Enclavillado Comunitario

No necesitas descargar el catálogo completo. Puedes seleccionar y enclavillar únicamente la distribución o versión que requieras para tu infraestructura:

Módulo Comando de Enclavillado Tamaño en Red Estimado Final
Fedora 43 Everything ipfs pin add /ipns/mirrors.mx-os.mx/fedora/releases/43/Everything 118G ~125 GB
Fedora 43 Updates ipfs pin add /ipns/mirrors.mx-os.mx/fedora/updates/43 61G ~65 GB
Fedora 44 Everything ipfs pin add /ipns/mirrors.mx-os.mx/fedora/releases/44/Everything 114G ~125 GB
Fedora 44 Updates ipfs pin add /ipns/mirrors.mx-os.mx/fedora/updates/44 53G ~60 GB
Fedora 45 Everything ipfs pin add /ipns/mirrors.mx-os.mx/fedora/releases/45/Everything 116G ~125 GB
CentOS Stream 10 ipfs pin add /ipns/mirrors.mx-os.mx/centos-stream/10-stream 82G ~80 GB
CentOS Stream 10 SIGs ipfs pin add /ipns/mirrors.mx-os.mx/centos-stream/SIGs/10-stream 19G ~25 GB
Catálogo Completo ipfs pin add /ipns/mirrors.mx-os.mx 563G ~600 GB

Consumo del Espejo desde Clientes DNF

Si deseas actualizar tus equipos locales consumiendo paquetes desde la red comunitaria, configura DNF de la siguiente manera:

Opción recomendada: Conexión mediante nodo IPFS local

Al contar con Kubo activo en tu equipo (escuchando en 127.0.0.1:8080), los paquetes se descargan por la red P2P. Si otro equipo en tu misma red local ya descargó una actualización, tu máquina la obtendrá a la velocidad de la red interna sin salir a internet.

Para Fedora 43, 44, 45 o Rawhide

Crea el archivo /etc/yum.repos.d/fedora-mxos-ipfs.repo con privilegios administrativos:

[fedora-mxos-ipfs]
name=Fedora $releasever - $basearch (Espejo MxOS IPFS)
baseurl=http://127.0.0.1:8080/ipns/mirrors.mx-os.mx/fedora/releases/$releasever/Everything/$basearch/os/
enabled=1
metadata_expire=6h
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch

[fedora-updates-mxos-ipfs]
name=Fedora $releasever Updates - $basearch (Espejo MxOS IPFS)
baseurl=http://127.0.0.1:8080/ipns/mirrors.mx-os.mx/fedora/updates/$releasever/$basearch/
enabled=1
metadata_expire=6h
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch

Para CentOS Stream 10

Crea el archivo /etc/yum.repos.d/centos-stream-mxos-ipfs.repo:

[cs10-baseos-mxos-ipfs]
name=CentOS Stream 10 - BaseOS (Espejo MxOS IPFS)
baseurl=http://127.0.0.1:8080/ipns/mirrors.mx-os.mx/centos-stream/10-stream/BaseOS/$basearch/os/
enabled=1
metadata_expire=6h
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[cs10-appstream-mxos-ipfs]
name=CentOS Stream 10 - AppStream (Espejo MxOS IPFS)
baseurl=http://127.0.0.1:8080/ipns/mirrors.mx-os.mx/centos-stream/10-stream/AppStream/$basearch/os/
enabled=1
metadata_expire=6h
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[cs10-crb-mxos-ipfs]
name=CentOS Stream 10 - CRB (Espejo MxOS IPFS)
baseurl=http://127.0.0.1:8080/ipns/mirrors.mx-os.mx/centos-stream/10-stream/CRB/$basearch/os/
enabled=1
metadata_expire=6h
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[cs10-highavailability-mxos-ipfs]
name=CentOS Stream 10 - HighAvailability (Espejo MxOS IPFS)
baseurl=http://127.0.0.1:8080/ipns/mirrors.mx-os.mx/centos-stream/10-stream/HighAvailability/$basearch/os/
enabled=0
metadata_expire=6h
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[cs10-rt-mxos-ipfs]
name=CentOS Stream 10 - Real Time (Espejo MxOS IPFS)
baseurl=http://127.0.0.1:8080/ipns/mirrors.mx-os.mx/centos-stream/10-stream/RT/$basearch/os/
enabled=0
metadata_expire=6h
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[cs10-extras-mxos-ipfs]
name=CentOS Stream 10 - Extras Comunes (Espejo MxOS IPFS)
baseurl=http://127.0.0.1:8080/ipns/mirrors.mx-os.mx/centos-stream/SIGs/10-stream/extras/$basearch/extras-common/
enabled=1
metadata_expire=6h
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

Opción estándar: Conexión HTTPS directa

Si tu equipo no ejecuta un demonio IPFS, puedes configurar tus repositorios apuntando directamente al punto de entrada HTTPS:

[fedora-mxos-https]
name=Fedora $releasever - $basearch (MxOS HTTPS)
baseurl=https://mirrors.mx-os.mx/fedora/releases/$releasever/Everything/$basearch/os/
enabled=1
metadata_expire=6h
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch

Opción inmutable: Congelamiento temporal y regresión histórica

Una de las mayores ventajas del direccionamiento por contenido con IPFS es la posibilidad de fijar tus repositorios a una instantánea exacta en el tiempo. Esto garantiza entornos de compilación deterministas, imágenes de contenedor reproducibles o la posibilidad de regresar a un estado previo si una actualización introdujo regresiones.

Consulta la bitácora pública de instantáneas en bitacora-cids.json o utiliza en tu terminal nodo/bin/mxos-bitacora.bash list.

Ejemplo de configuración DNF anclada a una instantánea específica ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Para anclar tu sistema a la instantánea más reciente del 10 de octubre de 2026, identificador bafybeihrgn2vcjduc7muabvjsipuqazx6bxjbkwaqjojtn2bq6u47u64yy, crea el archivo /etc/yum.repos.d/fedora-snapshot.repo:

[fedora-snapshot]
name=Fedora $releasever - Everything fecha 2026-10-10
baseurl=https://mirrors.mx-os.mx/ipfs/bafybeihrgn2vcjduc7muabvjsipuqazx6bxjbkwaqjojtn2bq6u47u64yy/fedora/releases/$releasever/Everything/$basearch/os/
enabled=1
metadata_expire=never
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch

[fedora-updates-snapshot]
name=Fedora $releasever - Updates fecha 2026-10-10
baseurl=https://mirrors.mx-os.mx/ipfs/bafybeihrgn2vcjduc7muabvjsipuqazx6bxjbkwaqjojtn2bq6u47u64yy/fedora/updates/$releasever/Everything/$basearch/os/
enabled=1
metadata_expire=never
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch

Al emplear la ruta inmutable /ipfs/<CID_RAÍZ>/ en lugar de DNSLink o IPNS, DNF nunca descargará paquetes posteriores a dicha fecha, protegiendo tus sistemas contra cambios no deseados.

Guía del Operador: Nodos Guardianes y Colaboración P2P

El objetivo fundamental de la red de espejos de MxOS es la soberanía y la resiliencia comunitaria: la infraestructura no depende de servidores centrales, sino del enclavillado colaborativo. Cada usuario, institución o laboratorio aloja localmente los repositorios que mejor le parezca y comparte bloques con su red local e internet mediante intercambio entre pares P2P.

Sigue estos pasos directos para configurar tu equipo como nodo guardián:

Paso 1: Instalación de Kubo

Kubo se encuentra empaquetado para Fedora y CentOS Stream en el repositorio Copr de MxOS:

# Habilitar repositorio Copr e instalar paquete
sudo dnf copr enable renich/kubo
sudo dnf install kubo

Paso 2: Inicialización y servicio systemd

Se recomienda operar Kubo en modo de usuario sin privilegios administrativos:

# Inicializar almacén en ~/.ipfs
ipfs init

# Habilitar e iniciar servicio persistente de usuario
systemctl --user enable --now ipfs.service

Paso 3: Apertura de puerto del enjambre libp2p

Para permitir que otros nodos descarguen bloques desde tu equipo, abre el puerto 4001:

# Abrir puerto de enjambre libp2p en TCP y UDP
sudo firewall-cmd --permanent --add-port=4001/tcp
sudo firewall-cmd --permanent --add-port=4001/udp
sudo firewall-cmd --reload

Paso 4: Enlace Directo con el Nodo Semilla: Bootstrap y Peering

Para que tu nodo descubra y transfiera bloques de inmediato desde el nodo maestro de la Fundación MxOS, web0.mx-os.mx, sin demoras en la DHT global, agrégalo a tu lista de arranque y configúralo como par permanente:

# 1. Agregar web0 a la lista de bootstrap inicial
ipfs bootstrap add /ip4/38.58.139.30/tcp/4001/p2p/12D3KooWHJxzs8eArvUWLZGJJEowxXVVjbCK5MwZtDqECsGhjFjD
ipfs bootstrap add /ip4/38.58.139.30/udp/4001/quic-v1/p2p/12D3KooWHJxzs8eArvUWLZGJJEowxXVVjbCK5MwZtDqECsGhjFjD

# 2. Conectar de inmediato en vivo
ipfs swarm connect /ip4/38.58.139.30/tcp/4001/p2p/12D3KooWHJxzs8eArvUWLZGJJEowxXVVjbCK5MwZtDqECsGhjFjD

# 3. Configurar enlace permanente (Peering) para reconexión automática agresiva
ipfs config --json Peering.Peers '[{
  "ID": "12D3KooWHJxzs8eArvUWLZGJJEowxXVVjbCK5MwZtDqECsGhjFjD",
  "Addrs": [
    "/ip4/38.58.139.30/tcp/4001",
    "/ip4/38.58.139.30/udp/4001/quic-v1"
  ]
}]'

# Reiniciar servicio para persistir la configuración
systemctl --user restart ipfs.service

Los enrutadores residenciales y de campus suelen almacenar en caché los registros TXT de DNSLink por tiempos prolongados. Para que tu nodo resuelva los identificadores de contenido recién publicados sin esperar vencimientos de caché local, configura Kubo para consultar directamente el punto de resolución DoH de Cloudflare para el dominio mx-os.mx:

# Delegar resolución DNSLink de mx-os.mx a Cloudflare DoH (FQDN estricto)
ipfs config --json DNS.Resolvers '{"mx-os.mx.": "https://cloudflare-dns.com/dns-query", ".": "auto"}'
systemctl --user restart ipfs.service

Paso 6: Explora y enclavilla tus módulos

Antes de enclavillar, puedes consultar directamente la estructura y los módulos publicados en el catálogo maestro ejecutando ipfs ls:

# 1. Explorar la raíz completa del catálogo comunitario
ipfs ls /ipns/mirrors.mx-os.mx

# 2. Listar las ramas de Fedora disponibles
ipfs ls /ipns/mirrors.mx-os.mx/fedora/releases
ipfs ls /ipns/mirrors.mx-os.mx/fedora/updates

# 3. Enclavillar el módulo deseado
ipfs pin add /ipns/mirrors.mx-os.mx/fedora/releases/43/Everything

Paso 7: Gestión eficiente de almacenamiento con Btrfs y CoW

Para los operadores de nodos guardianes que sincronizan o almacenan paquetes localmente, la infraestructura de espejos de MxOS aprovecha las capacidades nativas de Btrfs y la copia en escritura denominada CoW:

Para consultar procedimientos de dimensionamiento, políticas de recolección de basura y administración avanzada de almacenamiento, consulta la Guía Completa para Operadores de Nodos Guardianes en la documentación técnica.

Reconocimiento y Directorio Comunitario de Custodios

La participación en el enjambre de MxOS es voluntaria, descentralizada y respetuosa de la privacidad por diseño. No existe registro forzoso, telemetría intrusiva ni recopilación obligatoria de datos.

Custodia Anónima: Participación Plena y Soberana

En la Red de Espejos Comunitarios de Fundación MxOS, la custodia anónima es totalmente válida, bienvenida y considerada de primera clase.

Registro Voluntario de tu Nodo a tu Nombre

Si como operador individual, colectivo tecnológico, universidad, centro de cómputo o empresa privada deseas vincular públicamente tu nodo a tu nombre, organización o proyecto, puedes solicitar tu inclusión en el Directorio de Custodios.

Al registrarte, tu nodo aparecerá formalmente en el radar de Vigía con tus datos verificados:

Procedimiento para Registrar tu Nodo

Para añadir tu nodo al archivo vigia/guardianes.json y figurar formalmente con tu identidad en el espejo comunitario, sigue estos pasos:

  1. Obtén el identificador PeerID de tu nodo:

    ipfs id -f="<id>\n"
  2. Asegúrate de estar compartiendo al menos un módulo o el catálogo:

    ipfs pin add /ipns/mirrors.mx-os.mx/fedora/iso
  3. Edita el archivo ``vigia/guardianes.json`` en tu copia del repositorio: Agrega una entrada dentro del objeto "guardianes" utilizando tu PeerID como clave:

    "12D3KooWBVZfAQyPExhScDpiG4Hahh3e6QmwRZRVopib1ThgUo2g": {
      "alias": "renich",
      "nombre": "Rénich Bon Ćirić",
      "organizacion": "EVALinux",
      "ubicacion": "Ixtlahuacán de los Membrillos, Jalisco, México",
      "sitio": "https://evalinux.com",
      "contacto": "renich@evalinux.com",
      "rol": "guardian",
      "insignia": "🛡️ Guardián Pionero",
      "verificacion": "gitlab"
    }
  4. Reglas para el registro:

    • Utiliza el nombre completo del estado, por ejemplo Jalisco o Querétaro, nunca abreviado.
    • Evita espacios alrededor de diagonales; utiliza redacción directa con comas o conjunciones.
    • Proporciona un enlace HTTPS funcional en el campo sitio.
  5. Envía tu solicitud: Crea una rama con tu cambio y abre un Merge Request en nuestro repositorio de Git (git.mx-os.mx/MxOS/mirrors o gitlab.com/mxos/mirrors). Una vez aprobado, tu nodo aparecerá automáticamente vinculado en vigia.mx-os.mx y en el espejo comunitario.

Arquitectura y Seguridad Criptográfica

La seguridad y confiabilidad en la red de espejos descansa en tres barreras independientes e infranqueables:

  1. Integridad de bloques por direccionamiento: Cada archivo, paquete RPM y metadato se divide en bloques criptográficos referenciados por su identificador de contenido CID. La naturaleza inmutable de IPFS garantiza que ningún bit pueda alterarse en tránsito; si un bloque difiere de su hash, el cliente lo descarta automáticamente.
  2. Firmas GPG oficiales del proyecto upstream: El gestor DNF valida cada RPM contra la llave pública oficial de Fedora o CentOS Stream, ubicada en /etc/pki/rpm-gpg/. Ni los operadores de nodos ni atacantes intermedios pueden inyectar código no firmado o adulterado.
  3. Identidad soberana Ed25519 en IPNS: El catálogo maestro se firma con la llave criptográfica dedicada mxos-mirrors, identificador k51qzi5uqu5di6ed3qtnwrdlvpmfil07ib6qfzb1t259nux49jenn8my4dtg0v, permitiendo la verificación independiente de DNS mediante la ruta /ipns/k51qzi5uqu5di6ed3qtnwrdlvpmfil07ib6qfzb1t259nux49jenn8my4dtg0v.
  4. Puntero canónico con DNSLink: Para evitar lidiar con hashes cambiantes en cada sincronización, el dominio mirrors.mx-os.mx cuenta con registros TXT DNSLink bajo el subdominio _dnslink.mirrors.mx-os.mx que apuntan al CID raíz más reciente con una propagación controlada de 300 segundos.

Herramientas y Automatización en este Repositorio

Todas las herramientas operativas y plantillas de configuración residen encapsuladas en el directorio nodo/:

Herramientas de sincronización y mantenimiento: nodo/bin/

Configuraciones de servicios: nodo/config/

Documentación Técnica Detallada

Para profundizar en las especificaciones arquitectónicas y manuales de procedimiento, consulta el directorio docs/:

Canales de Comunidad y Contacto

Licenciamiento

Este proyecto opera bajo un modelo de licenciamiento libre y comunitario: