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>
125 lines
5.5 KiB
Bash
125 lines
5.5 KiB
Bash
# 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
|