// lib/config.js — env-driven configuration. All paths have server defaults; // SESSION_SECRET and ADMIN_PASSWORD_HASH are required. import path from 'node:path'; import { fileURLToPath } from 'node:url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); export const panelRoot = path.resolve(__dirname, '..'); function required(name) { const v = process.env[name]; if (!v) { console.error(`Missing required environment variable: ${name}`); console.error('See panel/README.md — generate ADMIN_PASSWORD_HASH with bin/hash-password.js.'); process.exit(1); } return v; } export const config = { port: Number(process.env.PANEL_PORT || 3900), host: '127.0.0.1', dbPath: process.env.PAAS_DB || '/srv/paas/paas.db', paasBin: process.env.PAAS_BIN || '/usr/local/bin/paas', buildDir: process.env.BUILD_DIR || '/srv/paas/builds', logDir: process.env.LOG_DIR || '/srv/paas/logs', appsDir: process.env.APPS_DIR || '/srv/apps', sessionSecret: required('SESSION_SECRET'), adminPasswordHash: required('ADMIN_PASSWORD_HASH'), deployKeyPub: process.env.DEPLOY_KEY_PUB || '/home/deploy/.ssh/id_ed25519.pub', baseUrl: (process.env.PANEL_BASE_URL || '').replace(/\/+$/, ''), schemaPath: process.env.PAAS_SCHEMA || path.join(panelRoot, '..', 'sql', 'schema.sql'), snapshotDir: process.env.SNAPSHOT_DIR || '/srv/paas/snapshots', chromiumBin: process.env.CHROMIUM_BIN || 'chromium', // Bearer token for GET /cmk-agent (Checkmk datasource pull); endpoint is // disabled when unset. cmkAgentToken: process.env.CMK_AGENT_TOKEN || '', }; // App names double as filesystem path segments and PM2 process names — // only path-join a name after this regex has validated it. export const NAME_RE = /^[a-z][a-z0-9-]{1,30}$/;