Deploy
Infraestrutura
- Servidor: VPS em
62.146.228.253 - Reverse proxy: Traefik com auto-SSL (Let's Encrypt)
- Banco de dados: Neon PostgreSQL (externo, gerenciado)
- Containers: 4 serviços via Docker Compose
Serviços Docker
| Serviço | Imagem | Porta | Domínio |
|---|---|---|---|
api |
projects/api_service/Dockerfile |
8000 | api.viacorretor.com.br |
web |
projects/web_service/Dockerfile |
8080 | app.viacorretor.com.br |
broker-web |
apps/broker-web/Dockerfile |
3000 | viacorretor.com.br, www.viacorretor.com.br |
nocodb |
nocodb/nocodb:latest |
8080 | admin.viacorretor.com.br |
Todos os serviços usam a rede externa proxy (gerenciada pelo Traefik).
CI/CD Pipeline
Push/PR → main
↓
CI (ci.yml):
├─ python-unit: ruff + mypy + pytest test/components/
├─ python-e2e: pytest test/bases/ (Playwright)
├─ broker-web: pnpm lint + build + E2E
└─ docs: mkdocs build --strict
CI passa? → Deploy (deploy.yml):
├─ deploy: SSH → git pull → docker compose up --build -d
└─ deploy-docs: mkdocs gh-deploy → GitHub Pages
Variáveis de ambiente necessárias em produção
Configure no arquivo .env do servidor (em DEPLOY_REPO_PATH/.env):
# Banco
DATABASE_URL=postgresql+asyncpg://user:pass@ep-xxx.neon.tech/neondb?sslmode=require
# LLM
OPENROUTER_API_KEY=sk-or-...
OPENROUTER_MODEL=google/gemini-2.0-flash-001
# Auth
JWT_SECRET=string-longa-e-aleatoria
DEV_LOGIN=false
# Next.js (passadas como ARGs no build)
NEXT_PUBLIC_API_URL=https://api.viacorretor.com.br
NEXT_PUBLIC_ROOT_DOMAIN=viacorretor.com.br
NEXT_PUBLIC_SITE_URL=https://viacorretor.com.br
# Deploy
DEPLOY_HOST=62.146.228.253
DEPLOY_USER=root
DEPLOY_SSH_KEY=<chave privada>
DEPLOY_REPO_PATH=/opt/galgal
Secrets no GitHub Actions
Configure em Settings → Secrets and variables → Actions:
| Secret | Descrição |
|---|---|
DEPLOY_HOST |
IP do servidor |
DEPLOY_USER |
Usuário SSH |
DEPLOY_SSH_KEY |
Chave privada SSH |
DEPLOY_REPO_PATH |
Caminho do repo no servidor |
OPENROUTER_API_KEY |
Para testes E2E com LLM real |
Deploy manual
# No servidor
cd /opt/galgal
git pull origin master
docker compose up --build -d
# Health check
curl -sf https://api.viacorretor.com.br/docs && echo "API OK"
curl -sf https://viacorretor.com.br && echo "Broker-web OK"
Cron scraper (pendente)
Adicionar ao crontab do servidor:
# Roda às 3h diariamente
0 3 * * * cd /opt/galgal && docker compose exec api python scripts/run_scraper.py --source zap --city Jundiai --limit 100
Documentação
Esta documentação é um 5º serviço Docker (docs). O Dockerfile em projects/docs_service/Dockerfile faz um multi-stage build:
- Python 3.13 slim instala mkdocs + mkdocstrings e gera o site estático (
mkdocs build --strict) - nginx:alpine serve os arquivos em
/usr/share/nginx/html
O container é reconstruído automaticamente pelo docker compose up --build -d em cada deploy.
O Dockerfile fica em docker/docs.Dockerfile (fora de projects/ para não conflitar com o workspace uv).
URL: docs.viacorretor.com.br (Traefik + Let's Encrypt automático)