Core — Pflicht beim Start

Werden in src/index.ts beim Start geprüft und werfen wenn sie fehlen. Niemals ohne sie produktiv gehen.

DATABASE_URLPflicht

PostgreSQL-Connection-String. Von api und storage gelesen.

postgres://cms:cms@postgres:5432/cms
BETTER_AUTH_SECRETPflicht

Mindestens 32 Zeichen. Signiert Session-Cookies und hashiert Access-Tokens at-rest. Rotation invalidiert alle Tokens und Sessions.

openssl rand -hex 32
STORAGE_SECRETPflicht

Mindestens 32 Zeichen. Gemeinsames HMAC-Secret zwischen api (stellt Upload-Tokens aus) und storage (verifiziert sie). Muss auf beiden Services identisch sein.

openssl rand -hex 32
S3_ENDPOINTPflicht

S3-kompatibler Endpunkt, gegen den der Storage-Service spricht.

http://minio:9000
S3_ACCESS_KEYPflicht

S3-Access-Key-ID für den Asset-Bucket.

S3_SECRET_KEYPflicht

S3-Secret-Access-Key für den Asset-Bucket.

S3_BUCKETPflicht

Bucket, der die Asset-Blobs hält. Keys haben die Form spaces/<id>/assets/<n>/<filename>.

cms

URLs & Netzwerk

PUBLIC_URLOptionalDefault: http://localhost:8080

Basis-URL der Installation. Landet in Better-Auths Trusted-Origins, OIDC-Redirect-URIs, Webhook-Payloads und Asset-URLs. In Produktion auf den externen HTTPS-Hostnamen setzen.

https://cms.example.com
PUBLIC_HOSTOptionalDefault: localhost

Reiner Hostname (ohne Schema, ohne Port). Wird in der Caddyfile und als OIDC-RP-ID verwendet.

cms.example.com
BETTER_AUTH_URLOptional

Überschreibt Better-Auths Callback-URL. Default ist PUBLIC_URL — nur setzen, wenn der Callback-Origin vom Public-Frontend-Origin abweicht.

PORTOptional

Listen-Port des Services. Defaults pro Service: api 3001, storage 3002, admin 3000.

HOSTOptionalDefault: 0.0.0.0

Bind-Adresse des Services. In Containern auf 0.0.0.0 lassen; für lokale Binds auf 127.0.0.1 setzen.

PROXY_PORTOptionalDefault: 8080

Listen-Port des Caddy-Reverse-Proxys.

API_UPSTREAMOptionalDefault: api:3001

Caddyfile-Upstream-Ziel für /api/*-Routen.

ADMIN_UPSTREAMOptionalDefault: admin:3000

Caddyfile-Upstream-Ziel für / (Admin-UI).

STORAGE_UPSTREAMOptionalDefault: storage:3002

Caddyfile-Upstream-Ziel für /storage/*-Routen.

INTERNAL_STORAGE_URLOptionalDefault: http://localhost:3002

URL, über die die api den storage für Privacy-Lookups anspricht. In Docker auf http://storage:3002 setzen.

API_URLOptionalDefault: http://api:3001

URL, über die der storage die api für Privacy-Cross-Checks anspricht.

TRUSTED_ORIGINS_EXTRAOptional

Komma-separierte Liste weiterer CORS-Origins neben PUBLIC_URL. Hier Staging- oder eigene Preview-Hostnamen eintragen.

https://preview.example.com,https://stage.example.com

Auth, Sessions, OIDC

Wird OIDC_ISSUER_URL gesetzt, wechselt die Installation in den OIDC-only-Modus — Email+Passwort-Login wird automatisch deaktiviert.

OIDC_ISSUER_URLOptional

Discovery-URL des OIDC-Providers. Vorhandensein schaltet OIDC-only-Modus ein.

https://auth.example.com/realms/main
OIDC_CLIENT_IDOptional

OIDC-Client-ID. Pflicht, wenn OIDC_ISSUER_URL gesetzt ist.

osstblok
OIDC_CLIENT_SECRETOptional

OIDC-Client-Secret. Pflicht, wenn OIDC_ISSUER_URL gesetzt ist.

OIDC_PROVIDER_IDOptionalDefault: oidc

Interner Identifier des Providers. Erscheint in Better-Auths Account-Tabelle.

OIDC_DISPLAY_NAMEOptionalDefault: Single Sign-On

Beschriftung des SSO-Buttons auf der Login-Seite.

OIDC_SCOPESOptionalDefault: openid profile email

Komma- oder leerzeichensepariert angefragte OIDC-Scopes.

OIDC_TRUST_EMAILOptional

Auf 'true' setzen, um der Email-Claim des IdP zu vertrauen und OIDC- + Email-Accounts mit übereinstimmender verifizierter Email zu mergen. Opt-in — standardmässig aus.

EMAIL_VERIFICATIONOptional

Auf 'off' setzen, um Email-Verifikation im Signup zu überspringen. Nur für Dev — in Produktion an lassen.

DISABLE_SIGNUPOptional

Auf 'true' setzen, um Email-Signup komplett zu deaktivieren. OIDC-Login bleibt aktiv.

SIGNUP_ALLOWED_DOMAINSOptional

Komma-separierte Liste erlaubter Signup-Email-Domänen. Leer = alle Domänen erlaubt.

example.com,acme.org
MAX_SPACES_PER_USEROptionalDefault: 0

Maximale Anzahl Spaces pro User. 0 = unbegrenzt.

Storage & Image-Pipeline

S3_REGIONOptionalDefault: us-east-1

S3-Region-Name. Für echtes AWS S3 die tatsächliche Region eintragen; für Minio beliebig.

MAX_UPLOAD_BYTESOptionalDefault: 52428800

Maximale Upload-Grösse in Bytes. Default 50 MB.

ALLOWED_CONTENT_TYPESOptional

Komma-separierte Liste erlaubter Upload-MIME-Typen. Leer = eingebaute Default-Liste (Bilder, PDF, Video, Audio, Fonts).

ALLOW_AVIFOptional

Auf '1' setzen, um AVIF-Output in der Image-Pipeline zu aktivieren. Default aus, weil das Encoding langsam ist.

TRANSFORM_CONCURRENCYOptionalDefault: 4

Parallele Image-Transform-Jobs pro Storage-Prozess. Auf Many-Core-Maschinen erhöhen; auf speicher-knappen Hosts senken.

PRIVACY_CACHE_TTL_SECOptionalDefault: 300

Wie lange (Sekunden) der Storage-Service Privacy-Flag-Lookups aus der api cached, bevor er neu nachfragt.

STORAGE_RATE_LIMIT_PER_MINOptionalDefault: 500

Request-Budget pro IP und Minute für den Storage-Service.

Cache & CDN

REDIS_URLOptional

Redis-Connection-URL. Leer → Cache-Client ist stiller No-Op (kein try/catch, keine Fehler, nur langsamer). Gesetzt → CDN-Responses und Link-Maps werden kurzlebig gecacht.

redis://redis:6379

Outbound-Fetches & SSRF-Guard

Jeder fetch() mit user-beeinflusster URL läuft durch assertSafeOutboundUrl. Diese Knobs steuern was erlaubt ist.

OUTBOUND_ALLOW_LOOPBACKOptionalDefault: 0

Escape-Hatch des SSRF-Guards. In Tests, die gegen einen lokalen Receiver fetchen, auf '1' setzen — niemals über NODE_ENV gaten.

IMPORT_MAX_ASSET_BYTESOptionalDefault: 52428800

Maximale Byte-Grösse für einen einzelnen Asset-Download während eines Storyblok-Imports.

ASSET_FROM_URL_MAX_BYTESOptional

Maximale Grösse für POST /v1/spaces/:id/assets/from_url-Downloads. Default ist IMPORT_MAX_ASSET_BYTES.

MCP

MCP_TOOL_CALL_LIMITOptionalDefault: 200

Maximale MCP-Tool-Calls im Sliding-Window (pro Token).

OSSTBLOK_MCP_DEBUGOptional

Auf 'true' setzen für ausführliches MCP-Request/Response-Logging. In Produktion nicht an lassen — Payloads können Content enthalten.

Testing & Dev-Tools

DATABASE_URL_TESTOptionalDefault: postgres://cms:cms@localhost:5433/cms_test

Connection-String ausschliesslich während bun test. Drizzle läuft gegen diese DB — echte Daten bleiben unberührt.

NODE_ENVOptional

Auf 'production' setzen, um OIDC-Validation zu härten und SSRF-Warnungen bei erlaubtem Loopback zu emittieren. Kein Config-Switch — keine Business-Logik daran hängen.

PREVIEW_URLOptionalDefault: http://localhost:3000

Default-Ziel für den Preview-Redirect-Helper des Admins. Auf Frontend-Demo- / Docs-Site setzen.

SMOKE_HOSTOptional

LAN-IP für ./scripts/smoke-test.sh. Wird standardmässig per 'hostname -I' ermittelt — nur überschreiben, wenn das falsche Interface erkannt wird.

Infrastruktur-Defaults

Sitzen in docker-compose.yml und konfigurieren die Backing-Container, nicht den App-Code direkt. Änderungen heißt den entsprechenden Container neu bauen / recreaten.

POSTGRES_USER / POSTGRES_PASSWORD / POSTGRES_DBOptionalDefault: cms / cms / cms

Credentials und DB-Name des Postgres-Containers. DATABASE_URL muss dazu passen.

MINIO_ROOT_USER / MINIO_ROOT_PASSWORDOptionalDefault: minioadmin / minioadmin

Minio-Admin-Credentials. In Produktion beide ersetzen — Minio bootet mit genau diesen Default-Werten.

NUXT_PUBLIC_API_BASEOptional

Client-seitige API-Basis-URL im Admin-UI. Leer lassen für einen relativen Pfad (same-origin über den Proxy).