Bisher hatte nur der Service sync ein "restart: unless-stopped". Nach einem Reboot, einem OOM-Kill (512 MiB RAM in der Produktion) oder einem Docker-Neustart kam deshalb nur sync von allein zurueck, waehrend api (8091) und web (8090) liegen blieben. "docker compose ps" zeigte dann genau einen laufenden Container und der Monitor war ueber die Firewall-Weiterleitung nicht mehr erreichbar - ein Fehlerbild, das nach Firewall/Reverse Proxy aussieht, obwohl schlicht nichts auf den Ports lauschte. unless-stopped statt always, damit ein bewusstes "docker compose stop" bestehen bleibt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|---|---|---|
| api | ||
| deploy | ||
| docker/nginx | ||
| html | ||
| tests/frontend | ||
| .env.example | ||
| .gitignore | ||
| API.md | ||
| check_fds.sh | ||
| credentials-sample.conf | ||
| deploy-webhook.py | ||
| Detailantworten.md | ||
| Detailfragen.md | ||
| docker-compose.yml | ||
| echo | ||
| hosts-sample.conf | ||
| mail_fds.py | ||
| monitor-api-sample.conf | ||
| package.json | ||
| README.md | ||
| README_UPDATE.md | ||
| register-agent.sh | ||
| register-ops-agent.sh | ||
| update.sh | ||
| Visualization.md | ||
🖥️ monitor
monitor überwacht mehrere Systeme (per Ping und/oder per REST-API-Meldungen entfernter Agenten) und zeigt den Zustand als interaktive Büro-Visualisierung (Kanban-Board + Monitor-Wand mit Agenten an Schreibtischen).
Der vollständige Umbauplan steht in Visualization.md (Roadmap Phase 0-7), die dazugehörigen Klärungen in Detailfragen.md und Detailantworten.md.
🚀 Features
- REST-API (
api/, siehe API.md) für Tickets, Events, Systeme, KPIs und Agenten-Aktivität, mit statischen API-Keys pro Agent - Büro-Visualisierung (
html/office.html) als Vanilla-SVG-Szene: Kanban-Board, Monitor-Wand (Events/Systeme/KPIs), 8 Schreibtische - zeigt live die Daten aus der REST-API (Push per Server-Sent Events, Polling-Fallback), Klick auf Board/Monitore öffnet Detail-Modals, Agenten laufen animiert zwischen Schreibtisch/Board/Monitor-Wand/Kaffee-Ecke (Phase 3-5, siehe Visualization.md Abschnitt 9). Ist die API nicht erreichbar, zeigt die Szene ersatzweise Demo-Daten — kenntlich gemacht durch einen roten Banner „API nicht erreichbar!". Die Basis-URL der API kommt ausMONITOR_API_BASE(siehe.env.example). - Klick auf den PO öffnet ein Modal, in dem sich die vom Codeberg-Sync gelesenen Projekte
(Owner/Repo + Farbe) hinzufügen, bearbeiten und löschen lassen (Issue #27) — Änderungen
wirken sofort im laufenden
sync-Dienst, ohne Neustart. Schreibende Aktionen fragen einmalig denMONITOR_ADMIN_API_KEYab und merken ihn sich im Browser. - Codeberg-Sync als Dauerläufer (Compose-Service
sync): füllt Backlog und Done automatisch aus den Issues mehrerer konfigurierter Codeberg-Projekte (je Projekt mit eigener Ticket-Farbe, siehe oben) — periodisch alleMONITOR_SYNC_INTERVALSekunden und, wenn ein Webhook eingerichtet ist, innerhalb von Sekunden nach jeder Issue-Änderung (POST /api/v1/webhooks/codeberg, HMAC-signiert perCODEBERG_WEBHOOK_SECRET). Siehe API.md Abschnitt „Codeberg-Sync" — dort steht auch die Einrichtung im Codeberg-Repo. - Auto-Update auf einem Produktionsserver: Sobald ein PR nach
maingemergt wird, kanndeploy-webhook.pydenselbenupdate.shanstoßen, den auch ein manuelles Update aufruft (Push-Webhook, HMAC-signiert perMONITOR_DEPLOY_WEBHOOK_SECRET) — siehe README_UPDATE.md. - Weiterhin: klassische Ping-Überwachung (
check_fds.sh,hosts.conf,mail_fds.py) als eine Datenquelle für den System-Monitor; die alte tabellarische Statusseite ist mit Phase 7 entfallen (F16),status.txtspeist weiterhin den System-Monitor
📁 Projektstruktur
api/— REST-API (PHP, SQLite), siehe api/README.mdhtml/— Frontend:office.html(Büro-Visualisierung),js/,css/tests/frontend/— Node-Tests für die Frontend-Layoutlogik (node --test)check_fds.sh,mail_fds.py,hosts-sample.conf,monitor-api-sample.conf— bestehende Ping-Überwachung (letztere: optionale Zugangsdaten für die Meldung per REST)docker-compose.yml— komplette Entwicklungsumgebung (siehe unten)update.sh— holt die neueste Version vom konfigurierten Git-Remote und aktualisiert die Docker-Compose-Umgebung (Abhängigkeiten, Images, Dienste, Tests)deploy-webhook.py,deploy/— löstupdate.shauf einem Produktionsserver automatisch aus, sobald ein PR nachmaingemergt wird (Push-Webhook); siehe README_UPDATE.mdregister-agent.sh— Hilfsskript, um einen neuen Agenten perPOST /api/v1/agentszu registrieren (siehe API.md Abschnitt "Agenten")register-ops-agent.sh— registriert den lokalen OPs-Agenten (Rolleops) und legt dabeimonitor-api.conffür die Statusmeldung des Ping-Checks an (siehe "Weg 3" unten)
🐳 Entwicklung (nur Docker, kein lokales PHP/Node nötig)
Analog zum NC-Gantt-Projekt läuft die gesamte Ausführung (Bauen, Entwickeln, Testen) in Docker-Compose-Containern; auf dem Host muss nichts installiert werden.
cp .env.example .env # einmalig, MONITOR_ADMIN_API_KEY anpassen
docker compose up --build # API auf :8091, Buero-Visualisierung auf :8090, Sync
docker compose run --rm api composer test # PHPUnit (API)
docker compose run --rm frontend # Node-Tests (Frontend-Layoutlogik)
docker compose logs -f sync # Codeberg-Sync mitlesen
Der Browser erreicht die API nicht über das Compose-Netzwerk, sondern über die in
MONITOR_API_BASE (.env) hinterlegte URL — der Default http://localhost:8091/api/v1 passt
zum Port-Mapping oben. Wer die Ports in docker-compose.yml ändert oder das System hinter
einem Reverse Proxy betreibt, muss MONITOR_API_BASE entsprechend nachziehen, sonst zeigt
die Szene den Banner „API nicht erreichbar!" und fällt auf Demo-Daten zurück. Der Webserver
liefert den Wert zur Laufzeit als /config.js aus (docker/nginx/default.conf.template), ein
Build-Schritt ist dafür nicht nötig.
Details zur API: api/README.md. Details zu den Endpunkten: API.md.
🖥️ Einen Server zur Überwachung hinzufügen
Der System-Monitor in der Büro-Visualisierung zeigt zunächst keine Kacheln an, solange kein System gemeldet wurde — dafür gibt es zwei unabhängige Wege:
Weg 1: Klassische Ping-Überwachung (hosts.conf)
hosts-sample.confnachhosts.confkopieren und um den neuen Server erweitern (eine Zeile pro Server, FormatHostname IP):Webserver 192.168.178.10- Optional, für E-Mail-Alarme bei Ausfall:
credentials-sample.confnachcredentials.confkopieren und die SMTP-Zugangsdaten eintragen (wird vonmail_fds.pybenutzt). check_fds.shregelmäßig ausführen, z.B. per Cron alle paar Minuten. Das Skript pingt jeden Eintrag aushosts.confdreimal an und schreibt das Ergebnis instatus.txt(Pfad überSTATUS_FILEim Skript einstellbar).- Die API liest
status.txtlaufend mit und zeigt die Einträge als Systeme (source: "legacy") im System-Monitor an — ohne dass etwas neu gestartet werden muss.
⚠️ Dieser Import liest
MONITOR_STATUS_FILEals lokale Datei. Läuftcheck_fds.shauf einem anderen Rechner als die API (oder liegtstatus.txtaußerhalb des API-Containers — der Mount indocker-compose.ymlist standardmäßig auskommentiert), erreicht sie die API nie und der System-Monitor bleibt bei „Keine Systeme gemeldet". Fehlt die Datei, meldet die API keinen Fehler, sondern liefert eine leere Liste. In dem Fall Weg 3 verwenden.
Weg 2: Status direkt per REST-API melden
Eigene Server/Skripte können ihren Status auch ohne hosts.conf melden:
- Einen Agenten registrieren (liefert einmalig einen API-Key zurück, siehe
register-agent.shbzw. API.md). - Mit diesem Key den Status senden:
curl -X POST "$MONITOR_API_BASE/systems/mein-server/status" \ -H "X-Api-Key: <API-Key>" \ -H "Content-Type: application/json" \ -d '{"status": "ok", "name": "Mein Server", "type": "host"}'
So gemeldete Systeme (source: "api") haben Vorrang vor dem Legacy-Import aus status.txt
und werden von ihm nicht überschrieben. Details zu Feldern/Auth: API.md.
Weg 3: Ping-Überwachung, die ihre Ergebnisse selbst per REST meldet
Kombiniert beide Wege und ist der richtige Weg, wenn der Ping-Check auf einem anderen Rechner
läuft als die API — dann fällt der Umweg über die Datei status.txt weg:
-
Wie in Weg 1 die
hosts.confpflegen undcheck_fds.shper Cron laufen lassen. -
Den OPs-Agenten registrieren — das erledigt
register-ops-agent.shneben derdocker-compose.ymlin einem Schritt (die API muss dafür laufen):./register-ops-agent.sh # optional: ./register-ops-agent.sh "OPs Rechenzentrum"Das Skript liest
MONITOR_ADMIN_API_KEYundMONITOR_API_BASEaus der.env, legt einen Agenten der Rolleopsan (sitzt als „OPs" sichtbar an einem Schreibtisch, Issue #66) und schreibt den nur einmalig ausgegebenen API-Key mitchmod 600nachmonitor-api.conf. Eine bestehendemonitor-api.confüberschreibt es nicht (--forceerzwingt es).Von Hand geht es weiterhin so: Agenten wie in Weg 2 registrieren (Rolle
ops),monitor-api-sample.confnachmonitor-api.confnebencheck_fds.shkopieren, dortMONITOR_API_BASE(ohne/api/v1) undMONITOR_API_KEYeintragen,chmod 600setzen.
check_fds.sh meldet dann nach jedem Ping zusätzlich per REST (online → ok,
offline → error) und schreibt status.txt unverändert weiter für den alten Wandmonitor.
Die System-ID entsteht dabei aus dem Hostnamen (Nextcloud(intern) → nextcloud-intern),
der Originalname bleibt als Anzeigename erhalten. Ist die API nicht erreichbar, läuft die
Ping-Überwachung normal weiter und protokolliert nur eine Warnung.