Files
Florian-netz/.env.example
Matthias Hochmeister d50ec765ab Workstream 10: Deployment (Docker + externes Traefik) (Phase 7)
Liefert das reproduzierbare Compose-Setup hinter EXTERNEM Traefik:

- Dockerfile (multi-stage deps/builder/runner, Next.js standalone, non-root
  UID/GID 1001, HEALTHCHECK gegen /api/health).
- docker/entrypoint.sh: wartet via pg_isready auf Postgres, wendet Migrationen
  idempotent an (docker/migrate.mjs, plain ESM ohne tsx/drizzle-kit), optionaler
  Seed (RUN_SEED), dann exec node server.js.
- docker-compose.yml: genau vier Services (app, postgres, osrm, nominatim),
  KEIN Proxy-Service; externes traefik-Netz + internes Netz; Traefik-Labels
  (Host, websecure, tls.certresolver, Security-Header-Middleware);
  Postgres-/App-Healthchecks; AUTH_URL/AUTH_TRUST_HOST/Forwarded-Header.
- docker-compose.override.yml.example: lokal :3000 ohne TLS (http AUTH_URL).
- .dockerignore, Makefile (build/up/down/logs/deploy/data/config).
- .env.example: voller Vertrag inkl. APP_HOST, TRAEFIK_*, POSTGRES_*, RUN_SEED.
- docs/reference/deployment-traefik.md: externes Netz, Authentik-Redirect-URI
  https://${APP_HOST}/api/auth/callback/authentik, Forwarded-Header/Cookies,
  /api/health-Allowlist.
- tests/unit/deployment.test.ts (TDD): statische Offline-Verifikation der
  Artefakte; vitest.config.ts nimmt tests/unit/** auf.

Offline verifiziert: tsc --noEmit sauber; vitest run grün (200 passed,
7 db-roundtrip skipped); next build erzeugt .next/standalone/server.js;
sh -n docker/entrypoint.sh ok; make -n deploy zeigt build->up.
Deferred (kein Docker/Postgres in der Sandbox): docker build/run id -u=1001,
docker compose config --services, /api/health anonym 200, End-to-End Traefik.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 12:35:45 +02:00

41 lines
1.5 KiB
Plaintext

# FlorianNetz — Umgebungsvariablen (Beispiel; KEINE echten Geheimnisse committen)
# Node
NODE_ENV=development
# Datenbank (Postgres)
DATABASE_URL=postgres://floriannetz:floriannetz@localhost:5432/floriannetz
# Auth.js / NextAuth
# AUTH_SECRET muss >= 32 Zeichen sein (z. B. `openssl rand -base64 32`)
AUTH_SECRET=bitte-mindestens-32-zeichen-langes-geheimnis-setzen
# AUTH_URL bestimmt Cookie-secure: http:// = lokal (unsicher), https:// = Produktion
AUTH_URL=http://localhost:3000
AUTH_TRUST_HOST=true
# Authentik (OIDC-Provider)
AUTHENTIK_ISSUER=http://localhost:9000/application/o/floriannetz/
AUTHENTIK_CLIENT_ID=floriannetz
AUTHENTIK_CLIENT_SECRET=bitte-setzen
# Geo (interne Dienste; Defaults zeigen auf Docker-Compose-Hostnamen)
OSRM_URL=http://osrm:5000
NOMINATIM_URL=http://nominatim:8080
GEO_HTTP_TIMEOUT_MS=4000
HAVERSINE_KMH=50
# Deployment / externes Traefik
# APP_HOST ist der öffentliche Hostname (Traefik-Routing + AUTH_URL-Basis).
# In Produktion: AUTH_URL=https://${APP_HOST} und AUTH_TRUST_HOST=true setzen.
APP_HOST=floriannetz.example.at
# Traefik-Zertifikatsauflöser (muss in der externen Traefik-Instanz definiert sein).
TRAEFIK_CERTRESOLVER=letsencrypt
# Name des externen, von Traefik verwalteten Docker-Netzes.
TRAEFIK_NETWORK=traefik
# Optionaler Katalog-Seed beim Container-Start (idempotent).
RUN_SEED=false
# Postgres-Zugangsdaten für den Compose-Postgres-Service.
POSTGRES_USER=floriannetz
POSTGRES_PASSWORD=floriannetz
POSTGRES_DB=floriannetz