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
This commit is contained in:
@@ -1,16 +1,32 @@
|
|||||||
import Database from 'better-sqlite3';
|
import Database from 'better-sqlite3';
|
||||||
import { existsSync, mkdirSync } from 'fs';
|
import { existsSync, mkdirSync, accessSync, constants as fsConstants } from 'fs';
|
||||||
import { dirname } from 'path';
|
import { dirname } from 'path';
|
||||||
|
|
||||||
const DB_PATH = process.env.DB_PATH || '/data/inventory.db';
|
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
|
// Ensure the directory exists
|
||||||
const dbDir = dirname(DB_PATH);
|
const dbDir = dirname(DB_PATH);
|
||||||
if (!existsSync(dbDir)) {
|
if (!existsSync(dbDir)) {
|
||||||
mkdirSync(dbDir, { recursive: true });
|
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
|
// Performance pragmas
|
||||||
db.pragma('journal_mode = WAL');
|
db.pragma('journal_mode = WAL');
|
||||||
@@ -19,6 +35,8 @@ db.pragma('foreign_keys = ON');
|
|||||||
db.pragma('cache_size = -8000'); // 8MB cache
|
db.pragma('cache_size = -8000'); // 8MB cache
|
||||||
db.pragma('temp_store = MEMORY');
|
db.pragma('temp_store = MEMORY');
|
||||||
|
|
||||||
|
console.log('[db] Database ready');
|
||||||
|
|
||||||
// ========== Schema ==========
|
// ========== Schema ==========
|
||||||
|
|
||||||
db.exec(`
|
db.exec(`
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
echo "[entrypoint] Starting up..."
|
||||||
|
|
||||||
# Ensure data directory exists and is writable by the node user
|
# Ensure data directory exists and is writable by the node user
|
||||||
mkdir -p /data
|
mkdir -p /data
|
||||||
chown node:node /data
|
chown -R node:node /data
|
||||||
|
echo "[entrypoint] /data permissions fixed"
|
||||||
|
|
||||||
# Drop privileges and exec the CMD
|
# Drop privileges and exec the CMD
|
||||||
|
echo "[entrypoint] Dropping to user 'node', running: $*"
|
||||||
exec su-exec node "$@"
|
exec su-exec node "$@"
|
||||||
|
|||||||
Reference in New Issue
Block a user