feat: Add validation for DISCORD_CLIENT_ID in command registration and update deployment guide for dashboard publish directory
CI-CD / Dashboard Lint Build (push) Successful in 12s
CI-CD / Deploy to Coolify (push) Failing after 3s
CI-CD / Bot Lint Test Build (push) Successful in 1m21s

This commit is contained in:
2026-05-17 19:28:24 +02:00
parent 2c4408be05
commit ff58566989
3 changed files with 21 additions and 9 deletions
+1 -1
View File
@@ -31,7 +31,7 @@ Optional same-origin pattern:
3. Add resource `omo-bot-dashboard` from this repository: 3. Add resource `omo-bot-dashboard` from this repository:
- Base directory: `admin-dashboard` - Base directory: `admin-dashboard`
- Build command: `npm run build` - Build command: `npm run build`
- Publish directory: `dist` - Publish directory: `/`
- Internal port: `80` (typical static web port behind Coolify) - Internal port: `80` (typical static web port behind Coolify)
4. Configure domains for each resource and enable TLS certificates. 4. Configure domains for each resource and enable TLS certificates.
+14 -8
View File
@@ -207,6 +207,7 @@ async function loadConfigOverridesFromDatabase(
} }
function buildConfig(readConfig: ConfigReader): BotConfig { function buildConfig(readConfig: ConfigReader): BotConfig {
const discordClientId = readConfig("DISCORD_CLIENT_ID")?.trim();
const discordGuildId = readConfig("DISCORD_GUILD_ID"); const discordGuildId = readConfig("DISCORD_GUILD_ID");
const callSheetMessageId = readConfig("CALL_SHEET_MESSAGE_ID"); const callSheetMessageId = readConfig("CALL_SHEET_MESSAGE_ID");
const callSheetOnboardedRoleId = readConfig("CALL_SHEET_ONBOARDED_ROLE_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 openmicSyncToken = readConfig("OPENMIC_SYNC_TOKEN")?.trim();
const oauthBridgeEnabled = const oauthBridgeEnabled =
Boolean(oauthBridgeClientSecret) && Boolean(oauthBridgeRedirectUri); 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 = const configurationDatabaseEnabled =
readConfig("CONFIG_DB_ENABLED") === "false" ? false : Boolean(databaseUrl); readConfig("CONFIG_DB_ENABLED") === "false" ? false : Boolean(databaseUrl);
return { return {
discordToken: readRequiredValue(readConfig, "DISCORD_TOKEN"), discordToken: readRequiredValue(readConfig, "DISCORD_TOKEN"),
discordClientId: readRequiredValue(readConfig, "DISCORD_CLIENT_ID"), discordClientId: discordClientId ?? "",
...(discordGuildId ? { discordGuildId } : {}), ...(discordGuildId ? { discordGuildId } : {}),
callSheet: { callSheet: {
...(callSheetMessageId ? { messageId: callSheetMessageId } : {}), ...(callSheetMessageId ? { messageId: callSheetMessageId } : {}),
@@ -475,17 +483,15 @@ export async function loadRuntimeConfig(): Promise<BotConfig> {
return loadConfig(); return loadConfig();
} }
let overrides: Map<string, string>;
try { try {
const overrides = await loadConfigOverridesFromDatabase( overrides = await loadConfigOverridesFromDatabase(databaseUrl, guildScope);
databaseUrl,
guildScope,
);
return buildConfig((name) => overrides.get(name) ?? process.env[name]);
} catch (error: unknown) { } catch (error: unknown) {
console.warn( 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 loadConfig();
} }
return buildConfig((name) => overrides.get(name) ?? process.env[name]);
} }
+6
View File
@@ -5,6 +5,12 @@ import { loadRuntimeConfig } from "./config";
async function registerCommands(): Promise<void> { async function registerCommands(): Promise<void> {
const config = await loadRuntimeConfig(); 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 rest = new REST({ version: "10" }).setToken(config.discordToken);
const body = commands.map((command) => command.data.toJSON()); const body = commands.map((command) => command.data.toJSON());