Files
CC-Manager/compose.yaml
T
Harlekin dbde5b7d11 Slots durchsetzen, Abgleiche nach Zeitplan, Kaufdatum im Kontobuch
Ein CC-Paket ist ein Platz fuer einen gleichzeitig aktiven CC - ein Redesign
tauscht einen CC aus, statt einen Platz hinzuzufuegen. Beim Gruppen-Beitritt
galt das seit dem letzten Stand, an anderer Stelle aber noch nicht: ein
redesignter CC liess sich mit einem Redesign-Guthaben zurueckholen, waehrend
sein Nachfolger aktiv blieb. Zwei aktive CCs auf ein einziges Paket.

Geprueft wird das jetzt an einer Stelle statt an jedem Weg einzeln, fuer
Erschaffen, Redesign, Reaktivierung, Rueckkehr und Beitritt. Der Massstab ist
die Deckung, nicht der Kontostand: jeder aktive CC braucht eine eigene Buchung
im CC-Topf. Ein bewusst ueberzogenes Konto bleibt damit moeglich - die Buchung
ist da, nur das Guthaben fehlt, und das Minus steht sichtbar auf der
Spielerseite.

Beide Abgleiche laufen jetzt von allein: die Kaeufe alle zwei Stunden, bei
Spielern ohne Kauf in den letzten drei Jahren alle sechs, das Forum einmal
nachts. Das spart den Grossteil der Anfragen, denn ruhende Konten sind mit der
Zeit die Mehrheit. Gebucht wird dabei nichts - neue Pakete landen in der
Vorschau, neue Antraege in der Liste. Der Stand steht in der Datenbank, damit
ein Neustart nicht alles erneut anstoesst. Unter Verwaltung steht, wann
zuletzt gelaufen wurde; auf der Uebersicht, wie viele Pakete auf eine Buchung
warten und bei wem.

Ausserdem:

- Die Guthaben-Historie zeigt bei Importen den Kauf im Shop, nicht den
  Zeitpunkt der Eingabe hier. Bereits gebuchte Importe werden nachgetragen.
- Forums-Antraege tragen ihr Datum, im Forum ausgelesen statt geraten.
- Die Hinweisbox ueber den Antraegen beim Spieler faellt weg.
- Die Aktionsspalte der Nutzerverwaltung war per display:flex aus dem
  Tabellenlayout gefallen, daher die versetzte Trennlinie.
- Die Zeitzone steht jetzt im Compose-Stack, sonst laege "nachts um vier"
  nach UTC und im Sommer zwei Stunden daneben.
2026-09-21 12:35:36 +02:00

82 lines
2.8 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:-}
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.
TZ: ${TZ:-Europe/Berlin}
SCHEDULE_ENABLED: ${SCHEDULE_ENABLED:-true}
FORUM_SCAN_HOUR: ${FORUM_SCAN_HOUR:-4}
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: