diff --git a/docs/OPERACAO-PRODUCAO.md b/docs/OPERACAO-PRODUCAO.md index 4533411..40410be 100644 --- a/docs/OPERACAO-PRODUCAO.md +++ b/docs/OPERACAO-PRODUCAO.md @@ -99,11 +99,13 @@ Acesso ## Zero‑downtime (sem queda durante deploy) -Para evitar interrupção perceptível no deploy, habilitamos rollout "start-first" e múltiplas réplicas nos serviços web e Convex. O Traefik continua roteando para as tasks saudáveis enquanto uma task reinicia. +Para evitar interrupção perceptível no deploy, habilitamos rollout "start-first". Para este projeto, mantemos **1 réplica** (web e Convex) por segurança, pois: +- O web usa SQLite (Prisma); múltiplas réplicas concorrendo gravação no mesmo arquivo podem causar erros de lock/readonly. +- O Convex backend self‑hosted não é clusterizado. O `stack.yml` já inclui: -- `replicas: 2` para `web` e `convex_backend`. -- `update_config.order: start-first` + `failure_action: rollback`. +- `replicas: 1` + `update_config.order: start-first` (Swarm sobe a nova task saudável antes de desligar a antiga). +- `failure_action: rollback`. - `healthcheck` por porta local, garantindo que o Swarm só troque quando a nova task estiver OK. Se quiser ajustar recursos/estratégia: diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts index 7a33526..0d4c72c 100644 --- a/src/lib/prisma.ts +++ b/src/lib/prisma.ts @@ -4,7 +4,19 @@ declare global { var prisma: PrismaClient | undefined } -export const prisma = global.prisma ?? new PrismaClient() +// Resolve a robust DATABASE_URL for all runtimes (prod/dev) +const resolvedDatabaseUrl = (() => { + const envUrl = process.env.DATABASE_URL?.trim() + if (envUrl && envUrl.length > 0) return envUrl + // Fallbacks by environment to ensure correctness in containers + if (process.env.NODE_ENV === "production") { + return "file:/app/data/db.sqlite" + } + return "file:./prisma/db.sqlite" +})() + +export const prisma = + global.prisma ?? new PrismaClient({ datasources: { db: { url: resolvedDatabaseUrl } } }) if (process.env.NODE_ENV !== "production") { global.prisma = prisma