Portfolio API
A api pública deste site: um binário Go com SQLite numa VPS gratuita, atrás de Caddy com TLS automático. O conteúdo vive no git e é reimportado a cada start; a publicação testa o pacote num banco temporário e volta sozinha à versão anterior se a nova não subir. Substituiu uma api Next com Postgres sem mudar nenhuma das 51 respostas comparadas, e ocupou 14 MB de memória na primeira release.
- Contexto
- A api deste site nasceu em Next.js com Postgres, Prisma, fila e e-mail pagos, desenhada para um admin que ainda não existia. Quem escreve o conteúdo sou eu, sozinho, e quem lê é o próprio site.
- Pressão
- Nenhum serviço pago novo. A api tinha de caber numa VPS gratuita que já roda outro serviço meu, e uma publicação errada não podia derrubar o site.
- Decisão
- Um binário Go com SQLite atrás de Caddy. O conteúdo fica no git e o banco é derivado dele: cada start reimporta o pacote, então o backup do conteúdo é o próprio repositório. O contrato entre o TypeScript do site e o Go da api é conferido em três pontos: Zod no export, importação estrita no Go, que recusa campo desconhecido e versão errada do pacote, e validação das respostas no cliente.
- Execução
- A publicação testa o pacote num banco temporário antes de trocar a versão, troca o link de forma atômica, espera a readiness e volta sozinha à versão anterior se a nova não subir. Ficam três versões no servidor, e por isso migração só acrescenta: o binário anterior precisa subir no banco já migrado. O banco é copiado todo dia e antes de cada migração, e a cópia só vale depois de passar na checagem de integridade. O serviço roda isolado pelo systemd, sem shell, sem escrita fora da própria pasta e com teto de memória. O health check lê o banco e responde 503 quando ele cai, separado de uma liveness que não toca em nada, e um agendamento externo confere a readiness de hora em hora.
- Evidência
- Antes de trocar a api, as duas responderam às mesmas 51 requisições com o mesmo conteúdo, e as respostas saíram idênticas fora ids e datas de criação. O CI exporta o conteúdo real e roda os testes Go com detector de corrida contra ele em todo pull request.
- Impacto
- O site tem backend próprio com custo zero de infraestrutura, e publicar é um comando que não deixa o site no ar com uma versão quebrada.











