diff --git a/.env.example b/.env.example index b5c446f..7dc64de 100644 --- a/.env.example +++ b/.env.example @@ -14,5 +14,10 @@ MONITOR_API_BASE=http://localhost:8091/api/v1 # Codeberg-Repo, aus dem Backlog/Done per Sync-Skript befuellt werden CODEBERG_OWNER=fds2610 CODEBERG_REPO=monitor -# Optional: Token mit Lesezugriff, falls Rate-Limits ohne Token zu knapp sind +# Optional: Token mit Lesezugriff, falls Rate-Limits ohne Token zu knapp sind - bei kleinem +# MONITOR_SYNC_INTERVAL (haeufigem Sync) empfehlenswert CODEBERG_TOKEN= + +# Abstand zwischen zwei Codeberg-Sync-Laeufen in Sekunden (Service "sync" in +# docker-compose.yml). Der erste Lauf passiert direkt beim Start des Services. +MONITOR_SYNC_INTERVAL=600 diff --git a/API.md b/API.md index 237a2eb..43ce06c 100644 --- a/API.md +++ b/API.md @@ -235,16 +235,31 @@ schliessen. ## Codeberg-Sync (Backlog/Done) -`api/bin/sync-codeberg.php` (per Cron oder manuell auszufuehren) liest offene und -geschlossene Issues aus dem konfigurierten Codeberg-Repo (`CODEBERG_OWNER`/`CODEBERG_REPO`) -und gleicht sie ueber `external_ref` (= Issue-Nummer) mit den Tickets ab: +`api/bin/sync-codeberg.php` liest offene und geschlossene Issues aus dem konfigurierten +Codeberg-Repo (`CODEBERG_OWNER`/`CODEBERG_REPO`) und gleicht sie ueber `external_ref` +(= Issue-Nummer) mit den Tickets ab: - Offene Issues → Spalte `backlog` (nur falls das Ticket noch in `backlog`/`done` ist - manuell auf dem Board bewegte Tickets werden nicht zurueckgesetzt). - Geschlossene Issues → Spalte `done`. - Ticket-Typ/-Farbe kommen vom ersten Issue-Label (Name/Farbe). -Aufruf via Docker: `docker compose run --rm api php bin/sync-codeberg.php`. +Ausgefuehrt wird das Skript vom Compose-Service `sync` (siehe +[docker-compose.yml](docker-compose.yml)) - kein Host-Cron noetig. Der Service startet mit +dem Stack, macht sofort einen ersten Lauf und wiederholt ihn dann alle +`MONITOR_SYNC_INTERVAL` Sekunden (Default 600, siehe `.env.example`). Er nutzt dasselbe +Image und dieselbe SQLite-Datei wie `api` und verbindet sich ausschliesslich ausgehend nach +codeberg.org - es ist also kein Port-Mapping und keine Firewall-Freigabe noetig. + +```bash +docker compose up -d sync # Sync-Service starten +docker compose logs -f sync # Laeufe mitlesen +docker compose run --rm api php bin/sync-codeberg.php # einmalig manuell (Debug) +``` + +Beim manuellen Aufruf werden Fehler direkt auf der Konsole sichtbar (`Codeberg-API nicht +erreichbar: …` bzw. `Codeberg-API-Fehler (HTTP 4xx)`) - der erste Anlaufpunkt, wenn Backlog +und Done leer bleiben. ## Fehlerformat diff --git a/README.md b/README.md index 833453f..bfcf13b 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,9 @@ die dazugehörigen Klärungen in [Detailfragen.md](Detailfragen.md) und 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 aus `MONITOR_API_BASE` (siehe `.env.example`). +- Codeberg-Sync als Dauerläufer (Compose-Service `sync`): füllt Backlog und Done automatisch + alle `MONITOR_SYNC_INTERVAL` Sekunden aus den Issues des konfigurierten Codeberg-Repos + (siehe [API.md](API.md) Abschnitt „Codeberg-Sync") - 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.txt` speist weiterhin den System-Monitor @@ -49,9 +52,10 @@ Docker-Compose-Containern; auf dem Host muss nichts installiert werden. ```bash cp .env.example .env # einmalig, MONITOR_ADMIN_API_KEY anpassen -docker compose up --build # API auf :8091, Buero-Visualisierung auf :8090 +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 diff --git a/api/README.md b/api/README.md index 13c54f3..6236d77 100644 --- a/api/README.md +++ b/api/README.md @@ -14,9 +14,13 @@ cp .env.example .env # einmalig, MONITOR_ADMIN_API_KEY anpassen docker compose up --build # startet die API auf http://localhost:8080 docker compose run --rm api composer test # PHPUnit inkl. Coverage -docker compose run --rm api php bin/sync-codeberg.php # Backlog/Done aus Codeberg ziehen +docker compose run --rm api php bin/sync-codeberg.php # Backlog/Done einmalig ziehen (Debug) ``` +Im laufenden Betrieb wird der Codeberg-Sync nicht manuell angestossen, sondern vom +Compose-Service `sync` alle `MONITOR_SYNC_INTERVAL` Sekunden ausgefuehrt (siehe +[../API.md](../API.md), Abschnitt "Codeberg-Sync"). + Composer-Abhaengigkeiten (nur PHPUnit als Dev-Dependency) werden beim ersten Start automatisch **im Container** installiert (`docker/entrypoint.sh`) - auf dem Host ist weder PHP noch Composer noch SQLite erforderlich. diff --git a/docker-compose.yml b/docker-compose.yml index 0984f75..0f6c891 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,6 +25,41 @@ services: CODEBERG_REPO: ${CODEBERG_REPO:-monitor} CODEBERG_TOKEN: ${CODEBERG_TOKEN:-} + # Haelt Backlog/Done aus Codeberg aktuell (F4, siehe API.md Abschnitt "Codeberg-Sync"): + # laeuft dasselbe Image wie api, teilt sich ueber das ./api-Volume dieselbe SQLite-Datei + # und ruft bin/sync-codeberg.php in einer Endlosschleife auf. Ohne diesen Service bleibt + # das Board leer, solange kein Agent selbst Tickets meldet. + # Rein ausgehende Verbindungen (nach codeberg.org), kein Port-Mapping - in Produktion sind + # also weder Proxy- noch Firewall-Freigaben noetig. + sync: + build: + context: ./api + dockerfile: docker/Dockerfile + volumes: + - ./api:/app + working_dir: /app + restart: unless-stopped + depends_on: + - api + environment: + MONITOR_DB_PATH: /app/data/monitor.sqlite + MONITOR_SYNC_INTERVAL: ${MONITOR_SYNC_INTERVAL:-600} + CODEBERG_API_BASE: https://codeberg.org/api/v1 + CODEBERG_OWNER: ${CODEBERG_OWNER:-fds2610} + CODEBERG_REPO: ${CODEBERG_REPO:-monitor} + CODEBERG_TOKEN: ${CODEBERG_TOKEN:-} + # "$$" ist ein maskiertes "$" - die Variable soll die Shell im Container aufloesen, nicht + # Compose. Ein fehlgeschlagener Lauf (Codeberg nicht erreichbar, Rate-Limit) darf die + # Schleife nicht beenden, sonst landet der Service in einer Restart-Schleife. + command: + - sh + - -c + - | + while true; do + php bin/sync-codeberg.php || echo "[sync] Lauf fehlgeschlagen, naechster Versuch in $${MONITOR_SYNC_INTERVAL}s" + sleep "$$MONITOR_SYNC_INTERVAL" + done + # Statisches Frontend (html/) - Phase 2 der Neuausrichtung (Buero-Visualisierung). # Nur zur lokalen Ansicht/Entwicklung, kein Build-Schritt noetig (Vanilla HTML/CSS/JS). web: diff --git a/update.sh b/update.sh index f0a17e2..b4700c9 100644 --- a/update.sh +++ b/update.sh @@ -58,8 +58,8 @@ $DOCKER_COMPOSE run --rm api composer install --no-interaction --no-progress log "Baue Docker-Images neu (falls Dockerfile/Abhaengigkeiten sich geaendert haben)..." $DOCKER_COMPOSE build -log "Starte Dienste neu (api, web)..." -$DOCKER_COMPOSE up -d api web +log "Starte Dienste neu (api, web, sync)..." +$DOCKER_COMPOSE up -d api web sync if [ "$UPDATE_RUN_TESTS" = "1" ]; then log "Fuehre PHPUnit-Tests (API) aus..."