Files
AfiS-Aktensystem/worker/src/env.ts
T
Harlekin e0b03ea336
Prüfung / Lint, Typen, Tests (push) Canceled after 0s
Prüfung / Images bauen (pdf) (push) Canceled after 0s
Prüfung / Images bauen (web) (push) Canceled after 0s
Prüfung / Images bauen (worker) (push) Canceled after 0s
Images / bauen (pdf, docker/pdf.Dockerfile) (push) Canceled after 0s
Images / bauen (web, docker/web.Dockerfile) (push) Canceled after 0s
Images / bauen (worker, docker/worker.Dockerfile) (push) Canceled after 0s
Gedankenstriche durch Bindestriche ersetzt
375 Vorkommen in 210 Dateien. Betrifft Kommentare, Oberflaechentexte und die
README; an keiner Stelle Bedeutung, nur Zeichensetzung.
2026-09-04 08:54:52 +02:00

50 lines
1.8 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
/** Takt des Postausgangs als Sicherheitsnetz neben `notification_queued`. */
outboxIntervalMs: number
/** Steht in den Benachrichtigungen als Link. */
appUrl: 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,
outboxIntervalMs: Number(process.env.WORKER_OUTBOX_MS ?? 30_000),
appUrl: process.env.APP_URL ?? 'http://localhost:3000',
}
}