services: app: build: . # Alternativ ein vorgebautes Image verwenden: # image: ghcr.io/harlekin/cc-manager:latest restart: unless-stopped environment: DATABASE_URL: postgres://ccuser:${DB_PASSWORD}@db:5432/ccmanager SESSION_SECRET: ${SESSION_SECRET} NODE_ENV: production # Erstzugang; nach der ersten Anmeldung wird ein Wechsel erzwungen. BOOTSTRAP_ADMIN_USER: ${BOOTSTRAP_ADMIN_USER:-admin} BOOTSTRAP_ADMIN_PASSWORD: ${BOOTSTRAP_ADMIN_PASSWORD:-} TRUST_PROXY: "true" # Nur nötig, wenn der GExtension-Abgleich eine andere Instanz ansprechen soll. GEXTENSION_BASE_URL: ${GEXTENSION_BASE_URL:-https://gextension.senseigaming.de} FORUM_BASE_URL: ${FORUM_BASE_URL:-https://senseigaming.de/forum} AUDIT_RETENTION_DAYS: ${AUDIT_RETENTION_DAYS:-365} expose: # Bewusst nicht nach aussen gemappt: der Reverse Proxy terminiert HTTPS. - "3000" depends_on: db: condition: service_healthy networks: - default # App zur Datenbank - proxy # Reverse Proxy zur App db: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_USER: ccuser POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_DB: ccmanager volumes: - cc_db:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ccuser -d ccmanager"] interval: 10s timeout: 5s retries: 5 backup: image: postgres:16-alpine restart: unless-stopped environment: PGPASSWORD: ${DB_PASSWORD} volumes: - ./backups:/backups depends_on: db: condition: service_healthy # Dump beim Start und danach alle 24 Stunden, Aufbewahrung 14 Tage. entrypoint: > sh -c 'while true; do pg_dump -h db -U ccuser -d ccmanager | gzip > /backups/ccmanager-$$(date +%F-%H%M).sql.gz && echo "Backup geschrieben: $$(date +%F-%H%M)"; find /backups -name "ccmanager-*.sql.gz" -mtime +14 -delete; sleep 86400; done' networks: # Das Netzwerk des Reverse Proxy. Es muss bereits existieren - der Proxy # legt es an, bei Nginx Proxy Manager heisst es meist nginx_default. # Anderer Name? Dann PROXY_NETWORK in der .env setzen. # # Ohne Reverse Proxy in Docker: diesen Block und die networks-Liste beim # app-Service entfernen und stattdessen einen Port mappen (ports: "3000:3000"). # Dann aber selbst für HTTPS sorgen - die App gehört nicht ungeschuetzt ins Netz. proxy: external: true name: ${PROXY_NETWORK:-nginx_default} volumes: cc_db: