From 96afe8dcb7fb517c00a4e8486c7420abd8981c70 Mon Sep 17 00:00:00 2001 From: MayaTheShy Date: Sun, 22 Mar 2026 21:22:30 -0400 Subject: [PATCH] Fix silent Docker crash: recursive chown, db error handling - Entrypoint: chown -R /data (not just the directory) so existing volume files owned by root become writable by node user - Entrypoint: add echo logging so startup progress is visible - db.js: verify /data is writable before opening SQLite - db.js: wrap Database() constructor in try-catch with clear error message instead of crashing silently at ESM import time --- web/server/db.js | 22 ++++++++++++++++++++-- web/server/docker-entrypoint.sh | 6 +++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/web/server/db.js b/web/server/db.js index a3d4a3a..3f38902 100644 --- a/web/server/db.js +++ b/web/server/db.js @@ -1,16 +1,32 @@ import Database from 'better-sqlite3'; -import { existsSync, mkdirSync } from 'fs'; +import { existsSync, mkdirSync, accessSync, constants as fsConstants } from 'fs'; import { dirname } from 'path'; const DB_PATH = process.env.DB_PATH || '/data/inventory.db'; +console.log(`[db] Opening database at ${DB_PATH} (uid=${process.getuid()})`); + // Ensure the directory exists const dbDir = dirname(DB_PATH); if (!existsSync(dbDir)) { mkdirSync(dbDir, { recursive: true }); } -const db = new Database(DB_PATH); +// Verify directory is writable before opening SQLite +try { + accessSync(dbDir, fsConstants.W_OK); +} catch { + console.error(`[db] FATAL: directory ${dbDir} is not writable by uid ${process.getuid()}`); + process.exit(1); +} + +let db; +try { + db = new Database(DB_PATH); +} catch (err) { + console.error(`[db] FATAL: failed to open database: ${err.message}`); + process.exit(1); +} // Performance pragmas db.pragma('journal_mode = WAL'); @@ -19,6 +35,8 @@ db.pragma('foreign_keys = ON'); db.pragma('cache_size = -8000'); // 8MB cache db.pragma('temp_store = MEMORY'); +console.log('[db] Database ready'); + // ========== Schema ========== db.exec(` diff --git a/web/server/docker-entrypoint.sh b/web/server/docker-entrypoint.sh index 042a099..4d37600 100755 --- a/web/server/docker-entrypoint.sh +++ b/web/server/docker-entrypoint.sh @@ -1,9 +1,13 @@ #!/bin/sh set -e +echo "[entrypoint] Starting up..." + # Ensure data directory exists and is writable by the node user mkdir -p /data -chown node:node /data +chown -R node:node /data +echo "[entrypoint] /data permissions fixed" # Drop privileges and exec the CMD +echo "[entrypoint] Dropping to user 'node', running: $*" exec su-exec node "$@"