Konfiguration

Alle Umgebungsvariablen, die Checky liest, mit Standardwerten — dieselben Namen auf Docker und Cloudflare Workers.

Checky wird über Umgebungsvariablen konfiguriert. Docker liest sie aus der .env neben der docker-compose.yml (Rechte 600); auf Cloudflare sind es Worker-Variablen, Secrets per wrangler secret put NAME. Ungültige Werte stoppen den Server beim Start mit einer Liste der Probleme.

Im Produktivbetrieb (NODE_ENV=production, Standard im Docker-Image) lehnt Checky Secrets aus Beispieldateien ab (Werte mit change-me oder dev-only-insecure). Erzeug Secrets mit openssl rand -base64 48.

Pflicht

Variable Standard Beschreibung
BASE_URL http://localhost:3000 Öffentliche URL, produktiv https://, ohne Schrägstrich am Ende. Links in E-Mails, Passkeys, OAuth- und SSO-Callbacks nutzen sie. Auf Workers leer = URL der ersten Anfrage.
BETTER_AUTH_SECRET — (produktiv Pflicht) ≥ 32 Zeichen. Signiert Sitzungen; ein Wechsel meldet alle ab.
APP_SECRET BETTER_AUTH_SECRET ≥ 32 Zeichen. One-Tap-Links, Antwortadressen, Verschlüsselung der SSO-Secrets. Ein Wechsel macht offene E-Mail-Links ungültig, SSO-Client-Secrets müssen neu eingetragen werden.

Server und Datenbank (Docker)

Variable Standard Beschreibung
NODE_ENV production im Image development, test oder production.
PORT / HOST 3000 / 0.0.0.0 Adresse im Container.
DATABASE_URL /data/checky.db im Image Pfad der SQLite-Datei oder eine libsql-URL (DATABASE_AUTH_TOKEN für entferntes libsql).
CHECKY_IMAGE ghcr.io/sonnenglas/checky:latest Nur Compose: das Image. Produktiv x.y festlegen.
CHECKY_PORT 3000 Nur Compose: der Port auf dem Host.
TRUST_PROXY false true hinter Caddy/Traefik/nginx: Die Client-IP fürs Rate Limiting kommt dann aus CLIENT_IP_HEADERS. Ohne werden Forwarding-Header ignoriert (die könnte jeder fälschen).
CLIENT_IP_HEADERS x-forwarded-for Header, in die dein Proxy die Client-IP schreibt (der Eintrag ganz rechts zählt).
TRUSTED_ORIGINS — Weitere Origins (kommagetrennt), die die Auth-Endpunkte aufrufen dürfen.
MULTI_ORG false true nur für eine gehostete Instanz mit mehreren Organisationen.

E-Mail

Variable Standard Beschreibung
EMAIL_FROM Checky <checky@localhost> Absender, z. B. Checky <[email protected]>. Die Domain muss bei deinem Anbieter verifiziert sein.
SMTP_URL — smtps://user:[email protected]:465 oder Port 587 mit smtp://… (STARTTLS). Nur Docker.
EMAIL_TRANSPORT smtp, wenn SMTP_URL gesetzt ist, sonst console console loggt E-Mails nur. Auf Workers: cloudflare (Standard mit Binding) oder console.
EMAIL_REPLY_DOMAIN — Domain, die Antworten an reply+<token>@… empfängt. Leer = Antworten per Reply aus.
INBOUND_WEBHOOK_SECRET — ≥ 16 Zeichen. Aktiviert POST /api/v1/inbound/email (Mailgun, Postmark, SendGrid, generisch).

Details: E-Mail einrichten.

Scheduler

Variable Standard Beschreibung
SCHEDULER_ENABLED true Scheduler im Prozess (Docker). Nur false, wenn ein anderer Prozess tickt.
SCHEDULER_CRON * * * * * Cron-Muster des Ticks (Check-ins anlegen, Verpasste markieren, Erinnerungen senden, Webhooks zustellen).

Anmeldung und SSO

Variable Standard Beschreibung
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET — Anmeldung mit Google. Redirect-URI <BASE_URL>/api/auth/callback/google.
MICROSOFT_CLIENT_ID / MICROSOFT_CLIENT_SECRET — Anmeldung mit Microsoft. Redirect-URI <BASE_URL>/api/auth/callback/microsoft.
MICROSOFT_TENANT_ID common Deine Verzeichnis-ID: Dann werden Microsoft-Anmeldungen per E-Mail mit bestehenden Konten verknüpft.
SSO_ALLOW_PRIVATE_IDP false Identity Provider unter http:// oder einer privaten Adresse erlauben (internes Keycloak). Dessen Origin zusätzlich in TRUSTED_ORIGINS eintragen.
DNS_OVER_HTTPS_URL https://cloudflare-dns.com/dns-query DNS-over-HTTPS-Endpunkt (JSON-API) für die TXT-Abfrage bei der Domain-Verifizierung. Zeig ihn auf deinen eigenen Resolver, wenn ausgehendes DoH gesperrt ist.

Integrationen

Variable Standard Beschreibung
API_RATE_LIMIT 600 REST-API-Anfragen pro Minute und Person bzw. API-Key (0 = unbegrenzt).
OAUTH_CIMD true OAuth Client ID Metadata Documents (ChatGPT/Claude) akzeptieren; abgerufen mit einem SSRF-sicheren Client.
WEBHOOKS_ALLOW_PRIVATE false Webhook-Ziele unter http:// und in privaten Netzen erlauben (nur Self-Hosting hinter einer Firewall).
OPENAI_APPS_CHALLENGE — Token zur Domain-Verifizierung unter /.well-known/openai-apps-challenge.
HOLIDAYS_API_URL https://date.nager.at Quelle für Feiertage (Nager.Date-kompatible API) beim Feiertagsimport. Zeig sie auf ein selbst betriebenes Nager.Date, wenn dein Server nicht ins Internet kommt.

Lizenz und Updates (Self-Hosting)

Variable Standard Beschreibung
CHECKY_LICENSE_KEY — Dein Lizenzschlüssel aus dem checky.team-Konto. Wird offline geprüft; nichts wird irgendwohin geschickt.
UPDATE_CHECK_URL https://checky.team/versions.json Release-Feed für den Hinweis „Update verfügbar“ bei Admins — ein schlichtes GET ohne Daten über deine Instanz. Leer = aus.

Backups (Docker + Litestream)

LITESTREAM_BUCKET, LITESTREAM_PATH (Standard checky), LITESTREAM_ENDPOINT, LITESTREAM_REGION, LITESTREAM_ACCESS_KEY_ID, LITESTREAM_SECRET_ACCESS_KEY — siehe Backups und Updates.

Nur gehostet und Demo

PROVISIONING_SECRET, HOSTED_DOMAIN, HOSTED_RESERVED_SLUGS, HOSTED_FALLBACK_URL betreiben eine Multi-Tenant-Instanz (MULTI_ORG=true); DEMO_MODE und DEMO_RESET_HOUR betreiben die öffentliche Demo, die jede Nacht alle Daten löscht — setz sie nie auf einer echten Instanz.

Nur für Tests — nie produktiv

Variable Standard Beschreibung
ACCEPTANCE_MODE aus Schaltet die Uhr-Steuerung frei, mit der Checkys Release-Abnahmetests Tage und Wochen simulieren. Standardmäßig aus.
ACCEPTANCE_SECRET — Gemeinsames Secret, das die Abnahmetests mitschicken müssen; ohne bleibt die Steuerung aus.

Die gibt es, damit jedes Release vor der Auslieferung durchgängig getestet werden kann. Setz sie nie auf einer Installation mit echten Daten.

Du kommst nicht weiter? Wir helfen bei der Installation: schreib uns