diff --git a/.env.example b/.env.example index 7341e51..b9f62fc 100644 --- a/.env.example +++ b/.env.example @@ -17,6 +17,7 @@ PORT=3007 NODE_ENV="production" # production | development | test TZ="Europe/Madrid" # Zona horaria usada para "hoy/mañana" y render de fechas WEB_BASE_URL="https://taskbot.server.brobert.net" # Host público de la web (p.ej. https://wtask.org en producción) +# DB_PATH="./data/tasks.db" # Si se define, ignora DATA_DIR y usa esta ruta exacta # Sincronización de grupos (opcional) # Intervalo en milisegundos; por defecto 86400000 (24h). En desarrollo puede bajarse (mínimo recomendable 10000ms). diff --git a/docs/operations.md b/docs/operations.md index 3ed7b8b..3b1960b 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -21,6 +21,7 @@ Variables de entorno (principales) - ALLOWED_GROUPS: lista separada por comas de group_id@g.us para sembrado inicial en arranque. Ej.: ALLOWED_GROUPS='12345-67890@g.us, 11111-22222@g.us' - NOTIFY_ADMINS_ON_DISCOVERY: 'true'/'false' para avisar por DM a ADMIN_USERS al descubrir un grupo (modo 'discover'). Ej.: NOTIFY_ADMINS_ON_DISCOVERY='true' - DATA_DIR: directorio base para la base de datos SQLite (por defecto ./data). +- DB_PATH: ruta absoluta o relativa al archivo SQLite; si se define, tiene prioridad sobre DATA_DIR. Ej.: DB_PATH='./data/tasks.db' - WEB_BASE_URL: base pública de la interfaz web para construir enlaces absolutos (p. ej., /login?token=...). Obligatoria para /t web. Ej.: WEB_BASE_URL='https://wtask.org' Endpoints operativos diff --git a/src/db.ts b/src/db.ts index ac63fb0..8258c50 100644 --- a/src/db.ts +++ b/src/db.ts @@ -1,7 +1,7 @@ import { Database } from 'bun:sqlite'; import { normalizeWhatsAppId } from './utils/whatsapp'; import { mkdirSync } from 'fs'; -import { join, resolve } from 'path'; +import { join, resolve, dirname } from 'path'; import { Migrator } from './db/migrator'; function applyDefaultPragmas(instance: Database): void { @@ -20,6 +20,22 @@ function applyDefaultPragmas(instance: Database): void { // Function to get a database instance. Defaults to 'data/tasks.db' export function getDb(filename: string = 'tasks.db'): Database { + // Prioridad 1: DB_PATH (ruta completa al archivo). Si está definida, se usa tal cual. + const dbPathEnv = process?.env?.DB_PATH ? String(process.env.DB_PATH).trim() : ''; + if (dbPathEnv) { + const absolutePath = resolve(dbPathEnv); + // Crear directorio padre si no existe + try { + mkdirSync(dirname(absolutePath), { recursive: true }); + } catch (err) { + if ((err as any)?.code !== 'EEXIST') throw err; // Solo ignorar "ya existe" + } + const instance = new Database(absolutePath); + applyDefaultPragmas(instance); + return instance; + } + + // Prioridad 2: DATA_DIR + filename (comportamiento actual) // Determine base directory for the database (env DATA_DIR or default './data'), resolve to absolute const dataDir = process?.env?.DATA_DIR ? String(process.env.DATA_DIR) : 'data'; const dirPath = resolve(dataDir);