Watch
1
0
Fork
You've already forked mirrors
0
forked from MxOS/mirrors

feat(dnslink): support multi-domain DNSLink updates and document trailing dot FQDN

This commit is contained in:
Rénich Bon Ćirić 2026-10-09 03:55:06 -06:00
commit cb4f946f13
Signed by: renich
GPG key ID: AB2A9F49384FE324
17 changed files with 82 additions and 16 deletions

View file

@ -1,6 +1,6 @@
========================================================= ========================================================
Red de Espejos Comunitarios de Software Libre sobre IPFS 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``. 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``.
@ -40,6 +40,7 @@ La salud, redundancia territorial y disponibilidad de los repositorios no es una
* **Filtrado reactivo por módulos:** Pulsar sobre cualquier etiqueta de módulo en la tabla filtra los custodios en tiempo real, activa un indicador destacado en la cabecera y muestra una barra de filtrado con botón de limpieza inmediata. * **Filtrado reactivo por módulos:** Pulsar sobre cualquier etiqueta de módulo en la tabla filtra los custodios en tiempo real, activa un indicador destacado en la cabecera y muestra una barra de filtrado con botón de limpieza inmediata.
* **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. * **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.
* **Interfaces de integración y telemetría:** * **Interfaces de integración y telemetría:**
* Instantánea estática en el catálogo: `https://mirrors.mx-os.mx/vigia/telemetry.json <https://mirrors.mx-os.mx/vigia/telemetry.json>`_ * Instantánea estática en el catálogo: `https://mirrors.mx-os.mx/vigia/telemetry.json <https://mirrors.mx-os.mx/vigia/telemetry.json>`_
* API REST en tiempo real del demonio Vigía: ``/api/v1/telemetry`` * API REST en tiempo real del demonio Vigía: ``/api/v1/telemetry``
* Exportador de métricas en formato estándar de Prometheus: ``/metrics`` * Exportador de métricas en formato estándar de Prometheus: ``/metrics``
@ -47,7 +48,7 @@ La salud, redundancia territorial y disponibilidad de los repositorios no es una
.. _mirrors.mx-os.mx/vigia/: https://mirrors.mx-os.mx/vigia/ .. _mirrors.mx-os.mx/vigia/: https://mirrors.mx-os.mx/vigia/
Inicio Rápido de Colaboración: Enclavillado de Repositorios 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). 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 cinco pasos directos puedes configurar tu equipo como nodo guardián: En cinco pasos directos puedes configurar tu equipo como nodo guardián:
@ -75,7 +76,7 @@ Se recomienda operar Kubo en modo de usuario no privilegiado (rootless):
systemctl --user enable --now ipfs.service systemctl --user enable --now ipfs.service
Paso 3: Apertura de puerto del enjambre libp2p Paso 3: Apertura de puerto del enjambre libp2p
----------------------------------------------- ----------------------------------------------
Para permitir que otros nodos descarguen bloques desde tu equipo, abre el puerto 4001: Para permitir que otros nodos descarguen bloques desde tu equipo, abre el puerto 4001:
.. code-block:: bash .. code-block:: bash
@ -137,7 +138,7 @@ 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: 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 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. 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 Para Fedora 43, 44, 45 o Rawhide
@ -229,6 +230,7 @@ La participación en el enjambre es voluntaria, descentralizada y respetuosa de
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. 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. 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: 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``. * **Alias o distintivo:** Ejemplo: ``@tu_usuario`` o ``udg-sistemas``.
* **Nombre completo o entidad:** Nombre formal del custodio o institución. * **Nombre completo o entidad:** Nombre formal del custodio o institución.
* **Organización:** Colectivo, empresa o universidad; por ejemplo, ``EVALinux`` o ``HOBOPS.IO``; se muestra bajo la columna Afiliación en el tablero. * **Organización:** Colectivo, empresa o universidad; por ejemplo, ``EVALinux`` o ``HOBOPS.IO``; se muestra bajo la columna Afiliación en el tablero.
@ -270,6 +272,7 @@ Para añadir tu nodo al archivo ``guardianes.json`` y aparecer formalmente en el
} }
4. **Reglas para el registro:** 4. **Reglas para el registro:**
* Utiliza el nombre completo del estado (por ejemplo, ``Jalisco`` o ``Querétaro``; nunca abreviado). * 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. * Evita espacios alrededor de diagonales; utiliza redacción directa con comas o conjunciones.
* Proporciona un enlace HTTPS funcional en el campo ``sitio``. * Proporciona un enlace HTTPS funcional en el campo ``sitio``.
@ -340,6 +343,7 @@ Para profundizar en las especificaciones y manuales, consulta el directorio `doc
Canales de Comunidad y Contacto Canales de Comunidad y Contacto
=============================== ===============================
* **Canal oficial de Telegram:** `@mx_os_mx`_ * **Canal oficial de Telegram:** `@mx_os_mx`_
* **Sitio web:** `mx-os.mx`_ * **Sitio web:** `mx-os.mx`_
* **Repositorios de código:** `git.mx-os.mx`_ * **Repositorios de código:** `git.mx-os.mx`_

View file

@ -12,7 +12,8 @@ if [[ -f "${REPO_ROOT}/etc/mirrors.env" ]]; then
fi fi
CF_ZONE_ID="${CF_ZONE_ID:-2bd35b00a854bc77cfd38009f977ea3c}" CF_ZONE_ID="${CF_ZONE_ID:-2bd35b00a854bc77cfd38009f977ea3c}"
MIRRORS_DNSLINK_RECORD="${MIRRORS_DNSLINK_RECORD:-_dnslink.mirrors.mx-os.mx}" MIRRORS_DNSLINK_RECORDS="${MIRRORS_DNSLINK_RECORDS:-_dnslink.mirrors.mx-os.mx _dnslink.ipfs.mx-os.mx _dnslink.gateway.mx-os.mx}"
MIRRORS_DNSLINK_RECORD="${MIRRORS_DNSLINK_RECORD:-}"
resolve_cf_token() { resolve_cf_token() {
if [[ -n "${CF_API_TOKEN:-}" ]]; then if [[ -n "${CF_API_TOKEN:-}" ]]; then
@ -105,7 +106,16 @@ main() {
local token local token
token="$(resolve_cf_token)" token="$(resolve_cf_token)"
update_or_create_dnslink "${token}" "${MIRRORS_DNSLINK_RECORD}" "${target_cid}" local records_to_update=()
if [[ -n "${MIRRORS_DNSLINK_RECORD}" ]]; then
records_to_update+=("${MIRRORS_DNSLINK_RECORD}")
else
IFS=' ' read -r -a records_to_update <<< "${MIRRORS_DNSLINK_RECORDS}"
fi
for rec in "${records_to_update[@]}"; do
update_or_create_dnslink "${token}" "${rec}" "${target_cid}"
done
echo "==> Verificando resolución DNSLink canónica..." echo "==> Verificando resolución DNSLink canónica..."
if command -v ipfs >/dev/null 2>&1; then if command -v ipfs >/dev/null 2>&1; then

View file

@ -12,16 +12,19 @@ Para reconocer el esfuerzo de quienes donan almacenamiento, electricidad y ancho
Salón de Guardianes del Espejo Salón de Guardianes del Espejo
------------------------------ ------------------------------
* **Reconocimiento público opcional:** Los operadores de nodos que decidan asociar voluntariamente su identificador de nodo (PeerID) con su perfil de la comunidad o GitLab aparecerán en el tablero de honor de ``mirrors.mx-os.mx``. * **Reconocimiento público opcional:** Los operadores de nodos que decidan asociar voluntariamente su identificador de nodo (PeerID) con su perfil de la comunidad o GitLab aparecerán en el tablero de honor de ``mirrors.mx-os.mx``.
* **Insignias y trazabilidad:** Distinciones honoríficas basadas en la constancia del nodo en el enjambre y el nivel de repositorios respaldados. * **Insignias y trazabilidad:** Distinciones honoríficas basadas en la constancia del nodo en el enjambre y el nivel de repositorios respaldados.
Servicios de Red Comunitaria Servicios de Red Comunitaria
---------------------------- ----------------------------
* **Subdominios comunitarios:** Operadores con nodos activos y verificados podrán solicitar subdominios personalizados bajo ``*.mx-os.mx`` para sus proyectos personales de software libre. * **Subdominios comunitarios:** Operadores con nodos activos y verificados podrán solicitar subdominios personalizados bajo ``*.mx-os.mx`` para sus proyectos personales de software libre.
* **Prioridad de enrutamiento:** Listado público de pares recomendados para conexión directa (peering estático) entre nodos de MxOS dentro de puntos de intercambio de tráfico de internet (IXP) en México. * **Prioridad de enrutamiento:** Listado público de pares recomendados para conexión directa (peering estático) entre nodos de MxOS dentro de puntos de intercambio de tráfico de internet (IXP) en México.
Garantías de Privacidad Garantías de Privacidad
======================= =======================
* El enjambre utiliza los mecanismos criptográficos nativos de libp2p y la tabla hash distribuida (DHT). * El enjambre utiliza los mecanismos criptográficos nativos de libp2p y la tabla hash distribuida (DHT).
* La presencia del nodo se verifica mediante el anuncio público de bloques provistos (find providers). * La presencia del nodo se verifica mediante el anuncio público de bloques provistos (find providers).
* No se recopilan historiales de navegación, patrones de paquetes instalados por clientes individuales ni datos de hardware del usuario. * No se recopilan historiales de navegación, patrones de paquetes instalados por clientes individuales ni datos de hardware del usuario.

View file

@ -35,6 +35,7 @@ El árbol servido bajo ``/ipns/mirrors.mx-os.mx`` debe dividirse en ramas bien d
Criterios de Aceptación Criterios de Aceptación
======================= =======================
1. La estructura de directorios debe respetar estrictamente los nombres esperados por las variables ``$releasever`` y ``$basearch`` de DNF. 1. La estructura de directorios debe respetar estrictamente los nombres esperados por las variables ``$releasever`` y ``$basearch`` de DNF.
2. Los metadatos de repositorio (ejemplo: ``repodata/repomd.xml``) deben ser idénticos a los publicados por los servidores primarios upstream para garantizar la verificación de firmas criptográficas. 2. Los metadatos de repositorio (ejemplo: ``repodata/repomd.xml``) deben ser idénticos a los publicados por los servidores primarios upstream para garantizar la verificación de firmas criptográficas.
3. La sincronización upstream debe preservar atributos de tiempo y enlaces relativos para asegurar la validez de los paquetes. 3. La sincronización upstream debe preservar atributos de tiempo y enlaces relativos para asegurar la validez de los paquetes.

View file

@ -29,6 +29,7 @@ El sistema clasifica el contenido en cuatro niveles de compromiso de almacenamie
Comportamiento de Resolución Comportamiento de Resolución
============================ ============================
1. Cuando un colaborador solicita pinear una subruta (ejemplo: ``/ipns/mirrors.mx-os.mx/fedora/iso``), el demonio de IPFS debe resolver el CID específico de esa carpeta en el grafo UnixFS y aplicar el pin recursivo exclusivamente a dicho subnodo. 1. Cuando un colaborador solicita pinear una subruta (ejemplo: ``/ipns/mirrors.mx-os.mx/fedora/iso``), el demonio de IPFS debe resolver el CID específico de esa carpeta en el grafo UnixFS y aplicar el pin recursivo exclusivamente a dicho subnodo.
2. Los bloques ajenos a la subruta seleccionada no deben ser transferidos ni almacenados en el nodo local. 2. Los bloques ajenos a la subruta seleccionada no deben ser transferidos ni almacenados en el nodo local.
3. El proceso de sincronización debe reemplazar los pines anteriores cuando el CID de la subruta cambie, liberando espacio mediante recolección de basura si el usuario lo configura. 3. El proceso de sincronización debe reemplazar los pines anteriores cuando el CID de la subruta cambie, liberando espacio mediante recolección de basura si el usuario lo configura.

View file

@ -13,17 +13,23 @@ Requisitos del Tablero
* **Descubrimiento descentralizado:** Las métricas de pares se obtienen consultando la tabla hash distribuida (DHT) de IPFS para los CIDs activos del catálogo, sin requerir que los nodos instalen software cliente adicional ni transmitan telemetría privada. * **Descubrimiento descentralizado:** Las métricas de pares se obtienen consultando la tabla hash distribuida (DHT) de IPFS para los CIDs activos del catálogo, sin requerir que los nodos instalen software cliente adicional ni transmitan telemetría privada.
* **Directorio estructurado de custodios:** * **Directorio estructurado de custodios:**
* Visualización tabular de custodios y nodos participantes. * Visualización tabular de custodios y nodos participantes.
* Columnas canónicas normalizadas: ``Rol``, ``Custodio``, ``Módulos custodiados``, ``Ubicación territorial`` y ``Afiliación``. * Columnas canónicas normalizadas: ``Rol``, ``Custodio``, ``Módulos custodiados``, ``Ubicación territorial`` y ``Afiliación``.
* Distintivos honoríficos en una sola línea protegida (por ejemplo, ``⭐ Gateway Oficial`` o ``🛡️ Guardián Pionero``). * Distintivos honoríficos en una sola línea protegida (por ejemplo, ``⭐ Gateway Oficial`` o ``🛡️ Guardián Pionero``).
* **Interacción y ergonomía:** * **Interacción y ergonomía:**
* Copiado de identidad criptográfica (Peer ID / DI) con un clic al portapapeles y confirmación táctil visual (``✓ ¡Copiado!``). * Copiado de identidad criptográfica (Peer ID / DI) con un clic al portapapeles y confirmación táctil visual (``✓ ¡Copiado!``).
* Filtrado reactivo por etiquetas de módulos en tiempo real con barra de estado y botón de restablecimiento (``✕``). * Filtrado reactivo por etiquetas de módulos en tiempo real con barra de estado y botón de restablecimiento (``✕``).
* **Métricas y observabilidad expuesta:** * **Métricas y observabilidad expuesta:**
* Número total de nodos proveedores activos en el enjambre. * Número total de nodos proveedores activos en el enjambre.
* Módulos soportados (Fedora ISOs, Fedora Everything, CentOS Stream BaseOS y AppStream). * Módulos soportados (Fedora ISOs, Fedora Everything, CentOS Stream BaseOS y AppStream).
* Estado operativo del gateway público en HOBOPS.IO. * Estado operativo del gateway público en HOBOPS.IO.
* Identificador de contenido (CID) raíz activo en el espejo. * Identificador de contenido (CID) raíz activo en el espejo.
* API REST en vivo bajo ``/api/v1/telemetry``. * API REST en vivo bajo ``/api/v1/telemetry``.
* Exportador de métricas en formato Prometheus bajo ``/metrics``. * Exportador de métricas en formato Prometheus bajo ``/metrics``.
* **Transparencia y código abierto:** El código fuente completo reside en el repositorio canónico `https://git.mx-os.mx/MxOS/vigia <https://git.mx-os.mx/MxOS/vigia>`_. * **Transparencia y código abierto:** El código fuente completo reside en el repositorio canónico `https://git.mx-os.mx/MxOS/vigia <https://git.mx-os.mx/MxOS/vigia>`_.

View file

@ -8,6 +8,7 @@ Este manual detalla cómo configurar el gestor de paquetes DNF en cualquier esta
Ventajas Ventajas
======== ========
* **Velocidad máxima:** Los paquetes que tú o tus vecinos de red local hayan pineado se descargan a la velocidad máxima de la interfaz local sin saturar tu conexión hacia internet. * **Velocidad máxima:** Los paquetes que tú o tus vecinos de red local hayan pineado se descargan a la velocidad máxima de la interfaz local sin saturar tu conexión hacia internet.
* **Seguridad criptográfica íntegra:** Las firmas GPG oficiales de Fedora y CentOS Stream siguen siendo verificadas por DNF contra las llaves oficiales instaladas en ``/etc/pki/rpm-gpg/``. * **Seguridad criptográfica íntegra:** Las firmas GPG oficiales de Fedora y CentOS Stream siguen siendo verificadas por DNF contra las llaves oficiales instaladas en ``/etc/pki/rpm-gpg/``.
@ -68,7 +69,7 @@ Limpia la caché de metadatos de DNF y verifica la comunicación con el gateway
sudo dnf check-update --disablerepo="*" --enablerepo="*-mxos-ipfs" sudo dnf check-update --disablerepo="*" --enablerepo="*-mxos-ipfs"
Configuración Soberana sin Dependencia de DNS en Modo Desconectado o Air-gapped Configuración Soberana sin Dependencia de DNS en Modo Desconectado o Air-gapped
============================================================================== ===============================================================================
En entornos donde no se disponga de resolución DNS o se requiera validación puramente criptográfica sin intermediación de Cloudflare, se puede configurar ``baseurl`` apuntando directamente al identificador de la llave Ed25519 ``mxos-mirrors``: En entornos donde no se disponga de resolución DNS o se requiera validación puramente criptográfica sin intermediación de Cloudflare, se puede configurar ``baseurl`` apuntando directamente al identificador de la llave Ed25519 ``mxos-mirrors``:
.. code-block:: ini .. code-block:: ini

View file

@ -8,6 +8,7 @@ Este manual explica cómo configurar un nodo local de IPFS en Fedora o CentOS St
Requisitos Previos Requisitos Previos
================== ==================
* Fedora 43, 44, 45, Rawhide o CentOS Stream 10. * Fedora 43, 44, 45, Rawhide o CentOS Stream 10.
* Acceso a privilegios administrativos mediante ``sudo``. * Acceso a privilegios administrativos mediante ``sudo``.
* Espacio en disco libre según el nivel de almacenamiento elegido (desde 10 GB en adelante). * Espacio en disco libre según el nivel de almacenamiento elegido (desde 10 GB en adelante).
@ -145,6 +146,7 @@ Para formalizar tu registro:
} }
3. **Reglas de formato obligatorias:** 3. **Reglas de formato obligatorias:**
* Escribe el nombre completo de los estados sin abreviaturas; por ejemplo, ``Jalisco`` o ``Querétaro``; nunca abreviado. * Escribe el nombre completo de los estados sin abreviaturas; por ejemplo, ``Jalisco`` o ``Querétaro``; nunca abreviado.
* No utilices espacios alrededor de diagonales; utiliza redacción directa con comas o conjunciones. * No utilices espacios alrededor de diagonales; utiliza redacción directa con comas o conjunciones.
* Proporciona un enlace HTTPS funcional en el campo ``sitio``. * Proporciona un enlace HTTPS funcional en el campo ``sitio``.

View file

@ -16,12 +16,17 @@ Hito 1.1: Aprovisionamiento del Nodo Cabecera de MxOS
Poner en marcha el entorno de almacenamiento y el demonio Kubo en la infraestructura de servidores de la Fundación MxOS. Poner en marcha el entorno de almacenamiento y el demonio Kubo en la infraestructura de servidores de la Fundación MxOS.
* **Tarea 1.1.1 [TECH-001]:** Configurar el directorio de staging en el servidor y habilitar la extensión filestore en Kubo. * **Tarea 1.1.1 [TECH-001]:** Configurar el directorio de staging en el servidor y habilitar la extensión filestore en Kubo.
* *Bloqueado por:* Ninguno. * *Bloqueado por:* Ninguno.
* *Desbloquea:* Tarea 1.1.2. * *Desbloquea:* Tarea 1.1.2.
* **Tarea 1.1.2 [TECH-001]:** Ejecutar la sincronización rsync inicial de imágenes ISO de Fedora y el repositorio BaseOS de CentOS Stream 10. * **Tarea 1.1.2 [TECH-001]:** Ejecutar la sincronización rsync inicial de imágenes ISO de Fedora y el repositorio BaseOS de CentOS Stream 10.
* *Bloqueado por:* Tarea 1.1.1. * *Bloqueado por:* Tarea 1.1.1.
* *Desbloquea:* Tarea 1.1.3. * *Desbloquea:* Tarea 1.1.3.
* **Tarea 1.1.3 [TECH-001]:** Realizar la ingesta por referencia con ``ipfs add -r --nocopy`` y verificar la integridad de los CIDs generados. * **Tarea 1.1.3 [TECH-001]:** Realizar la ingesta por referencia con ``ipfs add -r --nocopy`` y verificar la integridad de los CIDs generados.
* *Bloqueado por:* Tarea 1.1.2. * *Bloqueado por:* Tarea 1.1.2.
* *Desbloquea:* Tarea 1.2.1. * *Desbloquea:* Tarea 1.2.1.
@ -30,9 +35,12 @@ Hito 1.2: Configuración de DNSLink y Validación de Subrutas
Establecer la delegación DNS inmutable y verificar la granularidad del enjambre. Establecer la delegación DNS inmutable y verificar la granularidad del enjambre.
* **Tarea 1.2.1 [TECH-003]:** Crear el registro TXT ``_dnslink.mirrors.mx-os.mx`` con el CID raíz de la ingesta. * **Tarea 1.2.1 [TECH-003]:** Crear el registro TXT ``_dnslink.mirrors.mx-os.mx`` con el CID raíz de la ingesta.
* *Bloqueado por:* Tarea 1.1.3. * *Bloqueado por:* Tarea 1.1.3.
* *Desbloquea:* Tarea 1.2.2. * *Desbloquea:* Tarea 1.2.2.
* **Tarea 1.2.2 [TECH-002]:** Validar la resolución y pineo recursivo exclusivo de subrutas (ejemplo: ``/ipns/mirrors.mx-os.mx/centos-stream/10-stream/BaseOS``) desde un nodo cliente externo. * **Tarea 1.2.2 [TECH-002]:** Validar la resolución y pineo recursivo exclusivo de subrutas (ejemplo: ``/ipns/mirrors.mx-os.mx/centos-stream/10-stream/BaseOS``) desde un nodo cliente externo.
* *Bloqueado por:* Tarea 1.2.1. * *Bloqueado por:* Tarea 1.2.1.
* *Desbloquea:* Hito 1.3. * *Desbloquea:* Hito 1.3.
@ -41,5 +49,6 @@ Hito 1.3: Redacción del Post Inicial en el Sitio de MxOS
Publicar el artículo de presentación en ``mx-os.mx`` y convocar a los primeros operadores guardianes. Publicar el artículo de presentación en ``mx-os.mx`` y convocar a los primeros operadores guardianes.
* **Tarea 1.3.1 [FUNC-003]:** Redactar y publicar el artículo de lanzamiento en la web de MxOS enlazando al manual de operadores. * **Tarea 1.3.1 [FUNC-003]:** Redactar y publicar el artículo de lanzamiento en la web de MxOS enlazando al manual de operadores.
* *Bloqueado por:* Tarea 1.2.2. * *Bloqueado por:* Tarea 1.2.2.
* *Desbloquea:* Fase 2. * *Desbloquea:* Fase 2.

View file

@ -16,9 +16,12 @@ Hito 2.1: Motor de Recolección Descentralizada
Crear el servicio en segundo plano que sondea la DHT para identificar los nodos activos. Crear el servicio en segundo plano que sondea la DHT para identificar los nodos activos.
* **Tarea 2.1.1 [TECH-004]:** Implementar el colector pasivo que consulta periódicamente ``ipfs dht findprovs`` para los CIDs activos del espejo. * **Tarea 2.1.1 [TECH-004]:** Implementar el colector pasivo que consulta periódicamente ``ipfs dht findprovs`` para los CIDs activos del espejo.
* *Bloqueado por:* Fase 1 (Tarea 1.2.2). * *Bloqueado por:* Fase 1 (Tarea 1.2.2).
* *Desbloquea:* Tarea 2.1.2. * *Desbloquea:* Tarea 2.1.2.
* **Tarea 2.1.2 [TECH-004]:** Integrar la base de datos local MaxMind GeoLite2 para resolver la geolocalización aproximada (país y estado) sin almacenar direcciones IP completas. * **Tarea 2.1.2 [TECH-004]:** Integrar la base de datos local MaxMind GeoLite2 para resolver la geolocalización aproximada (país y estado) sin almacenar direcciones IP completas.
* *Bloqueado por:* Tarea 2.1.1. * *Bloqueado por:* Tarea 2.1.1.
* *Desbloquea:* Hito 2.2. * *Desbloquea:* Hito 2.2.
@ -27,9 +30,12 @@ Hito 2.2: Interfaz Web Pública Reactiva
Construir el portal web ligero de visualización para la comunidad. Construir el portal web ligero de visualización para la comunidad.
* **Tarea 2.2.1 [FUNC-004]:** Diseñar la interfaz con mapa interactivo y contador de nodos activos. * **Tarea 2.2.1 [FUNC-004]:** Diseñar la interfaz con mapa interactivo y contador de nodos activos.
* *Bloqueado por:* Tarea 2.1.2. * *Bloqueado por:* Tarea 2.1.2.
* *Desbloquea:* Tarea 2.2.2. * *Desbloquea:* Tarea 2.2.2.
* **Tarea 2.2.2 [FUNC-004]:** Integrar el tablero en la infraestructura web de MxOS bajo ``mirrors.mx-os.mx``. * **Tarea 2.2.2 [FUNC-004]:** Integrar el tablero en la infraestructura web de MxOS bajo ``mirrors.mx-os.mx``.
* *Bloqueado por:* Tarea 2.2.1. * *Bloqueado por:* Tarea 2.2.1.
* *Desbloquea:* Hito 2.3. * *Desbloquea:* Hito 2.3.
@ -38,5 +44,6 @@ Hito 2.3: Publicación del Repositorio de Código Abierto
Liberar el código del tablero para auditoría comunitaria. Liberar el código del tablero para auditoría comunitaria.
* **Tarea 2.3.1 [FUNC-004]:** Documentar las instrucciones de despliegue y publicar el repositorio bajo licencia libre en el Git de la Fundación MxOS. * **Tarea 2.3.1 [FUNC-004]:** Documentar las instrucciones de despliegue y publicar el repositorio bajo licencia libre en el Git de la Fundación MxOS.
* *Bloqueado por:* Tarea 2.2.2. * *Bloqueado por:* Tarea 2.2.2.
* *Desbloquea:* Fase 3. * *Desbloquea:* Fase 3.

View file

@ -16,12 +16,17 @@ Hito 3.1: Despliegue del Puente Inverso HTTP y Validación MirrorManager
Habilitar la fachada web pública para clientes DNF tradicionales. Habilitar la fachada web pública para clientes DNF tradicionales.
* **Tarea 3.1.1 [TECH-005]:** Configurar el proxy inverso (Caddy/Nginx) en ``mirrors.mx-os.mx`` apuntando al gateway local de Kubo. * **Tarea 3.1.1 [TECH-005]:** Configurar el proxy inverso (Caddy/Nginx) en ``mirrors.mx-os.mx`` apuntando al gateway local de Kubo.
* *Bloqueado por:* Fase 1 (Tarea 1.2.2). * *Bloqueado por:* Fase 1 (Tarea 1.2.2).
* *Desbloquea:* Tarea 3.1.2. * *Desbloquea:* Tarea 3.1.2.
* **Tarea 3.1.2 [TECH-005]:** Implementar el protocolo de sondeo y verificación de sincronización requerido por MirrorManager (archivo ``report_mirror``). * **Tarea 3.1.2 [TECH-005]:** Implementar el protocolo de sondeo y verificación de sincronización requerido por MirrorManager (archivo ``report_mirror``).
* *Bloqueado por:* Tarea 3.1.1. * *Bloqueado por:* Tarea 3.1.1.
* *Desbloquea:* Tarea 3.1.3. * *Desbloquea:* Tarea 3.1.3.
* **Tarea 3.1.3 [FUNC-005]:** Dar de alta el espejo de MxOS en la base de datos de MirrorManager de Fedora como espejo oficial para México. * **Tarea 3.1.3 [FUNC-005]:** Dar de alta el espejo de MxOS en la base de datos de MirrorManager de Fedora como espejo oficial para México.
* *Bloqueado por:* Tarea 3.1.2. * *Bloqueado por:* Tarea 3.1.2.
* *Desbloquea:* Hito 3.2. * *Desbloquea:* Hito 3.2.
@ -30,8 +35,11 @@ Hito 3.2: Propuesta Técnica Upstream (RFC)
Presentar la arquitectura a los equipos de infraestructura de Fedora y CentOS. Presentar la arquitectura a los equipos de infraestructura de Fedora y CentOS.
* **Tarea 3.2.1 [FUNC-005]:** Redactar el documento de propuesta (RFC) detallando los beneficios de ahorro de transferencia para upstream, mitigación de caídas y modelo de distribución comunitaria. * **Tarea 3.2.1 [FUNC-005]:** Redactar el documento de propuesta (RFC) detallando los beneficios de ahorro de transferencia para upstream, mitigación de caídas y modelo de distribución comunitaria.
* *Bloqueado por:* Tarea 3.1.3 y Fase 2 (Tarea 2.2.2). * *Bloqueado por:* Tarea 3.1.3 y Fase 2 (Tarea 2.2.2).
* *Desbloquea:* Tarea 3.2.2. * *Desbloquea:* Tarea 3.2.2.
* **Tarea 3.2.2 [FUNC-005]:** Publicar la propuesta en los foros de discusión de Fedora (categoría Infrastructure) y en la lista de correo ``centos-devel`` para abrir el diálogo sobre soporte nativo en DNF. * **Tarea 3.2.2 [FUNC-005]:** Publicar la propuesta en los foros de discusión de Fedora (categoría Infrastructure) y en la lista de correo ``centos-devel`` para abrir el diálogo sobre soporte nativo en DNF.
* *Bloqueado por:* Tarea 3.2.1. * *Bloqueado por:* Tarea 3.2.1.
* *Desbloquea:* Proyecto completado. * *Desbloquea:* Proyecto completado.

View file

@ -48,6 +48,7 @@ Componentes Principales
Demonio Kubo Demonio Kubo
------------ ------------
* **Implementación:** Kubo (Go-IPFS) versión empaquetada para Fedora/CentOS en Copr (``renich/kubo``). * **Implementación:** Kubo (Go-IPFS) versión empaquetada para Fedora/CentOS en Copr (``renich/kubo``).
* **Almacén de bloques:** Base de datos badgerds o flatfs para alto rendimiento en lecturas aleatorias. * **Almacén de bloques:** Base de datos badgerds o flatfs para alto rendimiento en lecturas aleatorias.
* **Protocolos de transporte:** TCP y QUIC habilitados en el puerto 4001 para transversalidad óptima de NAT y firewalls residenciales. * **Protocolos de transporte:** TCP y QUIC habilitados en el puerto 4001 para transversalidad óptima de NAT y firewalls residenciales.

View file

@ -12,6 +12,7 @@ Para la red de espejos de MxOS, la identidad criptográfica autoritativa no debe
Parámetros Criptográficos de la Llave Parámetros Criptográficos de la Llave
===================================== =====================================
* **Nombre en el almacén de Kubo:** ``mxos-mirrors`` * **Nombre en el almacén de Kubo:** ``mxos-mirrors``
* **Algoritmo:** Ed25519 (RFC 8032) * **Algoritmo:** Ed25519 (RFC 8032)
* **Formato de codificación:** Multibase base36 (prefijo ``k51...``) * **Formato de codificación:** Multibase base36 (prefijo ``k51...``)
@ -74,7 +75,7 @@ Kubo permite exportar la llave en formato estándar PEM PKCS#8 o en formato nati
chmod 0600 /dev/shm/mxos-mirrors.key chmod 0600 /dev/shm/mxos-mirrors.key
2. Respaldo Cifrado con Age (Recomendado) 2. Respaldo Cifrado con Age (Recomendado)
---------------------------------------- -----------------------------------------
El cifrado con ``age`` proporciona protección moderna basada en X25519 o mediante clave simétrica derivada con scrypt/passphrase: El cifrado con ``age`` proporciona protección moderna basada en X25519 o mediante clave simétrica derivada con scrypt/passphrase:
.. code-block:: bash .. code-block:: bash
@ -101,6 +102,7 @@ Como alternativa POSIX universal, se puede generar un contenedor cifrado con AES
Custodia y Almacenamiento en Frío Custodia y Almacenamiento en Frío
================================= =================================
* El archivo cifrado resultante (``.age`` o ``.gpg``) debe almacenarse en al menos dos medios independientes fuera de línea (discos cifrados LUKS, almacenamiento en frío o bóveda de contraseñas de infraestructura). * El archivo cifrado resultante (``.age`` o ``.gpg``) debe almacenarse en al menos dos medios independientes fuera de línea (discos cifrados LUKS, almacenamiento en frío o bóveda de contraseñas de infraestructura).
* Nunca debe almacenarse la llave en texto claro en repositorios Git ni en servidores sin cifrado a nivel de bloque. * Nunca debe almacenarse la llave en texto claro en repositorios Git ni en servidores sin cifrado a nivel de bloque.

View file

@ -14,6 +14,7 @@ El ciclo de actualización del nodo central de MxOS se ejecuta de manera automat
.. code-block:: bash .. code-block:: bash
ipfs add -r --nocopy --cid-version=1 --hash=sha2-256 /srv/mirrors/staging/ ipfs add -r --nocopy --cid-version=1 --hash=sha2-256 /srv/mirrors/staging/
3. **Actualización de Registros DNSLink:** El CID raíz resultante de la ingesta se publica automáticamente en el servidor de nombres de MxOS mediante actualización dinámica de DNS (RFC 2136 mediante nsupdate) o vía la API de gestión de zona. 3. **Actualización de Registros DNSLink:** El CID raíz resultante de la ingesta se publica automáticamente en el servidor de nombres de MxOS mediante actualización dinámica de DNS (RFC 2136 mediante nsupdate) o vía la API de gestión de zona.
4. **Anuncio en el enjambre:** El nodo central anuncia la provisión de los nuevos CIDs a la DHT de IPFS. 4. **Anuncio en el enjambre:** El nodo central anuncia la provisión de los nuevos CIDs a la DHT de IPFS.
@ -26,6 +27,7 @@ Para alimentar el tablero público en ``mirrors.mx-os.mx`` sin violar la privaci
.. code-block:: bash .. code-block:: bash
ipfs dht findprovs -n 0 <CID_RAÍZ> ipfs dht findprovs -n 0 <CID_RAÍZ>
2. **Extracción de multiaddrs:** El comando retorna los identificadores de par (PeerID) y las direcciones de red asociadas (IPv4/IPv6 y puertos de escucha). 2. **Extracción de multiaddrs:** El comando retorna los identificadores de par (PeerID) y las direcciones de red asociadas (IPv4/IPv6 y puertos de escucha).
3. **Geolocalización aproximada en memoria:** Las direcciones IP públicas se contrastan contra una base de datos local MaxMind GeoLite2 para extraer únicamente el país y estado o región. 3. **Geolocalización aproximada en memoria:** Las direcciones IP públicas se contrastan contra una base de datos local MaxMind GeoLite2 para extraer únicamente el país y estado o región.
4. **Almacenamiento temporal:** Los datos agregados (número de pares, concentración geográfica y latencia de respuesta) se consolidan en una base de datos SQLite/libSQL o en memoria para ser consumidos por la interfaz web reactiva. 4. **Almacenamiento temporal:** Los datos agregados (número de pares, concentración geográfica y latencia de respuesta) se consolidan en una base de datos SQLite/libSQL o en memoria para ser consumidos por la interfaz web reactiva.

View file

@ -1,6 +1,6 @@
============================================================================= ====================================================================================
Propuesta Técnica: Red Descentralizada de Espejos sobre IPFS para Distribuciones RPM Propuesta Técnica: Red Descentralizada de Espejos sobre IPFS para Distribuciones RPM
============================================================================= ====================================================================================
Identificador Técnico: [TECH-007] Identificador Técnico: [TECH-007]
@ -12,6 +12,7 @@ El modelo traslada el paradigma de distribución de software desde granjas de se
Motivación y Problemática Actual Motivación y Problemática Actual
================================ ================================
1. **Saturación en lanzamientos masivos:** La publicación de versiones mayores (como Fedora 43 o actualizaciones masivas de paquetes) genera picos de demanda extrema que congestionan los espejos regionales tradicionales. 1. **Saturación en lanzamientos masivos:** La publicación de versiones mayores (como Fedora 43 o actualizaciones masivas de paquetes) genera picos de demanda extrema que congestionan los espejos regionales tradicionales.
2. **Desperdicio de ancho de banda en redes locales:** En oficinas, universidades, laboratorios de cómputo y hogares con múltiples equipos, cada máquina descarga de forma redundante exactamente los mismos paquetes RPM a través de enlaces residenciales o corporativos. 2. **Desperdicio de ancho de banda en redes locales:** En oficinas, universidades, laboratorios de cómputo y hogares con múltiples equipos, cada máquina descarga de forma redundante exactamente los mismos paquetes RPM a través de enlaces residenciales o corporativos.
3. **Brecha de infraestructura en América Latina:** La densidad de espejos de alta capacidad en la región es limitada, forzando a los usuarios a conectarse con servidores en Estados Unidos o Europa, lo que incrementa la latencia y degrada la experiencia con ``dnf``. 3. **Brecha de infraestructura en América Latina:** La densidad de espejos de alta capacidad en la región es limitada, forzando a los usuarios a conectarse con servidores en Estados Unidos o Europa, lo que incrementa la latencia y degrada la experiencia con ``dnf``.
@ -26,6 +27,7 @@ Los árboles de paquetes y metadatos se procesan con Kubo generando grafos acíc
2. Enclavillado Comunitario Granular 2. Enclavillado Comunitario Granular
------------------------------------ ------------------------------------
A diferencia de los espejos HTTP que exigen sincronizar cientos de gigabytes para ser útiles, la arquitectura de MxOS permite custodia fraccionada: A diferencia de los espejos HTTP que exigen sincronizar cientos de gigabytes para ser útiles, la arquitectura de MxOS permite custodia fraccionada:
* Un usuario con cuota limitada puede enclavillar únicamente las imágenes ISO (~3.5 GB) o el repositorio BaseOS (~15 GB). * Un usuario con cuota limitada puede enclavillar únicamente las imágenes ISO (~3.5 GB) o el repositorio BaseOS (~15 GB).
* Las universidades o empresas pueden alojar el catálogo completo (~300 GB) en sus servidores locales. * Las universidades o empresas pueden alojar el catálogo completo (~300 GB) en sus servidores locales.
* La red P2P (Bitswap) descubre automáticamente a todos los custodios de un bloque, agregando el ancho de banda de subida de toda la comunidad. * La red P2P (Bitswap) descubre automáticamente a todos los custodios de un bloque, agregando el ancho de banda de subida de toda la comunidad.
@ -33,6 +35,7 @@ A diferencia de los espejos HTTP que exigen sincronizar cientos de gigabytes par
3. Doble Modalidad de Consumo 3. Doble Modalidad de Consumo
----------------------------- -----------------------------
Para garantizar compatibilidad absoluta: Para garantizar compatibilidad absoluta:
* **Modo Estándar (Sin cambios para el usuario):** La pasarela perimetral ``https://mirrors.mx-os.mx`` actúa como proxy inverso transparente hacia Kubo; cualquier cliente DNF estándar consume paquetes por HTTPS convencional. * **Modo Estándar (Sin cambios para el usuario):** La pasarela perimetral ``https://mirrors.mx-os.mx`` actúa como proxy inverso transparente hacia Kubo; cualquier cliente DNF estándar consume paquetes por HTTPS convencional.
* **Modo P2P Nativo:** Los usuarios con un demonio Kubo local configuran ``baseurl=http://127.0.0.1:8080/ipns/mirrors.mx-os.mx/...``; la descarga se realiza entre pares, aprovechando la velocidad de la red de área local sin consumir tráfico WAN. * **Modo P2P Nativo:** Los usuarios con un demonio Kubo local configuran ``baseurl=http://127.0.0.1:8080/ipns/mirrors.mx-os.mx/...``; la descarga se realiza entre pares, aprovechando la velocidad de la red de área local sin consumir tráfico WAN.

View file

@ -19,19 +19,24 @@ En los servidores de nombres autoritativos para el dominio ``mx-os.mx``, se defi
; Registro raíz del portal de espejos ; Registro raíz del portal de espejos
_dnslink.mirrors.mx-os.mx. 300 IN TXT "dnslink=/ipfs/bafyrei..." _dnslink.mirrors.mx-os.mx. 300 IN TXT "dnslink=/ipfs/bafyrei..."
; Registros complementarios para pasarelas públicas
_dnslink.ipfs.mx-os.mx. 300 IN TXT "dnslink=/ipfs/bafyrei..."
_dnslink.gateway.mx-os.mx. 300 IN TXT "dnslink=/ipfs/bafyrei..."
; Subdominios dedicados opcionales para granularidad independiente ; Subdominios dedicados opcionales para granularidad independiente
_dnslink.fedora.mirrors.mx-os.mx. 300 IN TXT "dnslink=/ipfs/bafyfed..." _dnslink.fedora.mirrors.mx-os.mx. 300 IN TXT "dnslink=/ipfs/bafyfed..."
_dnslink.centos.mirrors.mx-os.mx. 300 IN TXT "dnslink=/ipfs/bafycen..." _dnslink.centos.mirrors.mx-os.mx. 300 IN TXT "dnslink=/ipfs/bafycen..."
Mecánica de Resolución en Kubo Mecánica de Resolución en Kubo
============================== ==============================
1. Un cliente solicita un recurso bajo la ruta ``/ipns/mirrors.mx-os.mx/fedora/iso``.
2. Kubo extrae el nombre de dominio y consulta el registro TXT de ``_dnslink.mirrors.mx-os.mx``. Por defecto, Kubo utiliza los resolutores del sistema operativo (que a su vez dependen de servidores DNS locales o de enrutadores LAN con cachés independientes). 1. Un cliente solicita un recurso bajo la ruta ``/ipns/mirrors.mx-os.mx/fedora/iso`` o accede directamente a ``https://ipfs.mx-os.mx/``.
3. Para eliminar el desfase de caché y garantizar resolución inmediata tras cada publicación, se configura un resolvedor DNS sobre HTTPS (DoH) directo en la configuración de Kubo para el dominio ``mx-os.mx``: 2. Kubo extrae el nombre de dominio y consulta el registro TXT de ``_dnslink.mirrors.mx-os.mx`` (o ``_dnslink.ipfs.mx-os.mx``). Por defecto, Kubo utiliza los resolutores del sistema operativo (que a su vez dependen de servidores DNS locales o de enrutadores LAN con cachés independientes).
3. Para eliminar el desfase de caché y garantizar resolución inmediata tras cada publicación, se configura un resolvedor DNS sobre HTTPS (DoH) directo en la configuración de Kubo para el dominio ``mx-os.mx``. Es indispensable incluir el punto final (FQDN estricto):
.. code-block:: bash .. code-block:: bash
ipfs config --json DNS.Resolvers '{"mx-os.mx": "https://cloudflare-dns.com/dns-query", ".": "auto"}' ipfs config --json DNS.Resolvers '{"mx-os.mx.": "https://cloudflare-dns.com/dns-query", ".": "auto"}'
4. El registro TXT devuelve el prefijo canónico ``dnslink=/ipfs/<CID_RAÍZ>``. 4. El registro TXT devuelve el prefijo canónico ``dnslink=/ipfs/<CID_RAÍZ>``.
5. Kubo reemplaza internamente la ruta por ``/ipfs/<CID_RAÍZ>/fedora/iso`` y procede a recuperar los bloques vía Bitswap o desde la memoria local. 5. Kubo reemplaza internamente la ruta por ``/ipfs/<CID_RAÍZ>/fedora/iso`` y procede a recuperar los bloques vía Bitswap o desde la memoria local.

View file

@ -12,7 +12,8 @@ IPFS_USE_NOCOPY="${IPFS_USE_NOCOPY:-false}"
# Dominios, DNSLink e IPNS # Dominios, DNSLink e IPNS
CF_ZONE_ID="2bd35b00a854bc77cfd38009f977ea3c" CF_ZONE_ID="2bd35b00a854bc77cfd38009f977ea3c"
MIRRORS_DOMAIN="mirrors.mx-os.mx" MIRRORS_DOMAIN="mirrors.mx-os.mx"
MIRRORS_DNSLINK_RECORD="_dnslink.mirrors.mx-os.mx" MIRRORS_DNSLINK_RECORDS="_dnslink.mirrors.mx-os.mx _dnslink.ipfs.mx-os.mx _dnslink.gateway.mx-os.mx"
MIRRORS_DNSLINK_RECORD="${MIRRORS_DNSLINK_RECORD:-}"
MIRRORS_IPNS_KEY="mxos-mirrors" MIRRORS_IPNS_KEY="mxos-mirrors"
MIRRORS_IPNS_KEY_ID="k51qzi5uqu5di6ed3qtnwrdlvpmfil07ib6qfzb1t259nux49jenn8my4dtg0v" MIRRORS_IPNS_KEY_ID="k51qzi5uqu5di6ed3qtnwrdlvpmfil07ib6qfzb1t259nux49jenn8my4dtg0v"