# 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 '';), 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 # --- 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=http://REPLACE-WITH-COOLIFY-SSLIP-DOMAIN # 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 # 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