=========================================================
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``.

.. _Fundación MxOS: https://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:

* La ingesta inicial y el almacenamiento de paquetes residen en estaciones de trabajo y nodos comunitarios locales.
* El gateway público oficial reside en HOBOPS.IO bajo el dominio ``ipfs.mx-os.mx``, accesible también mediante ``gateway.ipfs.mx-os.mx``; opera estrictamente como un punto de acceso efímero y proxy inverso sin almacenamiento permanente ni pineo.
* Convocamos a la comunidad técnica a probar las descargas, reportar anomalías y sumarse como nodos guardianes pioneros para evaluar el rendimiento real de Bitswap en conexiones residenciales y académicas.

Arquitectura y Principios de Operación
======================================
El sistema opera sobre cinco pilares técnicos:

1. **Direccionamiento por contenido inmutable:** Cada archivo, paquete RPM y metadato se divide en bloques criptográficos referenciados por su identificador de contenido (CID). Si dos versiones comparten paquetes idénticos, estos se deduplican en el almacenamiento global.
2. **Distribución entre pares con Bitswap:** Al solicitar un paquete, el demonio Kubo lo descarga simultáneamente de todos los nodos guardianes disponibles que lo posean en la red local o internet (puerto 4001 TCP/UDP).
3. **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 (``_dnslink.mirrors.mx-os.mx``) que apuntan al CID raíz más reciente con una propagación de 300 segundos.
4. **Puente HTTP para compatibilidad universal:** Quienes no cuenten con un nodo IPFS pueden consumir el espejo directamente a través de HTTP/HTTPS mediante el terminador web que reenvía peticiones hacia el enjambre.
5. **Observabilidad y telemetría comunitaria con Vigía:** Monitoreo descentralizado en tiempo real (`mirrors.mx-os.mx/vigia/`_) que audita la disponibilidad de cada módulo, la latencia y la distribución territorial de los nodos guardianes sin recolectar telemetría privada de los usuarios.

Vigía: Observabilidad y Cartografía 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**:

* **Acceso web interactivo:** `mirrors.mx-os.mx/vigia/`_
* **Instantánea de telemetría JSON:** `https://mirrors.mx-os.mx/vigia/telemetry.json <https://mirrors.mx-os.mx/vigia/telemetry.json>`_
* **Cartografía soberana:** Muestra el número de guardianes por módulo (BaseOS, AppStream, Everything, ISOs), ubicación geográfica aproximada y organizaciones de red.
* **Directorio de Custodios:** Registro abierto donde los operadores de nodos guardianes pueden voluntariamente vincular su identificador de par (PeerID) con su alias, organización o perfil comunitario para recibir reconocimiento público en el enjambre.

.. _mirrors.mx-os.mx/vigia/: https://mirrors.mx-os.mx/vigia/

Inicio Rápido de Colaboración: Enclavillado de Repositorios
============================================================
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 (pineo)** 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).

En cuatro pasos directos puedes 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:

.. code-block:: bash

   # 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 no privilegiado (rootless):

.. code-block:: bash

   # 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:

.. code-block:: bash

   # Abrir puerto de enjambre libp2p (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: Elige y enclavilla tus módulos
--------------------------------------
No necesitas descargar los cientos de gigabytes del catálogo completo. Selecciona el módulo que mejor se adapte a tu cuota de almacenamiento en disco:

.. list-table::
   :header-rows: 1
   :widths: 28 42 15 15

   * - Módulo
     - Comando de Enclavillado
     - Tamaño en Red
     - Estimado Final
   * - **Imágenes ISO (Fedora 43)**
     - ``ipfs pin add /ipns/mirrors.mx-os.mx/fedora/iso``
     - 1.2G
     - ~3.5 GB
   * - **Sistema Base (CentOS Stream 10 BaseOS)**
     - ``ipfs pin add /ipns/mirrors.mx-os.mx/centos-stream/10-stream/BaseOS``
     - 7.0G
     - ~15 GB
   * - **Aplicaciones (CentOS Stream 10 AppStream)**
     - ``ipfs pin add /ipns/mirrors.mx-os.mx/centos-stream/10-stream/AppStream``
     - 29G
     - ~45 GB
   * - **Paquetería Completa (Fedora 43 Everything)**
     - ``ipfs pin add /ipns/mirrors.mx-os.mx/fedora/releases/43/Everything``
     - 56G
     - ~110 GB
   * - **Espejo Maestro Completo (Todas las ramas)**
     - ``ipfs pin add /ipns/mirrors.mx-os.mx``
     - 93G
     - ~300 GB

Para consultar procedimientos de dimensionamiento, políticas de recolección de basura (GC) y administración avanzada de almacenamiento, consulta la `Guía Completa para Operadores de Nodos Guardianes`_ en la documentación del repositorio.

.. _Guía Completa para Operadores de Nodos Guardianes: docs/guides/operador-nodo.rst

Consumo del Espejo desde Clientes DNF
=====================================
Si además de enclavillar 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:

.. code-block:: ini

   [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``:

.. code-block:: ini

   [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

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:

.. code-block:: ini

   [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

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:

.. code-block:: text

   mirrors.mx-os.mx/
   ├── README.rst                     <- Documento de bienvenida e instrucciones
   ├── README.html                    <- Portal web estilizado con selector de temas
   ├── guardianes.json                <- Directorio comunitario de nodos custodios verificados
   ├── vigia/                         <- Tablero de telemetría y cartografía P2P
   │   ├── index.html                 <- Aplicación web autocontenida
   │   └── telemetry.json             <- Instantánea JSON de nodos guardianes
   ├── 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

Identificación y Reconocimiento de Nodos Guardianes
===================================================
La participación en el enjambre es voluntaria, descentralizada y respetuosa de la privacidad por diseño. No existe registro forzoso ni telemetría invasiva:

1. **Identidad criptográfica nativa (PeerID):** Todo nodo que ejecuta Kubo cuenta con un identificador único e infalsificable derivado de su par de llaves Ed25519 (por ejemplo, ``12D3KooWBVZfAQ...``). Al compartir bloques en la DHT, el nodo se anuncia públicamente con este hash.
2. **Reconocimiento territorial pasivo con GeoIP y ASN:** Vigía inspecciona la dirección IP pública del nodo contra la base de datos MaxMind GeoLite2 ASN, atribuyendo automáticamente la organización de la red o proveedor institucional; por ejemplo, redes universitarias, HOBOPS.IO para gateways o proveedores residenciales.
3. **Registro voluntario en el Directorio de Custodios:** Quienes deseen asociar su nodo con su identidad pública, alias, institución o sitio web pueden solicitar su inclusión en ``guardianes.json`` mediante un Merge Request al repositorio de Git:
   * **Alias o distintivo:** Ejemplo: ``@tu_usuario`` o ``udg-sistemas``.
   * **Nombre completo o entidad:** Nombre formal del custodio o institución.
   * **Organización:** Colectivo, empresa o universidad; por ejemplo, ``EVALinux`` o ``Fundación MxOS``.
   * **Ubicación:** Ciudad, estado y país en texto canónico; por ejemplo, ``Ixtlahuacán de los Membrillos, Jalisco, México``; sin abreviaturas.
   * **Sitio web:** Dominio o portal verificado; por ejemplo, ``https://evalinux.com`` o ``https://ipfs.mx-os.mx``.
   * **Insignia honorífica:** Distintivo en el tablero de Vigía; por ejemplo, Guardián Pionero, Espejo Académico o Gateway Oficial.

Procedimiento para Registrarte en el Directorio
-----------------------------------------------
Para añadir tu nodo al archivo ``guardianes.json`` y aparecer formalmente en el radar de Vigía, sigue estos pasos:

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

   .. code-block:: bash

      ipfs id -f="<id>\n"

2. **Asegúrate de estar compartiendo al menos un módulo o el catálogo:**

   .. code-block:: bash

      ipfs pin add /ipns/mirrors.mx-os.mx/fedora/iso

3. **Edita el archivo ``guardianes.json`` en tu copia del repositorio:**
   Agrega una entrada dentro del objeto ``"guardianes"`` utilizando tu PeerID como clave:

   .. code-block:: json

      "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.

Seguridad e Integridad Criptográfica
====================================
La seguridad en la red de espejos descansa en dos barreras independientes e infranqueables:

1. **Integridad de bloques:** La naturaleza direccionada por contenido 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:** El gestor DNF valida cada RPM contra la llave pública oficial del proyecto correspondiente (ubicada en ``/etc/pki/rpm-gpg/``). Ni los operadores de nodos ni atacantes intermedios pueden inyectar código no firmado.
3. **Identidad soberana Ed25519 (IPNS):** El catálogo se firma con la llave criptográfica dedicada ``mxos-mirrors`` (``k51qzi5uqu5di6ed3qtnwrdlvpmfil07ib6qfzb1t259nux49jenn8my4dtg0v``), permitiendo la verificación independiente de DNS mediante la ruta ``/ipns/k51qzi5uqu5di6ed3qtnwrdlvpmfil07ib6qfzb1t259nux49jenn8my4dtg0v``.

Herramientas y Automatización en este Repositorio
=================================================
Este repositorio contiene los scripts de gestión y automatización de la infraestructura:

* `bin/mxos-mirror-sync.bash`_: Sincronización diferencial upstream mediante rsync preservando metadatos.
* `bin/mxos-mirror-ingest.bash`_: Ingesta UnixFS en Kubo con soporte de filestore (``--nocopy``).
* `bin/mxos-ipns-publish.bash`_: Firma y publicación en IPNS con la llave Ed25519 del proyecto.
* `bin/mxos-key-backup.bash`_: Exportación, respaldo cifrado (age/gpg) y restauración de la llave Ed25519.
* `bin/mxos-dnslink-update.bash`_: Actualización desatendida del registro DNSLink en Cloudflare mediante API REST.
* `bin/mxos-mirror.bash`_: Orquestador integral del ciclo completo (sincronizar, ingerir, firmar y publicar).
* `vigia/`_: Colector de telemetría P2P en Crystal y tablero web de observabilidad (`repositorio en git.mx-os.mx`_).
* `etc/caddy/Caddyfile`_: Plantilla de proxy inverso para Caddy.
* `etc/nginx/mirrors.mx-os.mx.conf`_: Plantilla de configuración para Nginx.
* `systemd/`_: Unidades de servicio y temporizadores de systemd para tareas programadas.

.. _bin/mxos-mirror-sync.bash: bin/mxos-mirror-sync.bash
.. _bin/mxos-mirror-ingest.bash: bin/mxos-mirror-ingest.bash
.. _bin/mxos-ipns-publish.bash: bin/mxos-ipns-publish.bash
.. _bin/mxos-key-backup.bash: bin/mxos-key-backup.bash
.. _bin/mxos-dnslink-update.bash: bin/mxos-dnslink-update.bash
.. _bin/mxos-mirror.bash: bin/mxos-mirror.bash
.. _vigia/: vigia/
.. _vigia.mx-os.mx: https://mirrors.mx-os.mx/vigia/
.. _repositorio en git.mx-os.mx: https://git.mx-os.mx/MxOS/vigia
.. _git.mx-os.mx/MxOS/mirrors: https://git.mx-os.mx/MxOS/mirrors
.. _gitlab.com/mxos/mirrors: https://gitlab.com/mxos/mirrors
.. _etc/caddy/Caddyfile: etc/caddy/Caddyfile
.. _etc/nginx/mirrors.mx-os.mx.conf: etc/nginx/mirrors.mx-os.mx.conf
.. _systemd/: systemd/

Documentación Técnica Detallada
===============================
Para profundizar en las especificaciones y manuales, consulta el directorio `docs/`_:

* `docs/index.rst`_: Índice general de la documentación.
* `docs/business/spec.rst`_: Modelo estratégico, justificación e incentivos comunitarios.
* `docs/functional/spec.rst`_: Especificación de catálogo modular, pineo y telemetría pasiva.
* `docs/technical/spec.rst`_: Arquitectura de red, resolución DNSLink y puente MirrorManager.
* `docs/guides/index.rst`_: Manuales paso a paso para operadores, clientes y replicación autónoma.
* `docs/project/roadmap.rst`_: Fases de ejecución y seguimiento del proyecto.

.. _docs/: docs/
.. _docs/index.rst: docs/index.rst
.. _docs/business/spec.rst: docs/business/spec.rst
.. _docs/functional/spec.rst: docs/functional/spec.rst
.. _docs/technical/spec.rst: docs/technical/spec.rst
.. _docs/guides/index.rst: docs/guides/index.rst
.. _docs/project/roadmap.rst: docs/project/roadmap.rst

Canales de Comunidad y Contacto
===============================
* **Canal oficial de Telegram:** `@mx_os_mx`_
* **Sitio web:** `mx-os.mx`_
* **Repositorios de código:** `git.mx-os.mx`_

.. _@mx_os_mx: https://t.me/mx_os_mx
.. _mx-os.mx: https://mx-os.mx
.. _git.mx-os.mx: https://git.mx-os.mx

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

* **Documentación y especificaciones:** Licenciadas bajo `GNU Free Documentation License v1.3 o posterior`_ (GNU FDL v1.3+) sin secciones invariantes, sin textos de portada y sin textos de contraportada, en modelo dual con `Creative Commons Atribución-CompartirIgual 4.0 Internacional`_ (CC-BY-SA-4.0).
* **Herramientas, scripts y configuraciones:** Licenciadas bajo la `Licencia Pública General de GNU v3.0 o posterior`_ (GNU GPLv3+).

.. _GNU Free Documentation License v1.3 o posterior: https://www.gnu.org/licenses/fdl-1.3.html
.. _Creative Commons Atribución-CompartirIgual 4.0 Internacional: https://creativecommons.org/licenses/by-sa/4.0/
.. _Licencia Pública General de GNU v3.0 o posterior: https://www.gnu.org/licenses/gpl-3.0.html
