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.

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 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.
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.
El secreto es no tener un servidor nuestro en el camino de quien visita.
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.
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.
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.
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.
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.
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ó.
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 tiempo | Solicitudes por segundo en el borde | Tráfico | Solicitudes al TSE | Carga en nuestra máquina |
|---|---|---|---|---|
| 10 mil | ~670 | ~3 MB/s | 1 cada 15 s | ninguna |
| 100 mil | ~6.700 | ~33 MB/s | 1 cada 15 s | ninguna |
| 1 millón | ~67.000 | ~330 MB/s | 1 cada 15 s | ninguna |
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.
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.
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.
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).
En la parte del panel, más gente mirando no aumenta la cuenta. Solo el chat y el contador tienen costo por uso.
| Ítem | Costo | Tipo |
|---|---|---|
| Colector, análisis y publicador | Una 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 TSE | Públicos y gratuitos, sin clave. | HECHO |
En la noche del escrutinio, una segunda máquina ejecutaba todo de verdad, lista para asumir en minutos.
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).
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.
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.
Nada exótico: un puñado de decisiones simples, aplicadas con disciplina.
El documento completo, con los detalles técnicos y los nombres de los archivos, está en ARQUITETURA.md.