Como foi construído · arquitetura

Um painel de eleição pronto para milhões de pessoas

Um coletor, arquivos estáticos na borda do Cloudflare e uma VPS de reserva. Nenhum servidor nosso no caminho de quem visita.

Banner: pronto para milhões, como o painel das eleições foi construído
Em resumo

Esta página explica como foi feito o painel eleicoes.inema.club, que mostrou ao vivo a apuração do 2º turno de 2026 com os dados oficiais do TSE. Um único coletor lê o TSE e grava arquivos prontos; esses arquivos ficam nos servidores do Cloudflare espalhados pelo mundo; o navegador de cada pessoa só lê esses arquivos. Assim, o número de visitantes não muda a carga do TSE nem da nossa máquina. Serve para quem quer entender, copiar ou ensinar esse jeito de construir um site que aguenta pico de acesso gastando pouco.

A ideia

Três partes que só conversam por arquivos

A coleta fala com o TSE e grava arquivos. O contrato define o formato desses arquivos. O site só lê os arquivos e desenha a tela. Uma parte pode cair ou trocar de máquina sem mexer nas outras — foi o que aconteceu quando a operação inteira mudou para a VPS.

Coletor único, arquivos imutáveis, borda do Cloudflare, custo baixo, VPS de reserva e troca em um comando
TSE→ 1 coletor (a cada 15 s, com ETag)→ Confere as contas→ Arquivos versionados + manifesto→ Borda do Cloudflare→ Navegador de cada pessoa
Linha do tempo

Do primeiro commit ao painel ao vivo: cerca de 37 horas

Tirado do histórico do repositório (git log), com noite de sono no meio. Tudo feito em sessões com o Claude Code; cada falha corrigida virou uma linha em FALHAS.md.

24/10 04:19
1º commitColetor, contrato e painel testados com os dados reais do 1º turno.
24/10 05:50
MunicípiosAs 5.571 cidades no mapa, num sistema separado do painel.
25/10 madrugada
Projeção, auditoria e reservaProjeção calibrada em 224 cenários (dados de 2022 e simulações), seção Fonte e auditoria, reserva na VPS e troca de domínios por script.
25/10 17:00
TSE abre a divulgaçãoOs coletores ligam sozinhos por timer. Durante a apuração entram 10 commits: correções e menus novos.
26/10
Depois da apuraçãoPágina A virada, chat "Tire suas dúvidas" e a operação inteira passando para a VPS.
Escala

Por que aguenta milhões sem derrubar servidor

O segredo é não ter servidor nosso no caminho de quem visita.

1

Quem atende é a borda

Os arquivos ficam nos servidores do Cloudflare espalhados pelo mundo. A nossa máquina só envia arquivos quando algo muda. Se ela cair, o site continua com o último resultado.

2

O TSE vê um cliente só

Mil ou um milhão de visitantes: o coletor faz o mesmo pedido a cada 15 s. Se nada mudou, o TSE responde "não mudou" e nada trafega.

3

Arquivo que não muda fica guardado

Cada versão tem nome próprio (v100340.json) e nunca é alterada. O navegador baixa uma vez e guarda por um ano.

4

Só um arquivo pequeno é consultado

O manifesto latest.json tem 4,9 KB e diz qual é a versão atual. O arquivo grande só é baixado quando muda.

5

Arquivo estático não roda código

Pedido de arquivo é servido direto, sem acionar programa. Segundo a documentação do Cloudflare, esses pedidos não são cobrados nem limitados.

6

Manifesto por último

O coletor grava os arquivos de versão antes do manifesto, e o envio ao Cloudflare leva tudo junto de uma vez. Ninguém vê um manifesto apontando para arquivo que ainda não chegou.

A conta ESTIMATIVA

Cada pessoa com o painel aberto pede o manifesto a cada 15 segundos. Não foi testado com 1 milhão de pessoas reais: é quanto a borda precisa entregar.

Pessoas ao mesmo tempoPedidos por segundo na bordaTráfegoPedidos ao TSECarga na nossa máquina
10 mil~670~3 MB/s1 a cada 15 snenhuma
100 mil~6.700~33 MB/s1 a cada 15 snenhuma
1 milhão~67.000~330 MB/s1 a cada 15 snenhuma

Onde estão os limites de verdade

Contador de acessos

É uma única instância no Cloudflare. Com milhões de sessões ao mesmo tempo, vira gargalo. Se falhar, só o número some do menu; o painel continua. Solução: dividir em várias instâncias e somar.

Chat "Tire suas dúvidas"

Cada pergunta chama a API da Anthropic. Por isso tem teto: 25 perguntas por hora e 80 por dia por visitante, 1.500 por dia no site.

A fonte

Se o TSE atrasa ou manda um arquivo que não fecha, aquele estado fica parado no último valor válido. Não dá para ser mais rápido que a fonte.

Publicação

Cada mudança vira um envio ao Cloudflare de 18 a 26 segundos (medido no log do publicador). Somado ao intervalo de 15 s da coleta, o site fica cerca de meio minuto atrás do TSE (estimativa).

Custos

O custo não cresce com o número de visitantes

Na parte do painel, mais gente olhando não aumenta a conta. Só o chat e o contador têm custo por uso.

ItemCustoTipo
Coletor, análises e publicadorUma VPS pequena (Hetzner CX23: 2 processadores, 4 GB). Preço na faixa de poucos euros por mês.ESTIMATIVA
Site e dados (arquivos na borda)Sem cobrança por pedido nos arquivos estáticos do Cloudflare.FATO
Contador e chat (programa no Cloudflare)Dentro da franquia com pouco volume; cobrado por volume acima dela, conforme o plano da conta.ESTIMATIVA
Chat (API da Anthropic, Claude Opus 5.5)Cerca de US$ 0,04 por pergunta, medido nas primeiras conversas.FATO
Dados do TSEPúblicos e gratuitos, sem chave.FATO
Backup

Uma VPS de reserva e a troca em um comando

Na noite da apuração, uma segunda máquina rodava tudo de verdade, pronta para assumir em minutos.

Coleta própria

A VPS tinha coletores próprios, ligados às 17h, gravando versões a partir de 500001. Assim nunca colidiam com os arquivos já publicados pela máquina principal (que começam em 100001).

Cópia sempre no ar

A VPS servia os dois sites em eleicoes2026.inema.club e municipios2026.inema.club, com as mesmas regras de cache. Dava para testar a reserva a qualquer momento.

Troca por script ou à mão

Um comando mandava os domínios para a VPS e outro trazia de volta. Sem a máquina principal, um manual explica a mesma troca pelo painel do Cloudflare: ferramentas/vps/TROCA-MANUAL.md. A reserva se instala com ferramentas/vps/instalar.sh vps.

# na noite: mandar o tráfego para a VPS (sem --executar só mostra o que faria)
ferramentas/vps/trocar_dominios.sh vps --executar
# voltar para o Cloudflare
ferramentas/vps/trocar_dominios.sh volta --executar
# hoje (desde 26/10) a VPS é a principal; reinstalar a operação inteira:
ssh root@<IP-DA-VPS> 'cd /opt/eleicoes2026 && git pull && bash ferramentas/vps/operacao.sh --executar'

Em 26/10 os dados finais foram copiados para a VPS, as análises rodaram lá com resultado idêntico (conferido pela impressão digital sha256) e a máquina principal foi desligada. O site não saiu do ar.

Técnicas

O que deu a eficiência

Nada exótico: um punhado de decisões simples, aplicadas com disciplina.

  1. Contrato primeiro. O formato dos arquivos foi escrito antes do código; coleta e site andaram em paralelo.
  2. Separar quem coleta de quem mostra. O site nunca fala com o TSE; a coleta não sabe de tela.
  3. Arquivo imutável + manifesto pequeno. Cache eterno no que não muda, consulta barata no que muda.
  4. Perguntar "mudou?" ao TSE (ETag). Baixa só o estado que mudou.
  5. Conferir antes de publicar. Soma que não fecha, voto que diminui, hora que volta: aquele estado não é publicado e fica o último valor válido.
  6. Guardar o original com impressão digital (sha256). A página Conferência refaz as somas e confere a integridade de cada arquivo baixado.
  7. Gravação atômica. Grava num arquivo temporário e troca de uma vez; ninguém lê arquivo pela metade.
  8. Publicar só quando muda. O publicador compara uma assinatura dos dados; reiniciar não duplica nada.
  9. Serviços com teto e horário. Reinício automático, limite de memória, timer para ligar às 17h e desligar as simulações às 16h, mesmo se a máquina reiniciar.
  10. Ensaiar a noite. Simulação acelerada com nomes fictícios e um "TSE falso" com falhas de propósito.
  11. Testar o modelo com dado antigo. A Projeção foi testada com dados de 2022 e com simulações: em 224 cenários, a faixa conteve o resultado final em 98,7%. É medido na mesma amostra que ajudou a definir a faixa, então não é garantia.
  12. Reserva quente. A VPS rodou de verdade a noite toda, com outra série de versões.
  13. Registro de falhas em uma linha. Exemplo da noite: o índice do TSE trazia o Brasil com a hora do exterior (16 horas no futuro) e o total não publicava; a correção foi ignorar hora no futuro.
Ler mais

Tudo aberto no repositório

O documento completo, com os detalhes técnicos e os nomes dos arquivos, está em ARQUITETURA.md.