diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md index ad58aa8..527565e 100644 --- a/DEPLOYMENT.md +++ b/DEPLOYMENT.md @@ -31,7 +31,7 @@ Optional same-origin pattern: 3. Add resource `omo-bot-dashboard` from this repository: - Base directory: `admin-dashboard` - Build command: `npm run build` - - Publish directory: `dist` + - Publish directory: `/` - Internal port: `80` (typical static web port behind Coolify) 4. Configure domains for each resource and enable TLS certificates. diff --git a/src/config.ts b/src/config.ts index 3c876e7..97d34fe 100644 --- a/src/config.ts +++ b/src/config.ts @@ -207,6 +207,7 @@ async function loadConfigOverridesFromDatabase( } function buildConfig(readConfig: ConfigReader): BotConfig { + const discordClientId = readConfig("DISCORD_CLIENT_ID")?.trim(); const discordGuildId = readConfig("DISCORD_GUILD_ID"); const callSheetMessageId = readConfig("CALL_SHEET_MESSAGE_ID"); const callSheetOnboardedRoleId = readConfig("CALL_SHEET_ONBOARDED_ROLE_ID"); @@ -266,12 +267,19 @@ function buildConfig(readConfig: ConfigReader): BotConfig { const openmicSyncToken = readConfig("OPENMIC_SYNC_TOKEN")?.trim(); const oauthBridgeEnabled = Boolean(oauthBridgeClientSecret) && Boolean(oauthBridgeRedirectUri); + + if (oauthBridgeEnabled && !discordClientId) { + throw new Error( + "Missing required configuration value: DISCORD_CLIENT_ID (required when OAuth bridge is enabled)", + ); + } + const configurationDatabaseEnabled = readConfig("CONFIG_DB_ENABLED") === "false" ? false : Boolean(databaseUrl); return { discordToken: readRequiredValue(readConfig, "DISCORD_TOKEN"), - discordClientId: readRequiredValue(readConfig, "DISCORD_CLIENT_ID"), + discordClientId: discordClientId ?? "", ...(discordGuildId ? { discordGuildId } : {}), callSheet: { ...(callSheetMessageId ? { messageId: callSheetMessageId } : {}), @@ -475,17 +483,15 @@ export async function loadRuntimeConfig(): Promise { return loadConfig(); } + let overrides: Map; try { - const overrides = await loadConfigOverridesFromDatabase( - databaseUrl, - guildScope, - ); - - return buildConfig((name) => overrides.get(name) ?? process.env[name]); + overrides = await loadConfigOverridesFromDatabase(databaseUrl, guildScope); } catch (error: unknown) { console.warn( - `Falling back to environment config. Config DB overrides unavailable: ${String(error)}`, + `Config DB unavailable. Falling back to environment config: ${String(error)}`, ); return loadConfig(); } + + return buildConfig((name) => overrides.get(name) ?? process.env[name]); } diff --git a/src/deploy-commands.ts b/src/deploy-commands.ts index 0af0b1c..b43b6a7 100644 --- a/src/deploy-commands.ts +++ b/src/deploy-commands.ts @@ -5,6 +5,12 @@ import { loadRuntimeConfig } from "./config"; async function registerCommands(): Promise { const config = await loadRuntimeConfig(); + if (!config.discordClientId) { + throw new Error( + "DISCORD_CLIENT_ID required for command registration. Set it in bot_settings or environment.", + ); + } + const rest = new REST({ version: "10" }).setToken(config.discordToken); const body = commands.map((command) => command.data.toJSON());