Pular para conteúdo

Deployment

Containers

Cada projeto roda em seu próprio container em docker compose. Normalmente 2 serviços:

  • <projeto>-chatbot — FastAPI + LangGraph + integrações
  • <projeto>-postgres — PostgreSQL local

Um proxy reverso (nginx / Caddy / Traefik) expõe HTTPS.

Volumes

  • pgdata — dados do Postgres. Backup obrigatório.

Rede

# docker-compose.yml
services:
  chatbot:
    image: ...
    depends_on:
      - postgres
    networks: [default]
  postgres:
    image: postgres:16
    networks: [default]

Em prod, não expor o Postgres para fora — apenas a porta do chatbot (:8000).

Variáveis de ambiente

Tudo em .env local do servidor. Nunca em secrets embutidos. Mínimo:

OPENAI_API_KEY=...
GEMINI_API_KEY=...
WTS_API_TOKEN=...
WTS_CHANNEL_ID=...
WTS_DEPARTMENT_HUMAN_ID=...

DATABASE_URL=postgresql://user:pass@postgres:5432/<projeto>

OTIMUS_API_URL=https://<clinica>.otimusclinic.com[:porta]
OTIMUS_TOKEN=...

ALLOWED_INSTANCE=+55...
ALLOWED_TEAM=IA ATENDIMENTOS
MESSAGE_DEBOUNCE_SECONDS=2

Processo de deploy

  1. git pull no servidor.
  2. docker compose build chatbot.
  3. docker compose up -d chatbot (recria só o container do chatbot).
  4. Verificar /health:
    curl https://<host>/health
    
  5. Enviar mensagem de teste do número de QA.

Rollback

git checkout <sha-anterior> && docker compose up -d --build chatbot.

O Postgres mantém estado — rollback de código não perde histórico de chat.

Reverse proxy (Caddy)

medcenter.agentproia.com {
    reverse_proxy localhost:8000
}
clinfeto.agentproia.com {
    reverse_proxy localhost:8001
}
OTIDOC.agentproia.com {
    root * /var/www/otidoc
    file_server
}

Publicar esta documentação OTIDOC

# Na máquina de dev
cd /home/DOCKER/OTIDOC
pip install -r requirements.txt
mkdocs build

# Copiar para o servidor
rsync -av ./site/ user@server:/var/www/otidoc/

Ou usar GitHub Actions para deploy automático em push para main.

Monitoramento

  • Health check GET /health a cada 30s (uptime-kuma / pingdom).
  • Logs: docker logs -f <projeto>-chatbot na máquina.
  • Postgres: queries em dashboard_errors (ver Telemetria).

Backup

Cron diário:

pg_dump -h localhost -U user <projeto> | gzip > /backup/<projeto>-$(date +%F).sql.gz
find /backup -mtime +30 -delete

Arquivar em S3 semanal.

Escala

Até ~5 clínicas grandes em paralelo cabem em uma VM de 4 vCPU / 8 GB. Para além disso:

  • Subir em VM separada por cliente.
  • Migrar Postgres para RDS / Cloud SQL.
  • Considerar fila externa (Redis) se debounce ficar ruim.