Der Voll-Abgleich hat den Administrator alle fünf Minuten hinausgeworfen: enforceMembership kannte BOOTSTRAP_ADMIN_IDS nicht und sah nur, dass keine seiner Rollen zur Anmeldung berechtigt. Solange das Rollen-Mapping noch leer ist, trifft das zwangsläufig zu - der Notfallzugang war damit genau in der Lage wirkungslos, für die es ihn gibt. Gefunden beim ersten Lauf gegen den echten Discord-Server, nicht im Test.
44 lines
1.5 KiB
TypeScript
44 lines
1.5 KiB
TypeScript
/**
|
|
* Der Worker teilt sich die .env mit der Web-App, braucht aber nur einen Teil
|
|
* davon. Fehlt etwas, stirbt der Prozess sofort mit klarer Meldung, damit der
|
|
* Fehler in Dockge am roten Container sichtbar wird und nicht im Lograuschen.
|
|
*/
|
|
export type WorkerEnv = {
|
|
databaseUrl: string
|
|
discordBotToken: string
|
|
discordGuildId: string
|
|
/**
|
|
* Notfallzugang. Diese Nutzer behalten ihre Sitzung, auch wenn keine ihrer
|
|
* Rollen zur Anmeldung berechtigt. Ohne das wirft der Voll-Abgleich den
|
|
* Administrator alle fünf Minuten hinaus — also genau dann, wenn er das
|
|
* Rollen-Mapping erst noch einrichten will.
|
|
* Siehe docs/03-auth-und-rechte.md.
|
|
*/
|
|
bootstrapAdminIds: string[]
|
|
/** Voll-Abgleich als Sicherheitsnetz, siehe docs/02-architektur.md. */
|
|
fullSyncIntervalMs: number
|
|
heartbeatIntervalMs: number
|
|
adminChannelId?: string
|
|
}
|
|
|
|
function required(name: string): string {
|
|
const value = process.env[name]
|
|
if (!value) throw new Error(`Konfiguration unvollständig: ${name} fehlt`)
|
|
return value
|
|
}
|
|
|
|
export function loadEnv(): WorkerEnv {
|
|
return {
|
|
databaseUrl: required('DATABASE_URL'),
|
|
discordBotToken: required('DISCORD_BOT_TOKEN'),
|
|
discordGuildId: required('DISCORD_GUILD_ID'),
|
|
bootstrapAdminIds: (process.env.BOOTSTRAP_ADMIN_IDS ?? '')
|
|
.split(',')
|
|
.map((id) => id.trim())
|
|
.filter(Boolean),
|
|
fullSyncIntervalMs: Number(process.env.WORKER_FULL_SYNC_MS ?? 5 * 60_000),
|
|
heartbeatIntervalMs: Number(process.env.WORKER_HEARTBEAT_MS ?? 30_000),
|
|
adminChannelId: process.env.DISCORD_ADMIN_CHANNEL_ID,
|
|
}
|
|
}
|