Der Zugang aus der Erstinstallation ist ab Werk unantastbar: weder Rolle noch Zustand lassen sich aendern, sein Passwort nicht von aussen zuruecksetzen, und loeschen laesst er sich nicht - auch nicht durch sich selbst. So bleibt ein Weg zurueck, wenn sich jemand aus Versehen die Rechte entzieht. Sein eigenes Passwort aendert er weiterhin unter "Konto". BOOTSTRAP_ADMIN_EDITABLE=true hebt den Schutz auf. Welcher Zugang gemeint ist, traegt der Start nach: den Namen kennt nur er, die Migration nicht. Ein CC behielt nach dem Verschieben seines Redesigns den Vermerk "Redesignt", obwohl ueber ihm nichts mehr stand. Der Vermerk stammte von einem Nachfolger, der inzwischen woanders lag. Jetzt folgt er der Kette: wer einen Nachfolger hat, wurde ersetzt - wer ans Ende rueckt, nicht mehr. Ein Platz entsteht dabei nicht aus dem Nichts, die Deckung wird geprueft wie sonst auch. Neu bearbeitbar: Name, Beschreibung und der verknuepfte Forums-Antrag eines CCs. Ein Antrag, den der Abgleich noch nicht kennt, wird dabei vorgemerkt - sonst staende er beim naechsten Lauf als offener Antrag da, obwohl er laengst eingetragen ist. Ebenso laesst sich nachtraeglich umstellen, ob ein Redesign bezahlt oder Kulanz war; umgebucht wird ueber eine Gegenbuchung, ueberschrieben wird nichts. Zuletzt: Eintraege eines anderen Editors kamen nicht an, solange die Seite offen stand. Jetzt wird der Stand geholt, sobald der Tab wieder in den Vordergrund kommt - das trifft den Moment, in dem jemand wieder hinsieht, ohne im Hintergrund dauernd zu fragen.
83 lines
2.9 KiB
YAML
83 lines
2.9 KiB
YAML
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:-}
|
|
# Dieser Zugang bleibt unantastbar, solange das hier nicht "true" ist.
|
|
BOOTSTRAP_ADMIN_EDITABLE: ${BOOTSTRAP_ADMIN_EDITABLE:-false}
|
|
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}
|
|
# Die Zeitzone bestimmt, wann "nachts um vier" ist - ohne sie liefe der
|
|
# Forumslauf nach UTC und damit im Sommer zwei Stunden daneben. Der
|
|
# Takt selbst steht in der Anwendung unter Verwaltung -> Zeitplan.
|
|
TZ: ${TZ:-Europe/Berlin}
|
|
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:
|