fix(prisma): garantir DATABASE_URL efetivo no runtime\n\n- Força resolução do DATABASE_URL ao instanciar PrismaClient com fallback seguro em produção para file:/app/data/db.sqlite.\n- Evita falha "Error code 14: Unable to open the database file" quando o runtime cai em path relativo do .env dentro do container.\n- Compatível com stack.yml (volume sistema_db montado em /app/data).

This commit is contained in:
Esdras Renan 2025-10-09 16:22:01 -03:00
parent 06c4efd173
commit d031acf7b8
2 changed files with 18 additions and 4 deletions

View file

@ -99,11 +99,13 @@ Acesso
## Zerodowntime (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 selfhosted 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:

View file

@ -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