diff --git a/dashcaddy-api/credential-manager.js b/dashcaddy-api/credential-manager.js index 8acdeb1..56782e2 100644 --- a/dashcaddy-api/credential-manager.js +++ b/dashcaddy-api/credential-manager.js @@ -10,7 +10,26 @@ const lockfile = require('proper-lockfile'); const fs = require('fs'); const path = require('path'); -const CREDENTIALS_FILE = process.env.CREDENTIALS_FILE || path.join(__dirname, 'credentials.json'); +// Resolve credentials file path — supports both standard install (/app/credentials.json) +// and custom deployments with consolidated data directory (/app/data/credentials.json) +function resolveCredentialsFile() { + if (process.env.CREDENTIALS_FILE) { + return process.env.CREDENTIALS_FILE; + } + const candidates = [ + path.join(__dirname, 'credentials.json'), + path.join(__dirname, 'data', 'credentials.json'), + ]; + for (const candidate of candidates) { + if (fs.existsSync(candidate)) { + return candidate; + } + } + // No existing file — return standard path so first store() creates it there + return candidates[0]; +} + +const CREDENTIALS_FILE = resolveCredentialsFile(); class CredentialManager { constructor() { diff --git a/dashcaddy-api/crypto-utils.js b/dashcaddy-api/crypto-utils.js index 49fb7f9..3e76f25 100644 --- a/dashcaddy-api/crypto-utils.js +++ b/dashcaddy-api/crypto-utils.js @@ -15,8 +15,26 @@ const IV_LENGTH = 16; // 128 bits for GCM const AUTH_TAG_LENGTH = 16; const SALT_LENGTH = 32; -// Key file location (should be outside of mounted volumes for security) -const KEY_FILE = process.env.ENCRYPTION_KEY_FILE || path.join(__dirname, '.encryption-key'); +// Resolve encryption key file path — supports both standard install (/app/.encryption-key) +// and custom deployments with consolidated data directory (/app/data/.encryption-key) +function resolveKeyFile() { + if (process.env.ENCRYPTION_KEY_FILE) { + return process.env.ENCRYPTION_KEY_FILE; + } + const candidates = [ + path.join(__dirname, '.encryption-key'), + path.join(__dirname, 'data', '.encryption-key'), + ]; + for (const candidate of candidates) { + if (fs.existsSync(candidate)) { + return candidate; + } + } + // No existing file — return standard path so first load creates it there + return candidates[0]; +} + +const KEY_FILE = resolveKeyFile(); let encryptionKey = null;