# Auto-Deploy per Tag-Push – siehe DEPLOY.md. Fester Projekt-/Container-Name, # Image mit Versionstag (Rollback ohne Rebuild), kein Port-Mapping (NPM proxyt # intern über den Container-Namen). name: skrift-backend services: app: image: skrift-backend:${IMAGE_TAG:-latest} build: . container_name: skrift-backend restart: unless-stopped # Betriebs-Defaults inline; Secrets/Config kommen aus .env (Secret DOTENV). environment: - NODE_ENV=production - PORT=4000 env_file: .env volumes: # Fonts sind ins Image gebacken (COPY im Dockerfile) – kein Bind nötig. - skrift-backend-cache:/app/cache # Gemeinsamer Ausgabe-/SFTP-Ordner: ABSOLUTER Host-Pfad, bewusst KEIN named # volume – Directus liest ihn (ro) und er ist das SFTP-Ziel der Produktion. - /var/skrift-output:/app/output networks: - nginx-proxy-manager_default # Gate für `--wait`. /health liefert 503, wenn Scriptalizer-Key fehlt oder # der Output-Ordner nicht schreibbar ist – dann bricht der Deploy bewusst ab. healthcheck: test: ["CMD", "node", "-e", "require('http').get('http://127.0.0.1:4000/health',r=>process.exit(r.statusCode===200?0:1)).on('error',()=>process.exit(1))"] interval: 60s timeout: 5s retries: 3 networks: nginx-proxy-manager_default: external: true volumes: # Vorschau-Cache (regenerierbar) mit festem Namen, damit er nicht am # Projektnamen hängt. skrift-backend-cache: name: skrift-backend-cache