From d031acf7b874949f27186f676331408d32393f46 Mon Sep 17 00:00:00 2001 From: Esdras Renan Date: Thu, 9 Oct 2025 16:22:01 -0300 Subject: [PATCH] =?UTF-8?q?fix(prisma):=20garantir=20DATABASE=5FURL=20efet?= =?UTF-8?q?ivo=20no=20runtime\n\n-=20For=C3=A7a=20resolu=C3=A7=C3=A3o=20do?= =?UTF-8?q?=20DATABASE=5FURL=20ao=20instanciar=20PrismaClient=20com=20fall?= =?UTF-8?q?back=20seguro=20em=20produ=C3=A7=C3=A3o=20para=20file:/app/data?= =?UTF-8?q?/db.sqlite.\n-=20Evita=20falha=20"Error=20code=2014:=20Unable?= =?UTF-8?q?=20to=20open=20the=20database=20file"=20quando=20o=20runtime=20?= =?UTF-8?q?cai=20em=20path=20relativo=20do=20.env=20dentro=20do=20containe?= =?UTF-8?q?r.\n-=20Compat=C3=ADvel=20com=20stack.yml=20(volume=20sistema?= =?UTF-8?q?=5Fdb=20montado=20em=20/app/data).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/OPERACAO-PRODUCAO.md | 8 +++++--- src/lib/prisma.ts | 14 +++++++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) 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