Migra banco de dados de SQLite para PostgreSQL

- Muda provider Prisma de sqlite para postgresql
- Remove dependencias SQLite (better-sqlite3, adapter)
- Atualiza Better Auth para provider postgresql
- Simplifica prisma.ts removendo adapter SQLite
- Atualiza stack.yml para usar PostgreSQL existente com 2 replicas
- Remove logica de rebuild better-sqlite3 do start-web.sh
- Adiciona script de migracao de dados SQLite -> PostgreSQL
- Atualiza healthcheck para testar PostgreSQL via Prisma
- Habilita start-first deploy para zero-downtime

Melhoria: permite multiplas replicas e deploys sem downtime.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
esdrasrenan 2025-12-11 00:35:27 -03:00
parent fb97d9bec8
commit 33a59634e7
10 changed files with 362 additions and 223 deletions

View file

@ -11,7 +11,7 @@ services:
bash -lc "bash /app/scripts/start-web.sh"
volumes:
- ${APP_DIR:-/srv/apps/sistema}:/app
- sistema_db:/app/data
# Removido: sistema_db (SQLite) - agora usa PostgreSQL
environment:
NODE_ENV: "production"
BUN_INSTALL_CACHE_DIR: "/tmp/bun-cache"
@ -29,35 +29,39 @@ services:
BETTER_AUTH_SECRET: "${BETTER_AUTH_SECRET}"
REPORTS_CRON_SECRET: "${REPORTS_CRON_SECRET}"
REPORTS_CRON_BASE_URL: "${REPORTS_CRON_BASE_URL}"
# Mantém o SQLite fora do repositório
DATABASE_URL: "file:/app/data/db.sqlite"
# PostgreSQL connection string (usa o servico 'postgres' existente na rede traefik_public)
DATABASE_URL: "postgresql://${POSTGRES_USER:-sistema}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-sistema_chamados}"
# Evita apt-get na inicialização porque a imagem já vem com toolchain pronta
SKIP_APT_BOOTSTRAP: "true"
# Sempre revalida/rebuild better-sqlite3 para a runtime atual
SKIP_SQLITE_REBUILD: "false"
# Usado para forçar novo rollout a cada deploy (setado pelo CI)
RELEASE_SHA: "${RELEASE_SHA:-dev}"
# Tempo para graceful shutdown antes do SIGKILL
stop_grace_period: 10s
deploy:
mode: replicated
# IMPORTANTE: SQLite nao suporta multiplas conexoes de escrita simultaneas.
# Manter sempre 1 replica para evitar "attempt to write a readonly database".
replicas: 1
# PostgreSQL suporta múltiplas conexões - agora podemos ter 2 réplicas!
replicas: 2
update_config:
parallelism: 1
# start-first evita downtime: sobe o novo task antes de parar o anterior
# PostgreSQL permite start-first para zero-downtime deploys
order: start-first
failure_action: rollback
# Delay entre updates para garantir que o healthcheck passa
delay: 10s
# Monitor: tempo que o Swarm espera após o deploy para verificar estabilidade
# Delay entre updates para dar tempo ao container iniciar
delay: 5s
# Monitor: tempo que o Swarm espera apos o deploy para verificar estabilidade
monitor: 30s
rollback_config:
order: start-first
order: stop-first
resources:
limits:
memory: "2G"
restart_policy:
condition: any
# Delay antes de tentar restart em caso de falha
delay: 5s
# Maximo de restarts em uma janela de tempo
max_attempts: 3
window: 120s
placement:
constraints:
- node.role == manager
@ -81,6 +85,9 @@ services:
# O novo container só entra em serviço APÓS passar no healthcheck
start_period: 180s
# PostgreSQL: usando o servico 'postgres' existente na rede traefik_public
# Nao e necessario definir aqui pois ja existe um servico global
convex_backend:
# Versao estavel - crons movidos para /api/cron/* chamados via crontab do Linux
image: ghcr.io/get-convex/convex-backend:precompiled-2025-12-04-cc6af4c
@ -159,7 +166,7 @@ services:
- traefik_public
volumes:
sistema_db:
sistema_db: # Mantido para rollback caso necessário (SQLite)
convex_data:
networks: