Site de cadastro de apoiadores para envio de material de campanha. Site estático: HTML, CSS e JavaScript puros, sem build e sem servidor.
Visitante digita o CEP
↓
ViaCEP (reserva: BrasilAPI) → preenche rua, bairro, cidade e UF
↓
Visitante completa nome e número
↓
POST para docs.google.com/forms/.../formResponse
↓
Resposta cai na planilha do Google Forms da campanha
Não existe backend. O formulário do Google continua sendo o banco de dados; este site é apenas uma interface melhor na frente dele.
O site é estático. Em qualquer hospedagem comum, basta subir index.html,
privacidade.html e a pasta assets/. Exige HTTPS — sem ele o navegador
pode bloquear as chamadas às APIs de CEP, e a política de privacidade promete
conexão criptografada.
O Dockerfile na raiz existe por um motivo específico: o painel só aceita
portas entre 1024 e 65535, e a imagem oficial do nginx escuta na 80. Sem ele,
o proxy da plataforma tenta falar com a porta configurada, não encontra ninguém
e devolve 502 Bad Gateway em todos os caminhos — inclusive nos que não existem,
que deveriam dar 404.
A porta vem da variável de ambiente PORT (padrão 4007, definido no
Dockerfile). O entrypoint da imagem oficial substitui ${PORT} dentro de
deploy/default.conf.template na hora de subir o container.
Se a plataforma trocar a porta do app:
- Painel → Configurações → Deploy → Porta interna: anote o novo número
- Painel → Variáveis: crie
PORTcom esse mesmo número - Redeploy
Não é preciso mexer no código. Os dois números só precisam bater.
Diretório raiz no painel: deixe vazio — o index.html está na raiz
do repositório.
curl -s -o /dev/null -w '%{http_code}\n' https://SEU-DOMINIO/naoexiste- Resposta 404 → o nginx está lendo o disco; o problema é outro
- Resposta 502 → o nginx nem chega no disco: é porta errada ou container fora do ar
- 502 que volta em menos de 1s → conexão recusada (porta errada)
- 502 que demora mais de 10s → timeout (container travado ou bloqueio de rede)
| Arquivo | O que é |
|---|---|
index.html |
Página do cadastro |
privacidade.html |
Política de Privacidade (fonte da verdade do texto legal) |
assets/app.js |
Busca de CEP, validação e envio ao Google Forms |
assets/style.css |
Estilos das duas páginas |
assets/fonts.css + assets/fonts/ |
Montserrat e Inter servidas localmente |
assets/hero-*.webp / .jpg |
Arte da campanha em duas resoluções |
surfistaPost material capitão c.png |
Arte original, 2160×2700 (não é usada em produção) |
Formulário: 1xNloSQ_wQNi3ovtY1_chenGJTfamPvAEeyOlhMj4aWg
Os IDs dos campos ficam em assets/app.js, no objeto CAMPOS.
Se você adicionar, apagar ou recriar uma pergunta no Google Forms, o ID daquele
campo muda e o envio daquele dado para de funcionar em silêncio.
Para descobrir os IDs de novo:
- Abra o formulário público (
/viewform) - Veja o código-fonte da página
- Procure por
FB_PUBLIC_LOAD_DATA_ - Em cada pergunta, o número dentro do array interno é o
entry.daquele campo
Restrições que precisam continuar valendo no Google Forms:
- Todas as perguntas devem ser do tipo Resposta curta
- Todas devem ficar não obrigatórias — quem valida é este site. Se uma pergunta virar obrigatória e chegar vazia, o Google rejeita o envio e o site não tem como saber (a resposta vem opaca por causa do CORS).
- O formulário não pode exigir login nem coletar e-mail
- Preencher, em
privacidade.html, os trechos marcados em amarelo ([PREENCHER: ...]): endereço do diretório e nome/e-mail do encarregado (DPO) - Apagar a linha de teste da planilha (Maria Aparecida Souza)
- Revisão jurídica da política de privacidade — o texto foi redigido com base na LGPD, mas propaganda eleitoral tem regras próprias e o cadastro envolve dado sensível (opinião política, art. 5º, II da LGPD)
- Confirmar que a hospedagem serve o site por HTTPS