services: projektuebersicht: build: context: . dockerfile: Docker/Dockerfile container_name: projektuebersicht ports: - "3003:3003" volumes: - ./sessions:/app/sessions environment: # Ohne TZ läuft der Container auf UTC. Der Server vergleicht Termine # mit dem heutigen Datum (heuteIsoLokal() in server.js) — in deutscher # Sommerzeit gälte damit zwischen 00:00 und 02:00 Ortszeit noch der # Vortag, und Termine von heute erschienen als überfällig. TZ: Europe/Berlin # Speicher-Wächter: darüber startet der Server sich selbst sauber neu, # bevor die Grenze von 320 MB (mem_limit) erreicht ist. SPEICHER_MAX_MB: "220" # PDF-Kindprozess (Protokoll-Import, Plan Checker): bricht darüber ab. PDF_KIND_MAX_MB: "220" PDF_KIND_HEAP_MB: "160" # Hänger-Wächter: reagiert der Server so lange nicht, Neustart. HAENGER_MAX_S: "90" # Admin → Update: Versionen (Tags) vom Git-Server. Ausgeführt wird ein # Update vom Dienst auf dem Rechner (Docker/update-einrichten.sh). UPDATE_REPO_API: "http://192.168.3.187:3000/api/v1/repos/erik/projektuebersicht" restart: always # Betrieb auf dem Pi Zero 2 (512 MB), siehe CLAUDE.md "Betrieb auf dem Pi": # tini als PID 1 — Signale kommen sauber bei Node an (DB wird geschlossen). init: true # Feste Speichergrenze: Läuft die App über, trifft es nur diesen # Container (restart: always holt ihn zurück), nicht SSH oder Docker. mem_limit: 320m memswap_limit: 512m # Die Protokolle wuchsen sonst unbegrenzt auf der SD-Karte. logging: driver: json-file options: max-size: "5m" max-file: "3" healthcheck: test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:3003/health >/dev/null || exit 1"] interval: 60s timeout: 10s start_period: 60s retries: 3