Deploy inicial: API FastAPI + infra Podman/Caddy + docs

- App FastAPI (main.py, app/): rotas /health e /dados_retorno, middleware anti-scanner, logging configurado
- Config via configs.json (Pydantic); segredos fora do codigo e do git (.gitignore)
- Dockerfile (oracledb thin, HEALTHCHECK) + requirements.txt + .dockerignore
- Deploy Podman/Quadlet + Caddy em deploy/
- Docs: CLAUDE.md + docs/ (arquitetura, deploy, known-issues)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Ricardo Leite 2026-07-28 16:37:13 -03:00
commit 15c89c9038
22 changed files with 1397 additions and 0 deletions

54
docs/deploy.md Normal file
View file

@ -0,0 +1,54 @@
# Deploy — API-Scardua
Ambiente: **VPS Hostinger** (Debian 13), **Podman rootless + Quadlet**, **Caddy** (proxy + TLS), user `admin`.
No ar: **https://api-scardua.flstecnologia.tech**
## Acesso à VPS
- SSH: `ssh vps-fls` (alias já configurado → 179.197.230.154, porta **3115**, user `admin`).
- ⚠️ No Windows use o **OpenSSH nativo (PowerShell/cmd)** — o Git Bash não enxerga o `known_hosts`/config e falha.
- Porta 22 é **fechada** no firewall. Sempre `-p 3115` (ou o alias).
- `systemctl --user` sempre (rootless) — **nunca** `sudo systemctl` pros containers.
## Arquitetura
- Imagem: hoje buildada **local na VPS** = `localhost/api-scardua:latest` (sem registry ainda).
- Container `api-scardua` na rede **`fls`** — só o Caddy alcança; a porta 8000 **não** é publicada no host.
- Config: `configs.json` montado read-only de `~/.config/api-scardua/configs.json`.
- Quadlet: `~/.config/containers/systemd/api-scardua.container`.
- Caddy: `api-scardua.flstecnologia.tech``api-scardua:8000`, TLS automático (Let's Encrypt).
Caddyfile em `/srv/containers/stacks/caddy/Caddyfile`.
## Atualizar a app (hoje é manual)
```bash
# 1. copiar o código atualizado pro build dir da VPS (scp de main.py / app/ / etc.)
# 2. na VPS:
cd ~/build/api-scardua
podman build --format docker -t localhost/api-scardua:latest . # --format docker é OBRIGATÓRIO
systemctl --user restart api-scardua
```
> ⚠️ **`--format docker`**: em formato OCI (padrão do Podman) o `HEALTHCHECK` do Dockerfile é **ignorado**.
## Mexer no Caddy (com segurança)
```bash
cd /srv/containers/stacks/caddy
cp Caddyfile Caddyfile.bak # backup
# editar Caddyfile...
podman exec caddy caddy validate --config /etc/caddy/Caddyfile # valida ANTES
podman exec caddy caddy reload --config /etc/caddy/Caddyfile # recarrega sem downtime
```
## Comandos úteis
```bash
systemctl --user status api-scardua # estado do serviço
podman logs -f api-scardua # logs ao vivo
podman ps --filter name=api-scardua # estado + health
podman healthcheck run api-scardua # roda o healthcheck na hora
```
## Healthcheck
Embutido na imagem (`HEALTHCHECK` no Dockerfile, exec-form). Bate em `/health` a cada 30s.
É o sinal que o `podman auto-update` vai usar pra **rollback** quando o registry/CI estiver pronto.
## Evolução planejada
- **Registry + CI** (Forgejo Actions): buildar e publicar em `git.flstecnologia.tech/<owner>/api-scardua`,
trocar o Quadlet pro alvo em `deploy/api-scardua.container` (imagem do registry + `AutoUpdate=registry`) → deploy pull-based.
- Backup do Postgres da VPS (pendência geral do servidor).