Files
craftvia/.env.coolify.example
T
msolarczekandClaude Opus 5 cadaedc6cc L10b Betrieb & Aufräumen: Deploy – craftvia-worker, CI-Testjob, DEPLOY.md, Certvia-Doku archiviert
- docker-compose.coolify(.prebuilt).yml: Service craftvia-worker (Target worker, Chromium,
  shm_size 1gb, gleiche Härtung), Craftvia-Variablen für app und worker.
- Dockerfile: worker-Stage mit HOME=/home/app (Chromium-Profil für non-root); lokaler
  docker build der Targets runner und worker erfolgreich, PDF-Erzeugung im Image geprüft.
- .env.example/.env.prod.example/.env.coolify.example: alle Craftvia-Variablen inkl. RLS,
  KI-Provider, PDF_CHROMIUM_PATH, OFFLINE_MAX_DAYS, API_RATE_LIMIT_*, AI_GENERATION_RETENTION_DAYS,
  AI_MONTHLY_TOKEN_LIMIT.
- CI (.github, .gitea): Job gate mit Postgres (pgvector) und Redis als Service: migrate deploy,
  seed, Passwort für craftvia_app, tsc, lint, build, npm run test.
- docs/craftvia/DEPLOY.md (aus den Certvia-Deploy-Docs abgeleitet): Architektur, Domains, Secrets,
  Worker, Migrationen, RLS-Aktivierung, Backup/Restore, KI, Rate Limits, Aufbewahrung, Smoke,
  Update/Rollback. build-and-push-images.sh baut craftvia-worker.
- Certvia-/ISMS-Dokumente aus docs/ nach docs/_certvia-archiv/ (mit README); Verweise in README.md
  und Skript-Kommentaren angepasst.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 18:19:19 +02:00

111 lines
4.9 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
# --- 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