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.