Cómo se construyó · arquitectura

Un panel electoral listo para millones de personas

Un colector, archivos estáticos en el borde de Cloudflare y una VPS de reserva. Ningún servidor nuestro en el camino de quien visita.

Banner: listo para millones, cómo se construyó el panel de las elecciones
En resumen

Esta página explica cómo se hizo el panel eleicoes.inema.club, que mostró en vivo el escrutinio de la segunda vuelta de 2026 con los datos oficiales del TSE. Un único colector lee el TSE y graba archivos listos; esos archivos quedan en los servidores de Cloudflare repartidos por el mundo; el navegador de cada persona solo lee esos archivos. Así, el número de visitantes no cambia la carga del TSE ni la de nuestra máquina. Sirve para quien quiere entender, copiar o enseñar esta forma de construir un sitio que aguanta picos de acceso gastando poco.

La idea

Tres partes que solo conversan por archivos

La recolección habla con el TSE y graba archivos. El contrato define el formato de esos archivos. El sitio solo lee los archivos y dibuja la pantalla. Una parte puede caerse o cambiar de máquina sin tocar las otras — fue lo que ocurrió cuando toda la operación pasó a la VPS.

Colector único, archivos inmutables, borde de Cloudflare, costo bajo, VPS de reserva y cambio en un comando
TSE→ 1 colector (cada 15 s, con ETag)→ Verifica las cuentas→ Archivos versionados + manifiesto→ Borde de Cloudflare→ Navegador de cada persona
Línea de tiempo

Del primer commit al panel en vivo: unas 37 horas

Sacado del historial del repositorio (git log), con una noche de sueño en medio. Todo hecho en sesiones con Claude Code; cada falla corregida se convirtió en una línea en FALHAS.md.

24/10 04:19
1.er commitColector, contrato y panel probados con los datos reales de la primera vuelta.
24/10 05:50
MunicipiosLas 5.571 ciudades en el mapa, en un sistema separado del panel.
25/10 madrugada
Proyección, auditoría y reservaProyección calibrada con 224 escenarios (datos de 2022 y simulaciones), sección Fuente y auditoría, reserva en la VPS y cambio de dominios por script.
25/10 17:00
El TSE abre la divulgaciónLos colectores se encienden solos por timer. Durante el escrutinio entran 10 commits: correcciones y menús nuevos.
26/10
Después del escrutinioPágina A virada (El vuelco), chat "Tire suas dúvidas" (Resuelve tus dudas) y toda la operación pasando a la VPS.
Escala

Por qué soporta millones sin derribar un servidor

El secreto es no tener un servidor nuestro en el camino de quien visita.

1

Quien atiende es el borde

Los archivos están en los servidores de Cloudflare repartidos por el mundo. Nuestra máquina solo envía archivos cuando algo cambia. Si se cae, el sitio sigue con el último resultado.

2

El TSE ve un solo cliente

Mil o un millón de visitantes: el colector hace la misma solicitud cada 15 s. Si nada cambió, el TSE responde "no cambió" y no circula nada.

3

El archivo que no cambia se guarda

Cada versión tiene nombre propio (v100340.json) y nunca se modifica. El navegador lo descarga una vez y lo guarda por un año.

4

Solo se consulta un archivo pequeño

El manifiesto latest.json pesa 4,9 KB y dice cuál es la versión actual. El archivo grande solo se descarga cuando cambia.

5

Un archivo estático no ejecuta código

La solicitud de un archivo se sirve directo, sin activar ningún programa. Según la documentación de Cloudflare, esas solicitudes no se cobran ni se limitan.

6

Manifiesto al final

El recolector graba los archivos de versión antes del manifiesto, y el envío a Cloudflare lleva todo junto de una vez. Nadie ve un manifiesto apuntando a un archivo que todavía no llegó.

La cuenta ESTIMACIÓN

Cada persona con el panel abierto pide el manifiesto cada 15 segundos. No se probó con 1 millón de personas reales: es lo que el borde necesita entregar.

Personas al mismo tiempoSolicitudes por segundo en el bordeTráficoSolicitudes al TSECarga en nuestra máquina
10 mil~670~3 MB/s1 cada 15 sninguna
100 mil~6.700~33 MB/s1 cada 15 sninguna
1 millón~67.000~330 MB/s1 cada 15 sninguna

Dónde están los límites de verdad

Contador de accesos

Es una única instancia en Cloudflare. Con millones de sesiones al mismo tiempo, se vuelve un cuello de botella. Si falla, solo el número desaparece del menú; el panel sigue. Solución: dividir en varias instancias y sumar.

Chat "Tire suas dúvidas" (Resuelve tus dudas)

Cada pregunta llama a la API de Anthropic. Por eso tiene tope: 25 preguntas por hora y 80 por día por visitante, 1.500 por día en el sitio.

La fuente

Si el TSE se atrasa o manda un archivo que no cuadra, ese estado se queda en el último valor válido. No se puede ser más rápido que la fuente.

Publicación

Cada cambio se convierte en un envío a Cloudflare de 18 a 26 segundos (medido en el registro del publicador). Sumado al intervalo de 15 s de la recolección, el sitio queda cerca de medio minuto detrás del TSE (estimación).

Costos

El costo no crece con el número de visitantes

En la parte del panel, más gente mirando no aumenta la cuenta. Solo el chat y el contador tienen costo por uso.

ÍtemCostoTipo
Colector, análisis y publicadorUna VPS pequeña (Hetzner CX23: 2 procesadores, 4 GB). Precio en el rango de pocos euros al mes.ESTIMACIÓN
Sitio y datos (archivos en el borde)Sin cobro por solicitud en los archivos estáticos de Cloudflare.HECHO
Contador y chat (programa en Cloudflare)Dentro de la franquicia con poco volumen; se cobra por volumen por encima de ella, según el plan de la cuenta.ESTIMACIÓN
Chat (API de Anthropic, Claude Opus 5.5)Cerca de US$ 0,04 por pregunta, medido en las primeras conversaciones.HECHO
Datos del TSEPúblicos y gratuitos, sin clave.HECHO
Respaldo

Una VPS de reserva y el cambio en un comando

En la noche del escrutinio, una segunda máquina ejecutaba todo de verdad, lista para asumir en minutos.

Recolección propia

La VPS tenía colectores propios, encendidos a las 17h, grabando versiones a partir de 500001. Así nunca chocaban con los archivos ya publicados por la máquina principal (que empiezan en 100001).

Copia siempre activa

La VPS servía los dos sitios en eleicoes2026.inema.club y municipios2026.inema.club, con las mismas reglas de caché. Se podía probar la reserva en cualquier momento.

Cambio por script o a mano

Un comando mandaba los dominios a la VPS y otro los traía de vuelta. Sin la máquina principal, un manual explica el mismo cambio desde el panel de Cloudflare: ferramentas/vps/TROCA-MANUAL.md (en portugués). El respaldo se instala con ferramentas/vps/instalar.sh vps.

# en la noche: mandar el tráfico a la VPS (sin --executar solo muestra lo que haría)
ferramentas/vps/trocar_dominios.sh vps --executar
# volver a Cloudflare
ferramentas/vps/trocar_dominios.sh volta --executar
# hoy (desde el 26/10) la VPS es la principal; reinstalar toda la operación:
ssh root@<IP-DEL-VPS> 'cd /opt/eleicoes2026 && git pull && bash ferramentas/vps/operacao.sh --executar'

El 26/10 los datos finales se copiaron a la VPS, los análisis corrieron allí con resultado idéntico (verificado por la huella digital sha256) y la máquina principal se apagó. El sitio no salió del aire.

Técnicas

Lo que dio la eficiencia

Nada exótico: un puñado de decisiones simples, aplicadas con disciplina.

  1. Contrato primero. El formato de los archivos se escribió antes que el código; recolección y sitio avanzaron en paralelo.
  2. Separar a quien recolecta de quien muestra. El sitio nunca habla con el TSE; la recolección no sabe nada de pantallas.
  3. Archivo inmutable + manifiesto pequeño. Caché eterno en lo que no cambia, consulta barata en lo que cambia.
  4. Preguntar "¿cambió?" al TSE (ETag). Descarga solo el estado que cambió.
  5. Verificar antes de publicar. Suma que no cuadra, voto que disminuye, hora que retrocede: ese estado no se publica y queda el último valor válido.
  6. Guardar el original con huella digital (sha256). La página Conferência rehace las sumas y verifica la integridad de cada archivo descargado.
  7. Grabación atómica. Graba en un archivo temporal y lo cambia de una vez; nadie lee un archivo a medias.
  8. Publicar solo cuando cambia. El publicador compara una firma de los datos; reiniciar no duplica nada.
  9. Servicios con tope y horario. Reinicio automático, límite de memoria, timer para encender a las 17h y apagar las simulaciones a las 16h, incluso si la máquina se reinicia.
  10. Ensayar la noche. Simulación acelerada con nombres ficticios y un "TSE falso" con fallas a propósito.
  11. Probar el modelo con datos antiguos. La Proyección se probó con datos de 2022 y con simulaciones: en 224 escenarios, el rango contuvo el resultado final en el 98,7%. Se mide en la misma muestra que ayudó a definir el rango, así que no es una garantía.
  12. Reserva caliente. La VPS funcionó de verdad toda la noche, con otra serie de versiones.
  13. Registro de fallas en una línea. Ejemplo de la noche: el índice del TSE traía a Brasil con la hora del exterior (16 horas en el futuro) y el total no se publicaba; la corrección fue ignorar horas en el futuro.
Leer más

Todo abierto en el repositorio

El documento completo, con los detalles técnicos y los nombres de los archivos, está en ARQUITETURA.md.