diff --git a/README.rst b/README.rst index c9ebf08..a4ac3ed 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,6 @@ -========================================================= +======================================================== 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``. @@ -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. * **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:** + * Instantánea estática en el catálogo: `https://mirrors.mx-os.mx/vigia/telemetry.json `_ * API REST en tiempo real del demonio Vigía: ``/api/v1/telemetry`` * 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/ 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 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 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 @@ -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: 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 @@ -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. 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 ``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:** + * 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``. @@ -340,6 +343,7 @@ Para profundizar en las especificaciones y manuales, consulta el directorio `doc 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`_ diff --git a/bin/mxos-dnslink-update.bash b/bin/mxos-dnslink-update.bash index e18147f..a58c459 100755 --- a/bin/mxos-dnslink-update.bash +++ b/bin/mxos-dnslink-update.bash @@ -12,7 +12,8 @@ if [[ -f "${REPO_ROOT}/etc/mirrors.env" ]]; then fi 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() { if [[ -n "${CF_API_TOKEN:-}" ]]; then @@ -105,7 +106,16 @@ main() { local 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..." if command -v ipfs >/dev/null 2>&1; then diff --git a/docs/business/specs/incentivos-comunidad.rst b/docs/business/specs/incentivos-comunidad.rst index 26f824b..934cac8 100644 --- a/docs/business/specs/incentivos-comunidad.rst +++ b/docs/business/specs/incentivos-comunidad.rst @@ -12,16 +12,19 @@ Para reconocer el esfuerzo de quienes donan almacenamiento, electricidad y ancho 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``. * **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 ---------------------------- + * **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. Garantías de Privacidad ======================= + * 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). * No se recopilan historiales de navegación, patrones de paquetes instalados por clientes individuales ni datos de hardware del usuario. diff --git a/docs/functional/specs/catalogo-modular.rst b/docs/functional/specs/catalogo-modular.rst index c34693e..bcb68ff 100644 --- a/docs/functional/specs/catalogo-modular.rst +++ b/docs/functional/specs/catalogo-modular.rst @@ -35,6 +35,7 @@ El árbol servido bajo ``/ipns/mirrors.mx-os.mx`` debe dividirse en ramas bien d Criterios de Aceptación ======================= + 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. 3. La sincronización upstream debe preservar atributos de tiempo y enlaces relativos para asegurar la validez de los paquetes. diff --git a/docs/functional/specs/pineo-granular.rst b/docs/functional/specs/pineo-granular.rst index 3b0be88..7d756af 100644 --- a/docs/functional/specs/pineo-granular.rst +++ b/docs/functional/specs/pineo-granular.rst @@ -29,6 +29,7 @@ El sistema clasifica el contenido en cuatro niveles de compromiso de almacenamie 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. 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. diff --git a/docs/functional/specs/tablero-metricas.rst b/docs/functional/specs/tablero-metricas.rst index 82e68a5..ff6e40c 100644 --- a/docs/functional/specs/tablero-metricas.rst +++ b/docs/functional/specs/tablero-metricas.rst @@ -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. * **Directorio estructurado de custodios:** + * Visualización tabular de custodios y nodos participantes. * 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``). + * **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!``). * Filtrado reactivo por etiquetas de módulos en tiempo real con barra de estado y botón de restablecimiento (``✕``). + * **Métricas y observabilidad expuesta:** + * Número total de nodos proveedores activos en el enjambre. * Módulos soportados (Fedora ISOs, Fedora Everything, CentOS Stream BaseOS y AppStream). * Estado operativo del gateway público en HOBOPS.IO. * Identificador de contenido (CID) raíz activo en el espejo. * API REST en vivo bajo ``/api/v1/telemetry``. * 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 `_. diff --git a/docs/guides/cliente-dnf.rst b/docs/guides/cliente-dnf.rst index 3bfb5e9..59e8656 100644 --- a/docs/guides/cliente-dnf.rst +++ b/docs/guides/cliente-dnf.rst @@ -8,6 +8,7 @@ Este manual detalla cómo configurar el gestor de paquetes DNF en cualquier esta 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. * **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" 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``: .. code-block:: ini diff --git a/docs/guides/operador-nodo.rst b/docs/guides/operador-nodo.rst index 2f3c289..fe2fbb1 100644 --- a/docs/guides/operador-nodo.rst +++ b/docs/guides/operador-nodo.rst @@ -8,6 +8,7 @@ Este manual explica cómo configurar un nodo local de IPFS en Fedora o CentOS St Requisitos Previos ================== + * Fedora 43, 44, 45, Rawhide o CentOS Stream 10. * Acceso a privilegios administrativos mediante ``sudo``. * 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:** + * 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. * Proporciona un enlace HTTPS funcional en el campo ``sitio``. diff --git a/docs/project/roadmaps/fase-1-poc.rst b/docs/project/roadmaps/fase-1-poc.rst index 84ed837..2039cca 100644 --- a/docs/project/roadmaps/fase-1-poc.rst +++ b/docs/project/roadmaps/fase-1-poc.rst @@ -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. * **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. * *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. + * *Bloqueado por:* Tarea 1.1.1. * *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. + * *Bloqueado por:* Tarea 1.1.2. * *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. * **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. * *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. + * *Bloqueado por:* Tarea 1.2.1. * *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. * **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. * *Desbloquea:* Fase 2. diff --git a/docs/project/roadmaps/fase-2-tablero.rst b/docs/project/roadmaps/fase-2-tablero.rst index ba60ea9..5a45881 100644 --- a/docs/project/roadmaps/fase-2-tablero.rst +++ b/docs/project/roadmaps/fase-2-tablero.rst @@ -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. * **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). * *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. + * *Bloqueado por:* Tarea 2.1.1. * *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. * **Tarea 2.2.1 [FUNC-004]:** Diseñar la interfaz con mapa interactivo y contador de nodos activos. + * *Bloqueado por:* Tarea 2.1.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``. + * *Bloqueado por:* Tarea 2.2.1. * *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. * **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. * *Desbloquea:* Fase 3. diff --git a/docs/project/roadmaps/fase-3-federacion-upstream.rst b/docs/project/roadmaps/fase-3-federacion-upstream.rst index 78bd504..23f2121 100644 --- a/docs/project/roadmaps/fase-3-federacion-upstream.rst +++ b/docs/project/roadmaps/fase-3-federacion-upstream.rst @@ -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. * **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). * *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``). + * *Bloqueado por:* Tarea 3.1.1. * *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. + * *Bloqueado por:* Tarea 3.1.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. * **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). * *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. + * *Bloqueado por:* Tarea 3.2.1. * *Desbloquea:* Proyecto completado. diff --git a/docs/technical/specs/arquitectura-distribucion.rst b/docs/technical/specs/arquitectura-distribucion.rst index 2e0ecbe..939670e 100644 --- a/docs/technical/specs/arquitectura-distribucion.rst +++ b/docs/technical/specs/arquitectura-distribucion.rst @@ -48,6 +48,7 @@ Componentes Principales Demonio 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. * **Protocolos de transporte:** TCP y QUIC habilitados en el puerto 4001 para transversalidad óptima de NAT y firewalls residenciales. diff --git a/docs/technical/specs/gestion-llaves-ipns.rst b/docs/technical/specs/gestion-llaves-ipns.rst index d7b27b5..dd937c0 100644 --- a/docs/technical/specs/gestion-llaves-ipns.rst +++ b/docs/technical/specs/gestion-llaves-ipns.rst @@ -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 ===================================== + * **Nombre en el almacén de Kubo:** ``mxos-mirrors`` * **Algoritmo:** Ed25519 (RFC 8032) * **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 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: .. 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 ================================= + * 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. diff --git a/docs/technical/specs/ingesta-repositorios.rst b/docs/technical/specs/ingesta-repositorios.rst index a996f71..6597824 100644 --- a/docs/technical/specs/ingesta-repositorios.rst +++ b/docs/technical/specs/ingesta-repositorios.rst @@ -14,6 +14,7 @@ El ciclo de actualización del nodo central de MxOS se ejecuta de manera automat .. code-block:: bash 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. 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 ipfs dht findprovs -n 0 + 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. 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. diff --git a/docs/technical/specs/propuesta-rfc-upstream.rst b/docs/technical/specs/propuesta-rfc-upstream.rst index db77810..4fab229 100644 --- a/docs/technical/specs/propuesta-rfc-upstream.rst +++ b/docs/technical/specs/propuesta-rfc-upstream.rst @@ -1,6 +1,6 @@ -============================================================================= +==================================================================================== Propuesta Técnica: Red Descentralizada de Espejos sobre IPFS para Distribuciones RPM -============================================================================= +==================================================================================== 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 ================================ + 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. 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 ------------------------------------ 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). * 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. @@ -33,6 +35,7 @@ A diferencia de los espejos HTTP que exigen sincronizar cientos de gigabytes par 3. Doble Modalidad de Consumo ----------------------------- 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 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. diff --git a/docs/technical/specs/resolucion-dnslink.rst b/docs/technical/specs/resolucion-dnslink.rst index 22914e7..b767c51 100644 --- a/docs/technical/specs/resolucion-dnslink.rst +++ b/docs/technical/specs/resolucion-dnslink.rst @@ -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 _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 _dnslink.fedora.mirrors.mx-os.mx. 300 IN TXT "dnslink=/ipfs/bafyfed..." _dnslink.centos.mirrors.mx-os.mx. 300 IN TXT "dnslink=/ipfs/bafycen..." 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). -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``: + +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/``. +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 - 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/``. 5. Kubo reemplaza internamente la ruta por ``/ipfs//fedora/iso`` y procede a recuperar los bloques vía Bitswap o desde la memoria local. diff --git a/etc/mirrors.env b/etc/mirrors.env index 557f1cc..8f449fd 100644 --- a/etc/mirrors.env +++ b/etc/mirrors.env @@ -12,7 +12,8 @@ IPFS_USE_NOCOPY="${IPFS_USE_NOCOPY:-false}" # Dominios, DNSLink e IPNS CF_ZONE_ID="2bd35b00a854bc77cfd38009f977ea3c" 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_ID="k51qzi5uqu5di6ed3qtnwrdlvpmfil07ib6qfzb1t259nux49jenn8my4dtg0v"