diff --git a/backend/src/database/db.js b/backend/src/database/db.js index db46d4c..324712d 100644 --- a/backend/src/database/db.js +++ b/backend/src/database/db.js @@ -1,7 +1,28 @@ +const fs = require('fs'); +const path = require('path'); const knex = require('knex'); const knexConfig = require('../../knexfile'); const logger = require('../utils/logger'); +// Ensure SQLite directory exists when using file-based DB (native installs) +try { + const isPostgres = knexConfig && knexConfig.client === 'pg'; + if (!isPostgres && knexConfig && knexConfig.connection) { + const filename = typeof knexConfig.connection === 'object' + ? knexConfig.connection.filename + : (typeof knexConfig.connection === 'string' ? knexConfig.connection : null); + if (filename && typeof filename === 'string') { + const dir = path.dirname(filename); + if (dir && dir !== '.') { + fs.mkdirSync(dir, { recursive: true }); + } + } + } +} catch (e) { + // Non-fatal: log and continue; SQLite will fail later if still missing + try { logger.warn('SQLite directory ensure failed', { error: e.message }); } catch (_) {} +} + // Create database connection with built-in retry logic const db = knex(knexConfig); @@ -312,4 +333,4 @@ async function logActivity(activityType, metadata = {}, eventId = null, actor = } } -module.exports = { db, initializeDatabase, logActivity, withRetry }; \ No newline at end of file +module.exports = { db, initializeDatabase, logActivity, withRetry }; diff --git a/scripts/setup.sh b/scripts/setup.sh index 8874b45..15a6de1 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -569,6 +569,9 @@ setup_native_installation() { cd "$NATIVE_APP_DIR/app/backend" npm install --production + # Ensure SQLite data directory exists for native installs + mkdir -p "$NATIVE_APP_DIR/app/backend/data" + # Generate secrets local jwt_secret=$(generate_jwt_secret) [[ -z "$ADMIN_PASSWORD" ]] && ADMIN_PASSWORD=$(generate_password)