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.
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.
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.
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.
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.
web/data · modelo entidad-relación · pasa el cursor por una relaciónbands_index, el shard de la banda y top_bandas de cada país.ciudades/, escena/, admin1/ y el índice de búsqueda; es también el nombre de cada archivo.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.bandas/_meta.json cuenta cuántas fichas traen enlaces oficiales: 16 474 con datos enriquecidos, 419 con MusicBrainz y 8 315 con Wikidata.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.
build_*.py + geocodificación GeoNamesescriben web/dataTodo lo que genera datos corre aquí y a mano. Nada de esto está expuesto a internet.
index.html con el build-id en una etiqueta metasello del despliegue?v=build-idsin caché obsoletadata/** JSON estáticobajo demandaforja.html (La Forja)84 génerosEl visitante solo habla con el hosting y, para el clima, las banderas, las fuentes y la radio, con servicios externos directamente desde su navegador.
web/.git archive y sello del build-id.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.
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.
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.
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.
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.