Files
craftvia/.env.coolify.example
T
msolarczekandClaude Opus 5 4d5be72ebb Website und App auf getrennten Domains (craftvia.de / app.craftvia.de)
Der Proxy trennt nach Host, sobald MARKETING_HOST gesetzt ist: craftvia.de zeigt nur die
Produktseiten und leitet Login, Testphase, App und API auf die App-Domain aus AUTH_URL um;
www leitet auf die Hauptdomain; auf der App-Domain landet / ohne Sitzung beim Login und
Produktseiten gehen zurück zur Website. Interne Aufrufe (Healthcheck) bleiben unverändert.
Links bleiben relativ, damit keine Domain im Image steckt.

Dazu Test scripts/test-host-routing.ts, Env-Vorlagen mit MARKETING_HOST und Registry,
scripts/generate-coolify-env.sh für lokal erzeugte Geheimnisse und DEPLOY.md §2.1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 09:08:47 +02:00

125 lines
5.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Referenz für die Coolify-Environment-Variablen (Testserver, intern).
# ECHTE Secrets NUR in Coolify eintragen – diese Datei enthält nur Platzhalter.
# In Coolify: Ressource -> Environment Variables (Bulk-Paste möglich).
# Hostnamen sind die Compose-Service-Namen (postgres/redis/garage), NICHT localhost.
# Betriebsdoku: docs/craftvia/DEPLOY.md
# --- Datenbank (Service "postgres") ---
POSTGRES_USER=craftvia
POSTGRES_PASSWORD=CHANGE_ME_db_password
POSTGRES_DB=craftvia
DATABASE_URL=postgresql://craftvia:CHANGE_ME_db_password@postgres:5432/craftvia?schema=public
# --- Row Level Security (F-04) ---
# Auf dem Testserver zunächst false (Owner-Betrieb). Zum Scharfschalten craftvia_app mit
# LOGIN + Passwort versehen (ALTER ROLE craftvia_app WITH LOGIN PASSWORD '<pw>';), dann:
RLS_ENFORCED=false
# RLS_DATABASE_URL=postgresql://craftvia_app:CHANGE_ME_app_password@postgres:5432/craftvia?schema=public
# --- Redis (Service "redis") ---
# F-18: Redis läuft mit requirepass. NUR REDIS_PASSWORD setzen — REDIS_URL wird in der
# docker-compose.coolify.yml daraus abgeleitet (redis://:${REDIS_PASSWORD}@redis:6379)
# und ist deshalb NICHT separat zu setzen (in Coolify sonst als „managed" gesperrt).
REDIS_PASSWORD=CHANGE_ME_redis_password
# --- Fertige Images (docker-compose.coolify.prebuilt.yml, DEPLOY.md §9) ---
REGISTRY=git.certvia.de/msolarczek
IMAGE_TAG=main
# --- Objektspeicher (Service "garage", S3-kompatibel) ---
# Garage ersetzt MinIO (Community EOL). Buckets/Keys legt NICHT die S3-API an, sondern
# der Init-Job "garage-provision" (Admin-API). S3_ACCESS_KEY/S3_SECRET_KEY sind der
# Garage-Key, den dieser Job importiert (App-Env == Garage). Garage erzwingt das Format:
# S3_ACCESS_KEY = "GK" + 24 Hex -> echo "GK$(openssl rand -hex 12)"
# S3_SECRET_KEY = 64 Hex -> openssl rand -hex 32
S3_ENDPOINT=http://garage:3900
S3_ACCESS_KEY=GK000000000000000000000000
S3_SECRET_KEY=CHANGE_ME_openssl_rand_hex_32
S3_BUCKET=craftvia-documents
S3_REGION=us-east-1
# Garage-Secrets: der Daemon liest sie aus der Env (NICHT in deploy/garage.toml).
# In Coolify LITERAL setzen, NICHT via ${...} referenzieren (Interpolationsfalle).
# GARAGE_RPC_SECRET: openssl rand -hex 32
# GARAGE_ADMIN_TOKEN: openssl rand -hex 32
GARAGE_RPC_SECRET=CHANGE_ME_openssl_rand_hex_32
GARAGE_ADMIN_TOKEN=CHANGE_ME_openssl_rand_hex_32
# Optional: Single-Node-Layout (nominal). Zone/Kapazität nur bei Bedarf überschreiben.
# GARAGE_ZONE=dc1
# GARAGE_CAPACITY_BYTES=100000000000
# --- Backup-Zielspeicher (optional) ---
# Ziel der Backup-/DSGVO-Artefakte ist im Betreiber-Portal (/admin/backup) waehlbar
# (Lokal/S3) und wird verschluesselt in der DB gehalten. Praezedenz: DB-Config →
# Env (S3_*/BACKUP_LOCAL_DIR) → lokaler Default. Sobald im Portal gespeichert, hat die
# DB-Config Vorrang. Fuer „Lokal" mountet die Compose-Datei das persistente Volume
# `backups` auf /app/.backups (app + backup-worker) — Pfad hier NICHT aendern, ausser
# der Mount wird angepasst.
BACKUP_LOCAL_DIR=/app/.backups
# BACKUP_ENC_KEY= (leer = AUTH_SECRET)
# --- Auth (Auth.js v5) ---
# AUTH_SECRET: openssl rand -base64 32
# AUTH_URL: exakt die Coolify-Domain des app-Service (http:// für intern)
AUTH_SECRET=CHANGE_ME_openssl_rand_base64_32
# PASSWORD_PEPPER (Härtung §1): openssl rand -hex 32 — frisch je Umgebung, NICHT rotierbar, nie ins Artefakt.
PASSWORD_PEPPER=CHANGE_ME_openssl_rand_hex_32
# MFA_ENC_KEY= (leer = aus AUTH_SECRET abgeleitet; nach dem Setzen nicht mehr ändern)
AUTH_URL=https://app.craftvia.de
# Website und App auf getrennten Domains (src/lib/marketing/hosts.ts): craftvia.de zeigt nur die
# Produktseiten, AUTH_URL-Domain die App. Beide Domains in Coolify beim Service "app" eintragen.
# Leer = alles auf einer Domain.
MARKETING_HOST=craftvia.de
# Hinter Reverse-Proxy (Coolify/Traefik) für Auth.js v5 zwingend, sonst UntrustedHost:
AUTH_TRUST_HOST=true
# --- Demo-Seed (NUR Testserver!) ---
# true => migrate-Job legt nach der Migration die Demo-Mandanten + Nutzer an
# (admin@demo.example / Demo1234!). In Produktion NICHT setzen / auf false lassen.
RUN_DEMO_SEED=true
# --- E-Mail (optional; ohne SMTP bleiben Mails "pending") ---
SMTP_HOST=
SMTP_PORT=1025
SMTP_SECURE=
SMTP_USER=
SMTP_PASSWORD=
SMTP_FROM=craftvia@example.com
MAIL_FROM_NAME=Craftvia
MAIL_REPLY_TO=
# Basis für absolute Links in Mails/PDFs; leer = AUTH_URL.
APP_BASE_URL=
# --- KI: Auftragsimport-Extraktion & Lotse (Anthropic, optional) ---
# Ohne ANTHROPIC_API_KEY: manuelle Erfassung, kein Lotse-Entwurf.
AI_EXTRACTION_PROVIDER=anthropic
ANTHROPIC_API_KEY=
ANTHROPIC_MODEL=
# --- KI: Transkription (Whisper-kompatibel, optional) ---
TRANSCRIPTION_PROVIDER=openai-compatible
TRANSCRIPTION_API_URL=https://api.openai.com/v1/audio/transcriptions
TRANSCRIPTION_API_KEY=
TRANSCRIPTION_MODEL=whisper-1
# --- KI: Kostenbremse & Aufbewahrung KI-Protokoll ---
# Tokens je Mandant je Kalendermonat (ein+aus), 0 = unbegrenzt.
AI_MONTHLY_TOKEN_LIMIT=0
# --- Craftvia: Testphase (L15, docs/craftvia/TESTPHASE.md) ---
# Längste selbst gewählte Testphase in Tagen (1–365); Vorbelegung im Wizard heute + 14.
TRIAL_MAX_DAYS=30
# Kontakt in Banner und Testphasen-Mails (Vollversion/Verlängerung); leer = allgemeiner Hinweis.
TRIAL_CONTACT_EMAIL=
# Ein-/Ausgaben im KI-Protokoll (AiGeneration) nach N Tagen leeren/pseudonymisieren.
AI_GENERATION_RETENTION_DAYS=180
# --- Craftvia: API-Rate-Limits (je Nutzer/Minute) ---
API_RATE_LIMIT_PER_MINUTE=300
# /api/v1/sync, /api/v1/uploads, /api/v1/field/**
API_FIELD_RATE_LIMIT_PER_MINUTE=1200
# --- Craftvia: Offline/PWA & Malware-Scan ---
OFFLINE_MAX_DAYS=7
CLAMAV_HOST=
CLAMAV_PORT=3310