Metal Globe · metal.ichisieben.dev · iC7

Arquitectura de Metal Globe

Un globo 3D con 195 679 bandas de 153 países, servido como archivos estáticos: HTML y JavaScript sin paso de compilación, y un pipeline de datos en Python que corre en un PC con Windows. Se ve en cinco capas: contenedores, datos, flujos, despliegue y decisiones. Haz clic en cualquier caja; reproduce un flujo para ver el tráfico recorrer la arquitectura.

propio (se construye) externo tráfico
Detalle

Haz clic en un contenedor

Cada caja es una unidad que corre por separado: un script del PC, un almacén de archivos, el hosting, el navegador del visitante o un servicio externo. Las líneas son llamadas reales: protocolo y qué viaja.

Por qué no hay servidor de aplicación

Los datos cambian cuando alguien refresca el catálogo, no cuando alguien visita la página. Por eso todo se calcula antes y se publica como JSON estático: la ficha de una banda es una sola petición pequeña, y el costo de operar no crece con las visitas.

Por qué la recolección va aparte

Recolectar es lento a propósito: al menos 2 segundos entre peticiones y una sola en vuelo. Corre en el PC, bajo supervisión, y deja archivos crudos en un almacén local. Nada de eso toca el sitio publicado; solo los resultados ya procesados viajan a web/data.

Por qué el almacén local no está en git

Los CSV y JSONL crudos pesan mucho más que lo que el navegador necesita. El repositorio versiona únicamente lo que se sirve (web/); el almacén local conserva la materia prima desde la que los constructores pueden regenerar todo.

Archivos JSON de web/data · modelo entidad-relación · pasa el cursor por una relación

Cómo se lee este modelo

almacén
No hay base de datos: cada tabla es un archivo JSON estático, versionado en git y servido tal cual por el hosting.
band_id
Identificador de banda. Une bands_index, el shard de la banda y top_bandas de cada país.
ISO
Código de país. Une el atlas con ciudades/, escena/, admin1/ y el índice de búsqueda; es también el nombre de cada archivo.
shards
Las fichas viven en 256 archivos bandas/{bb}.json. El shard de una banda es band_id % 256 en hexadecimal, así que abrir una ficha descarga un archivo pequeño, nunca el catálogo entero.
tamaños
Atlas 965 KB · índice de bandas 8,5 MB (195 679 filas) · índice de búsqueda 629 KB · shards 23 MB en total · ciudades 24 MB en 153 archivos · escenas 0,8 MB · admin1 2,4 MB · dashboard 24 KB · genealogía 124 KB.
enriquecido
bandas/_meta.json cuenta cuántas fichas traen enlaces oficiales: 16 474 con datos enriquecidos, 419 con MusicBrainz y 8 315 con Wikidata.
Secuencias · una por flujo · los mismos pasos que reproduce el C4
Despliegue · de los datos crudos al sitio publicado

Se prepara en el PC, se publica archivo por archivo y se comprueba contra producción.

No hay compilación ni contenedores: el sitio son archivos. El script de despliegue empaqueta web/ desde git, le pone un identificador de build, lo sube por la API del hosting y no da el despliegue por bueno hasta que producción sirve ese mismo identificador.

En el PC con Windows

Recolector del catálogo público≥ 2 s entre peticiones
Pipeline de métricas de Last.fmterminado · 195 679 filas
Enlaces oficiales (MusicBrainz, Wikidata)1,1 s entre peticiones
Almacén local de datos (disco externo)CSV · JSONL
Constructores build_*.py + geocodificación GeoNamesescriben web/data
Pruebas de humo con Playwrighten local
Script de desplieguegit archive + TUS

Todo lo que genera datos corre aquí y a mano. Nada de esto está expuesto a internet.

→ git archive → TUS →

En el hosting estático

Sitio en metal.ichisieben.dev754 archivos
index.html con el build-id en una etiqueta metasello del despliegue
JS y CSS con ?v=build-idsin caché obsoleta
data/** JSON estáticobajo demanda
Página forja.html (La Forja)84 géneros
Open-Meteo · flagcdn · Google Fonts · YouTubedesde el navegador

El visitante solo habla con el hosting y, para el clima, las banderas, las fuentes y la radio, con servicios externos directamente desde su navegador.

Cómo se publica

  • Commit limpio de web/.
  • git archive y sello del build-id.
  • Subida archivo por archivo con TUS (reanudable).
  • Prueba de humo en producción: si no sirve ese build-id, el despliegue falla.

Cómo se revierte

  • Se vuelve a desplegar un commit anterior.
  • La subida nunca borra: reemplaza los archivos que cambian.
  • La misma prueba de humo confirma que producción quedó en el build pedido.

Qué cuesta operarlo

  • Sin servidor de aplicación ni base de datos que mantener.
  • Las visitas piden archivos; no ejecutan código del lado del servidor.
  • Los servicios externos son de lectura y se consumen desde el navegador.
Decisiones de arquitectura · cada una con su razón y lo que se descartó

Cinco decisiones que explican por qué el sistema es tan simple

ADR-1

JSON estático en shards, sin backend

Los datos se calculan antes y se publican como archivos. La ficha de una banda es una petición pequeña a bandas/{bb}.json, y el costo de operación no varía con el tráfico.

Descartado: una API con base de datos. Habría añadido un servicio que mantener y un costo que crece con las visitas, para datos que cambian pocas veces.

ADR-2

El índice de búsqueda se carga al primer foco

Los índices pesan 8,5 MB y 629 KB. Se piden cuando el visitante enfoca el buscador por primera vez, así el primer pintado solo carga el atlas, los contornos de países y la textura.

Descartado: cargarlos al abrir la página. Penalizaría a quien solo viene a mirar el globo.

ADR-3

Build-id sellado y comprobado en producción

Cada despliegue lleva un identificador en una etiqueta meta y en los ?v= de JS y CSS. La prueba de humo falla si producción no sirve ese identificador, así un despliegue no puede quedarse sirviendo archivos viejos sin que nadie lo note.

Descartado: dar por bueno el despliegue cuando la subida termina sin error.

ADR-4

La subida nunca borra

El despliegue sube archivo por archivo y no elimina nada del hosting. Volver atrás es desplegar un commit anterior, con el mismo procedimiento y la misma comprobación.

Descartado: sincronizar el hosting con espejo exacto. Un error en el árbol local podría vaciar producción.

ADR-5

Recolección pausada y reanudable

Al menos 2 segundos entre peticiones, una sola en vuelo, y reanudación por archivo si la sesión se corta. Es una carga mínima para la fuente y no obliga a empezar de cero.

Descartado: recolectar en paralelo para terminar antes. Se prefiere tardar más y ser un buen visitante.