diff --git a/HOMELAB_ARCHITECTURE_MASTER_V2.md b/HOMELAB_ARCHITECTURE_MASTER_V2.md index d53a286..e20984f 100644 --- a/HOMELAB_ARCHITECTURE_MASTER_V2.md +++ b/HOMELAB_ARCHITECTURE_MASTER_V2.md @@ -93,8 +93,6 @@ Jeder produktive Container nutzt `restart: unless-stopped`, außer eine Ausnahme | `monitoring_net` | Compose-intern, bridge | zentraler Observability-Stack fuer Prometheus, Loki, Grafana, Promtail, Exporter und InfluxDB | Zielzustand | | `monitoring_influx_lan` | Compose-intern, bridge | nicht-oeffentliches Zusatznetz nur fuer Docker Host-Port-Publishing von InfluxDB 8181 | Zielzustand | | `glance_socket_net` | Compose-intern, `internal: true` | interner Zugriff von Glance auf den Docker-Socket-Proxy | umgesetzt | -| `grafana_influx_internal` | Compose-intern, `internal: true` | alte Grafana-zu-InfluxDB-Kommunikation | abgeloester Altstand | -| `grafana_influx_lan` | Compose-intern, bridge | altes Docker Host-Port-Publishing von InfluxDB 8181 | abgeloester Altstand | | `host` | host | nur für echte Sonderfälle | begründet | ### 3.2 Finales Diagramm (vereinfacht) @@ -125,9 +123,7 @@ App-interne Netze ├── immich_default (internal: true) ✅ ├── nextcloud_internal (internal: true) ✅ ├── monitoring_net (zentraler Observability-Stack) -├── monitoring_influx_lan (Bridge fuer LAN-Port-Publishing, keine Traefik-Route) -├── grafana_influx_internal (Altstand) -└── grafana_influx_lan (Altstand) +└── monitoring_influx_lan (Bridge fuer LAN-Port-Publishing, keine Traefik-Route) Host-Sonderfälle ├── tailscale @@ -302,7 +298,7 @@ Legende Status: | `monitoring-influxdb3-core` | ✅ | `monitoring_net`, `monitoring_influx_lan` + LAN-Bind | LAN-Port nur fuer interne Writer | InfluxDB 3 Core fuer Home-Assistant-/Ecowitt-Langzeitdaten; keine Traefik-/Public-Freigabe; Port 8181 nur via `INFLUXDB_BIND_IP` | HA-Write-Token und Sensor-Export finalisieren | | `monitoring-loki` | ✅ | `monitoring_net` | intern | interner Container-Logspeicher ohne Public Route; Monitoring-Grafana greift ueber Loki-Datasource zu | Retention/Storage beobachten | | `monitoring-promtail` | ✅ | `monitoring_net` | intern | Docker-Log-Collector mit read-only Docker-Socket-Ausnahme; schreibt nach Loki | Socket-Ausnahme regelmaessig pruefen | -| `grafana` / `influxdb3-core` / `loki` / `alloy` | Altstand gestoppt | diverse | abgeloest | nicht parallel zum `monitoring/`-Zielstack betreiben; Docker-Runtime frei von Altcontainern | nur Rollback-/Migrationsreferenz | +| `grafana` / `influxdb3-core` / `loki` / `alloy` | entfernt | - | abgeloest | alte Docker-Runtime frei von Altcontainern; Compose-Pfade am 2026-05-26 aus aktivem Repo entfernt | Rollback nur ueber Git-Historie | ### 7.7 Noch offene Sonderfälle @@ -563,7 +559,7 @@ Mutable Tags wie `latest`, `stable`, `release` oder reine Major-Tags wurden auf - `monitoring-influxdb3-core` bleibt ohne Traefik-/Public-Route; fuer interne Writer wie Home Assistant kann Port `8181` per `INFLUXDB_BIND_IP` auf eine LAN-Adresse gebunden werden. - Fuer dieses Port-Publishing nutzt `monitoring-influxdb3-core` zusaetzlich `monitoring_influx_lan`. Das ist keine Public-App-Freigabe und ersetzt nicht die Token-Authentifizierung. - InfluxDB 3 Core nutzt einen festen Versionstag statt `latest`, weil der InfluxDB-`latest`-Tag versionsstrategisch im Umbruch ist. -- Die alten Pfade `ops/grafana-influxdb` und `ops/loki` sind abgeloeste Altstaende und sollen nach erfolgreichem Monitoring-Deploy nicht parallel betrieben werden. +- Die alten Pfade `ops/grafana-influxdb` und `ops/loki` wurden am 2026-05-26 aus dem aktiven Repo entfernt; `monitoring/` ist der einzige Observability-Zielstack. - Uptime Kuma wurde nach erfolgreichem Blackbox-/Grafana-Smoke-Test entfernt; `monitoring/` ist die Quelle fuer HTTP-Erreichbarkeit und Alerts. ### Monitoring-Logging-Baseline (2026-05-17) diff --git a/README.md b/README.md index c0561bb..e57571f 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,8 @@ Bei Hardware-, Netzwerk-, Provider- oder Kapazitaetsfragen zusaetzlich: - `security/` -> sicherheitskritische Dienste - `infra/` -> Datenbanken und technische Services - `apps/` -> Anwendungen -- `ops/` -> Monitoring und Tools +- `ops/` -> operative Tools +- `monitoring/` -> zentraler Observability-Stack - `host-services/` -> Dienste mit Host-Netz - `traefik/` -> Reverse Proxy Konfiguration - `docs/` -> Dokumentation und Prozesse diff --git a/docs/AI_CONTEXT.md b/docs/AI_CONTEXT.md index 2a32019..8f6a565 100644 --- a/docs/AI_CONTEXT.md +++ b/docs/AI_CONTEXT.md @@ -85,7 +85,7 @@ Nach Aenderungen an `services.json` oder `check_health.py`: `git pull` auf der V - `monitoring-influxdb3-core` ist nicht public und nicht im `frontend_net`. - Home Assistant schreibt ueber LAN-only Port 8181 nach InfluxDB, gebunden ueber `INFLUXDB_BIND_IP`. - Ein `401 Unauthorized` von InfluxDB ohne Token ist beim Reachability-Test ein Erfolgssignal. -- `ops/loki` und `ops/grafana-influxdb` sind abgeloeste Altstaende und sollen nach erfolgreichem Monitoring-Deploy nicht parallel betrieben werden. +- Die frueheren Altstaende `ops/loki` und `ops/grafana-influxdb` wurden aus dem aktiven Repo entfernt; fuer Monitoring immer `monitoring/` verwenden, Rollback nur ueber Git-Historie. - Uptime Kuma ist entfernt; HTTP-Verfuegbarkeit laeuft ueber Blackbox Exporter, Prometheus-Alerts und `Homelab / Availability` in Monitoring Grafana. ## Deployment-Logik @@ -112,7 +112,7 @@ Beim Anlegen neuer produktiver Stacks ist der Gitea->Komodo-Webhook Pflicht. Nac | `frontend_net` | Web-/Proxy-Netz fuer Traefik-geroutete Dienste und Dienste mit Internetbedarf | | `backend_net` | internes Netz fuer shared PostgreSQL, Redis und Backends | | `dns_net` | AdGuard + Unbound | -| app-interne Netze | Isolation von App + DB/Cache, z. B. Immich, Mealie, Nextcloud, Grafana/Influx | +| app-interne Netze | Isolation von App + DB/Cache, z. B. Immich, Mealie, Nextcloud, Monitoring | | `host` | nur dokumentierte Sonderfaelle wie Tailscale/Plex | Regeln: @@ -120,7 +120,7 @@ Regeln: - Datenbanken nie ins `frontend_net`. - Admin-UIs nur mit Traefik + Middleware oder dokumentierter Ausnahme. - Direkte Host-Ports sind Ausnahme, nicht Default. -- Runtime-Netznamen koennen Compose-Projektpraefixe bekommen, z. B. `grafana_grafana_influx_lan`. +- Runtime-Netznamen koennen Compose-Projektpraefixe bekommen, z. B. `monitoring_monitoring_influx_lan`. ## Security-Modell @@ -140,7 +140,7 @@ Bekannte Ausnahmen: - Scrutiny: privileged - Komodo: Docker-Socket, native Auth - InfluxDB: LAN-only 8181 fuer Home Assistant Writer -- Grafana/InfluxDB: `user: "0"` als dokumentierte Host-Appdata-Permissions-Ausnahme +- `monitoring-influxdb3-core`: `user: "0"` als dokumentierte Host-Appdata-Permissions-Ausnahme - Traefik dynamic config: manueller Host-Sync ## Backup- und Restore-Modell diff --git a/docs/AUDIT_2026-05-25_TODO.md b/docs/AUDIT_2026-05-25_TODO.md index cf19824..e92a7f3 100644 --- a/docs/AUDIT_2026-05-25_TODO.md +++ b/docs/AUDIT_2026-05-25_TODO.md @@ -29,7 +29,7 @@ Status: Arbeitsliste fuer die Umsetzung. Authelia-2FA/OIDC bleibt bewusst spaet, | offen | Borg-Passphrase analog sichern | Passphrase ist ohne Host/Vaultwarden wiederherstellbar | | erledigt (repo) | AdGuard Admin-Bind vorbereiten | Tailscale-IP `100.80.98.33` erfasst, Compose-Soll geaendert | | erledigt | AdGuard Admin-Port auf Tailscale-IP binden | Live validiert: `ss -ltnp` zeigt `100.80.98.33:8082`, DNS auf Port 53 funktioniert, LAN-Zugriff auf `192.168.178.58:8082` schlaegt fehl | -| offen | Alte Monitoring-Verzeichnisse entfernen | `ops/grafana-influxdb/` und `ops/loki/` sind aus Repo/Doku entfernt oder als expliziter Rollback-Archive-Pfad markiert | +| erledigt | Alte Monitoring-Verzeichnisse entfernen | `ops/grafana-influxdb/` und `ops/loki/` sind aus dem aktiven Repo entfernt; Rollback erfolgt ueber Git-Historie | | offen | Policy-Warnings triagieren | Jede Warning ist behoben oder bewusst dokumentiert | ## Sprint 2 - Storage und Recovery verbindlich machen diff --git a/docs/MIGRATION_LOG.md b/docs/MIGRATION_LOG.md index 597df67..d01012a 100644 --- a/docs/MIGRATION_LOG.md +++ b/docs/MIGRATION_LOG.md @@ -8,6 +8,7 @@ Dieses Dokument ist nur noch ein historischer Verlauf. Der aktuelle operative Ab - Komodo ist der einzige produktive Stack-Manager. - Portainer CE ist entfernt. - Firefly, Firefly-Fints und Semaphore sind entfernt. +- `monitoring/` ist der einzige aktive Observability-Stack; alte Repo-Pfade `ops/grafana-influxdb` und `ops/loki` sind entfernt. - Borg UI ist produktiv, Dump-Automatisierung laeuft host-seitig und ein Restore-Smoke-Test wurde erfolgreich durchgefuehrt. - GitHub Desktop ist der bevorzugte lokale Workflow fuer `Fetch`, `Pull`, `Commit` und `Push`. - Mutable Image-Tags sind auf die aktuell laufenden Digests eingefroren. @@ -16,6 +17,12 @@ Dieses Dokument ist nur noch ein historischer Verlauf. Der aktuelle operative Ab ## Historische Meilensteine +### 2026-05-26 - Monitoring-Altstaende aus aktivem Repo entfernt + +- Die abgeloesten Pfade `ops/grafana-influxdb` und `ops/loki` wurden per `git rm` aus dem aktiven Repo entfernt. `monitoring/` bleibt der einzige Observability-Zielstack. +- Live-Check vor dem Cleanup: nur `monitoring-grafana`, `monitoring-promtail`, `monitoring-influxdb3-core` und `monitoring-loki` laufen; alte Container `grafana`, `influxdb3-core`, `loki` und `alloy` sind nicht vorhanden. +- Rollback erfolgt bei Bedarf ueber Git-Historie, nicht ueber parallel gepflegte Compose-Verzeichnisse. + ### 2026-05-26 - AdGuard Admin-Port auf Tailscale-Soll begrenzt - Host-Audit per SSH gegen `Kallilabcore` durchgefuehrt: Tailscale IPv4 ist `100.80.98.33`, LAN-IP ist `192.168.178.58/24`, Gateway `192.168.178.1`. diff --git a/docs/REPO_MAP.md b/docs/REPO_MAP.md index 7eb8334..bd3d7c0 100644 --- a/docs/REPO_MAP.md +++ b/docs/REPO_MAP.md @@ -53,10 +53,6 @@ Secret-Werte werden hier nicht dokumentiert. Aufgefuehrt werden nur Variablennam | `traefik/dynamic/dashboards.yml` | leer; File-Provider-Platzhalter | | `traefik/dynamic/tls.yml` | leer; File-Provider-Platzhalter | | `security/authelia/configuration.yml` | versionierte Authelia-Baseline fuer nicht geheime ACL-/Session-/Storage-Einstellungen; manuelle Host-Merge-Pflicht, User-Daten, OIDC-Client-Konfiguration und Secret-Werte bleiben ausserhalb von Git | -| `ops/grafana-influxdb/provisioning/datasources/influxdb.yml` | Grafana Datasource Provisioning fuer InfluxDB 3 Core und Loki | -| `ops/grafana-influxdb/provisioning/dashboards/*.json` | Grafana Dashboards fuer Container-Logs, Restart-Events und Error-Rate | -| `ops/loki/config/loki-config.yml` | Loki Filesystem/Retention-Konfiguration fuer internen Logspeicher | -| `ops/loki/config/config.alloy` | Alloy Docker-Log-Collector-Konfiguration | | `monitoring/prometheus/prometheus.yml` | Prometheus Scrape-Konfiguration fuer dedizierten Monitoring-Stack | | `monitoring/loki/loki-config.yml` | Loki Filesystem/Retention-Konfiguration fuer dedizierten Monitoring-Stack | | `monitoring/promtail/promtail-config.yml` | Promtail Docker-Socket-Discovery fuer dedizierten Monitoring-Stack | @@ -69,7 +65,6 @@ Secret-Werte werden hier nicht dokumentiert. Aufgefuehrt werden nur Variablennam | `ops/hermes-agent/config/hermes/config.yaml` | Hermes Agent Konfiguration mit Env-Platzhaltern | | `ops/hermes-agent/hermes.env.example` | Beispiel fuer Hermes `.env`; echte Datei liegt auf Host-Appdata | | `ops/hermes-agent/stack.env.example` | Beispiel fuer Hermes Stack-ENV; echte `stack.env` bleibt host-/komodoseitig und ist per `.gitignore` ausgeschlossen | -| `ops/grafana-influxdb/stack.env.example` | `INFLUXDB_BIND_IP` Default `127.0.0.1`; auf Unraid fuer Home Assistant auf LAN-IP setzen | | `monitoring/stack.env.example` | `INFLUXDB_BIND_IP` Default `127.0.0.1`; im Zielzustand fuer Home Assistant auf LAN-IP setzen | | `ops/komodo/stack.env.example` | Komodo Stack-ENV-Beispiel, Secret-Werte nicht enthalten | @@ -117,8 +112,6 @@ Secret-Werte werden hier nicht dokumentiert. Aufgefuehrt werden nur Variablennam | Filebrowser | `ops/filebrowser/docker-compose.yml` | `filebrowser` -> `filebrowser/filebrowser:v2.63.2@sha256:...` | `files.kaleschke.info` | `frontend_net` | keine | Documents/Photos/Projekte-Mounts, Admin-UI hinter Authelia | | Glance | `ops/glance/docker-compose.yml` | `glance` -> `glanceapp/glance:v0.8.4`, `glance-docker-socket-proxy` -> `tecnativa/docker-socket-proxy:v0.4.2` | `glance.kaleschke.info` | `frontend_net`, `glance_socket_net` | keine | Homelab-Dashboard mit Home- und Infrastructure-Seite, Monitor-, Community-, Docker-, Internet-/DNS-/VPN- und Server-Stats-Widgets; aktives Community-Widget: Immich; Docker-API nur ueber internen Socket-Proxy | | Glances | `ops/glances/docker-compose.yml` | `glances` -> `nicolargo/glances:latest-full@sha256:...` | `glances.kaleschke.info` | `frontend_net` | keine | Rootfs/Docker-Socket fuer Monitoring | -| Grafana/InfluxDB | `ops/grafana-influxdb/docker-compose.yml` | `grafana`, `influxdb3-core` | Rollback-Route `grafana.kaleschke.info`, nicht aktiv | `frontend_net`, `grafana_influx_internal`, `grafana_influx_lan` | `influxdb3-core`: `${INFLUXDB_BIND_IP:-127.0.0.1}:8181:8181` | abgeloester Altstand; Docker-Runtime frei von Altcontainern | -| Loki/Alloy | `ops/loki/docker-compose.yml` | `loki`, `alloy` | keine | `backend_net` | keine | abgeloester Altstand; nach erfolgreicher Migration durch `monitoring-loki`/`monitoring-promtail` ersetzen | | Monitoring | `monitoring/docker-compose.yml` | `monitoring-prometheus`, `monitoring-alertmanager`, `monitoring-alertmanager-ntfy-bridge`, `monitoring-blackbox-exporter`, `monitoring-loki`, `monitoring-promtail`, `monitoring-grafana`, `monitoring-node-exporter`, `monitoring-cadvisor`, `monitoring-influxdb3-core`, optional `monitoring-grafana-dashboard-importer` | `monitoring.kaleschke.info` | `frontend_net`, `monitoring_net`, `monitoring_influx_lan` | `monitoring-influxdb3-core`: `${INFLUXDB_BIND_IP:-127.0.0.1}:8181:8181` | zentraler Zielstack fuer Prometheus/Loki/Grafana/InfluxDB; Alertmanager sendet via ntfy-Bridge nach `homelab-alerts`; Blackbox ersetzt Uptime-Kuma-Checks nach Parallelphase; Promtail nutzt Docker socket read-only; Dashboard-Importer nur via `bootstrap`-Profil | | Hermes Agent | `ops/hermes-agent/docker-compose.yml` | `hermes-gateway`, `hermes-dashboard` -> local build from Dockerfile | `hermes.kaleschke.info` via `${HERMES_DASHBOARD_HOST}` | `hermes_net`, dashboard zusaetzlich `frontend_net` | `8642` nur expose intern | SSH runner, Home Assistant optional, LLM provider env; Dashboard hinter Authelia | | Komodo | `ops/komodo/docker-compose.yml` | `komodo-core`, `komodo-mongo`, `komodo-periphery` | `komodo.kaleschke.info` | `frontend_net`, `komodo_net` | keine | Mongo, Docker socket, `/mnt/user/services` workspace mount, Gitea DNS override | @@ -163,13 +156,11 @@ Secret-Werte werden hier nicht dokumentiert. Aufgefuehrt werden nur Variablennam | Network | Typ / Status | Nutzer | |---|---|---| | `frontend_net` | external bridge | Web-/Proxy-Netz fuer Traefik und alle gerouteten UIs | -| `backend_net` | external/internal laut Architektur | PostgreSQL 17, Redis, Authelia, Paperless, Mail Archiver, Traefik, Loki, Alloy, Grafana-Loki-Datasource | +| `backend_net` | external/internal laut Architektur | PostgreSQL 17, Redis, Authelia, Paperless, Mail Archiver, Traefik | | `dns_net` | App-/Host-Netz | AdGuard Home und Unbound | | `immich_default` | Compose-intern, `internal: true` | Immich Server, ML, Postgres, Redis | | `mealie_internal` | Compose-intern; Laufzeitname mit Compose-Projektpraefix typischerweise `mealie_mealie_internal` | Mealie und Mealie Postgres | | `nextcloud_internal` | Compose-intern | Nextcloud, Nextcloud Postgres, Nextcloud Redis | -| `grafana_influx_internal` | Compose-intern, `internal: true` | Grafana und InfluxDB | -| `grafana_influx_lan` | Compose-intern bridge | InfluxDB Host-Port-Publishing fuer LAN Writer | | `monitoring_net` | Compose-/Stack-Netz bridge | Prometheus, Loki, Promtail, Monitoring-Grafana, node-exporter, cAdvisor; Traefik fuer Metrics-Scrape | | `monitoring_influx_lan` | Compose-intern bridge | InfluxDB Host-Port-Publishing fuer LAN Writer im zentralen Monitoring-Stack | | `glance_socket_net` | Compose-intern, `internal: true` | Glance und `glance-docker-socket-proxy`; keine Traefik-Anbindung | @@ -204,9 +195,7 @@ Secret-Werte werden hier nicht dokumentiert. Aufgefuehrt werden nur Variablennam | Glances | `/`, Docker socket, `/etc/os-release` | | Scrutiny | `/mnt/user/appdata/scrutiny/*`, `/run/udev`, selected `/dev/...` disks | | Speedtest | `/mnt/user/appdata/speedtest-tracker/config` | -| Grafana/InfluxDB | `/mnt/user/appdata/grafana`, Grafana provisioning, `/mnt/user/appdata/influxdb3/data`, `/mnt/user/appdata/influxdb3/plugins` | -| Loki/Alloy | `/mnt/user/appdata/loki/config`, `/mnt/user/appdata/loki/data`, `/mnt/user/appdata/alloy/config`, `/mnt/user/appdata/alloy/data` | -| Monitoring | named volumes `prometheus_data`, `loki_data`, `promtail_positions`, `grafana_data`; InfluxDB-Persistenz unter `/mnt/user/appdata/influxdb3/data` und `/mnt/user/appdata/influxdb3/plugins`; Provisioning im Repo unter `monitoring/grafana/provisioning`; Dashboards unter `monitoring/grafana/dashboards` | +| Monitoring | named volumes `prometheus_data`, `loki_data`, `promtail_positions`, `grafana_data`; InfluxDB-Persistenz unter `/mnt/user/appdata/influxdb3/data` und `/mnt/user/appdata/influxdb3/plugins`; Provisioning im Repo unter `monitoring/grafana/provisioning`; Dashboards unter `monitoring/grafana/dashboards`; historische Altstandsdaten unter `/mnt/user/appdata/grafana`, `/mnt/user/appdata/loki` und `/mnt/user/appdata/alloy` nicht blind loeschen | | Hermes Agent | `/mnt/user/appdata/hermes-agent/data`, `/mnt/user/appdata/hermes-agent/ssh`, SSH private key path | | Komodo | `komodo_keys`, `/mnt/user/appdata/komodo/core`, `/mnt/user/appdata/komodo/mongo`, `/mnt/user/appdata/komodo/periphery`, `/mnt/user/services` | @@ -228,8 +217,6 @@ Secret-Werte werden hier nicht dokumentiert. Aufgefuehrt werden nur Variablennam | Komodo | `KOMODO_SECRET_KEY`, `KOMODO_WEBHOOK_SECRET`, `KOMODO_JWT_SECRET`, `KOMODO_MONGO_PASSWORD`, `KOMODO_PERIPHERY_PASSKEY`; Mongo Passwort-Datei | | Borg UI | Borg Credentials, Admin Login, SSH Keys in persistentem Appdata, nicht im Git | | Hermes Agent | provider keys, API server key, messaging tokens, Home Assistant token in Host `.env`; SSH private key als Host-Secret | -| Grafana/InfluxDB | Grafana Admin Password, InfluxDB Admin Token JSON, Grafana Datasource Token | -| Loki/Alloy | keine zusaetzlichen Secrets; Zugriff nur intern ueber `backend_net` | | Monitoring | `monitoring_grafana_admin_password.txt`, `monitoring_grafana_influxdb_token.txt`, `influxdb3_admin_token.json` fuer zentrale Grafana-/InfluxDB-Funktionen; ersetzt Uptime Kuma fuer HTTP-Verfuegbarkeit | ## Skripte @@ -253,7 +240,7 @@ Das Skript liest Secret-Dateien auf dem Host und schreibt Dump-Artefakte. Bei An - Stateful Datenhalter sind seit 2026-05-05 bevorzugt mit Minor-/Patch-Tag plus Digest gepinnt; Redis-Caches wurden im Hardening-Sprint 2026-05-16 auf `redis:7.4-alpine@sha256:...` vereinheitlicht. - `scrutiny` bleibt `privileged: true`; dokumentierte Ausnahme, aber weiterhin pruefenswert. - `tailscale` nutzt Host-Netz, `NET_ADMIN`, `NET_RAW` und `/dev/net/tun` als dokumentierte VPN-Ausnahme. -- `grafana`, `influxdb3-core` und `monitoring-influxdb3-core` laufen aktuell als `user: "0"`; UID/GID-Hardening nur als eigener Sprint. +- `monitoring-influxdb3-core` laeuft aktuell als `user: "0"`; UID/GID-Hardening nur als eigener Sprint. - Leere `.keep`-Platzhalter wurden entfernt; neue Verzeichnisse sollen erst mit konkretem Inhalt ins Repo. - `plex` ist als Repo-Compose-Stack unter `host-services/plex/` enthalten; `network_mode: host` bleibt die dokumentierte Discovery-Ausnahme. - BentoPDF kann je nach Live-Stand vorbereitet statt produktiv sein; Hermes Dashboard ist produktiv unter `hermes.kaleschke.info`. diff --git a/docs/RESTORE_MATRIX.md b/docs/RESTORE_MATRIX.md index bb8a142..67d43b0 100644 --- a/docs/RESTORE_MATRIX.md +++ b/docs/RESTORE_MATRIX.md @@ -65,9 +65,9 @@ Sie ist die fachliche Ergaenzung zu `docs/DISASTER_RECOVERY.md`. | Scrutiny | Teilweise rebuildbar | `/mnt/user/appdata/scrutiny` falls gewuenscht | InfluxDB bewusst nicht Teil des Critical-Scope | keine | Traefik, Authelia | UI startet, Laufwerke sichtbar | | Speedtest Tracker | Share + Dump | `/mnt/user/appdata/speedtest-tracker/config` | `speedtest-tracker.sqlite.dump` | `APP_KEY`, `ADMIN_PASSWORD` | Traefik, Authelia | UI startet | | BentoPDF | Rebuildbar | keine kritische Persistenz; alte Stirling-PDF-Daten unter `/mnt/user/appdata/stirling-pdf` bis zur Abnahme behalten | keine | keine separaten Secret-Dateien dokumentiert | Traefik, Authelia | UI startet, PDF-Tools verfuegbar, Office-Konvertierung ueber HTTPS funktioniert | -| Grafana | abgeloester Altstand | `/mnt/user/appdata/grafana`, inklusive `provisioning/datasources/influxdb.yml` | `grafana.sqlite` | `grafana_admin_password.txt`, `grafana_influxdb_token.txt` | Traefik, Authelia, InfluxDB 3 Core | Nur als Rollback-/Migrationsreferenz behalten, wenn `monitoring/` produktiv ist | -| InfluxDB 3 Core | abgeloester Altstand | `/mnt/user/appdata/influxdb3/data`, `/mnt/user/appdata/influxdb3/plugins` | dateibasierter Object Store | `influxdb3_admin_token.json` | internes `grafana_influx_internal` Netz | Nach Migration nicht blind loeschen; Datenuebernahme zu `monitoring-influxdb3-core` separat pruefen | -| Loki / Alloy | abgeloester Altstand | `/mnt/user/appdata/loki/config`, `/mnt/user/appdata/loki/data`, `/mnt/user/appdata/alloy/config` | keine primaere DB; Loki-Dateispeicher mit 30 Tagen Retention | keine zusaetzlichen Secrets | `backend_net`, Docker socket read-only, Grafana | Durch `monitoring-loki`/`monitoring-promtail` ersetzen | +| Grafana | historischer Altstand | `/mnt/user/appdata/grafana` | `grafana.sqlite` | `grafana_admin_password.txt`, `grafana_influxdb_token.txt` | nicht aktiv | Compose-Pfad aus aktivem Repo entfernt; nur ueber Git-Historie wiederherstellen, falls ein Rollback wirklich noetig ist | +| InfluxDB 3 Core | historischer Altstand / Datenuebernahme | `/mnt/user/appdata/influxdb3/data`, `/mnt/user/appdata/influxdb3/plugins` | dateibasierter Object Store | `influxdb3_admin_token.json` | `monitoring-influxdb3-core` | Datenpfad wird vom Monitoring-Zielstack weitergenutzt und darf nicht blind geloescht werden | +| Loki / Alloy | historischer Altstand | `/mnt/user/appdata/loki/config`, `/mnt/user/appdata/loki/data`, `/mnt/user/appdata/alloy/config` | keine primaere DB; Loki-Dateispeicher war transient | keine zusaetzlichen Secrets | nicht aktiv | Compose-Pfad aus aktivem Repo entfernt; aktuelle Logsammlung laeuft ueber `monitoring-loki`/`monitoring-promtail` | | Monitoring Stack | Rebuild + named volumes + InfluxDB-Appdata | `prometheus_data`, `loki_data`, `promtail_positions`, `grafana_data`; InfluxDB unter `/mnt/user/appdata/influxdb3/data` und `/mnt/user/appdata/influxdb3/plugins`; Provisioning aus `monitoring/grafana/provisioning` | Prometheus-TSDB, Loki-Dateispeicher und InfluxDB-Dateistore; Diagnose-/Langzeitdaten, keine Tier-1-Restore-Quelle | `monitoring_grafana_admin_password.txt`, `monitoring_grafana_influxdb_token.txt`, `influxdb3_admin_token.json` | `monitoring_net`, `monitoring_influx_lan`, `frontend_net`, Traefik, Authelia, Docker socket read-only fuer Promtail, Host-Mounts fuer node-exporter/cAdvisor | `https://monitoring.kaleschke.info` leitet zu Authelia; Prometheus Targets sind up; Grafana-Datasources `Prometheus`, `Loki` und `InfluxDB 3 Core` funktionieren | | Hermes Agent | VM-seitig offen | `/mnt/user/appdata/hermes-agent/data`, `/mnt/user/appdata/hermes-agent/ssh` | keine eigene DB | Host-`.env` fuer Provider-/API-/Home-Assistant-Tokens, `hermes_runner_id_ed25519`, `HERMES_DASHBOARD_HOST` | separate Hermes-VM/Runner, Traefik, Authelia, `hermes_net` | NAS-Stack nicht starten, solange Runner-VM und echte `.env` fehlen | | ddns-updater | Rebuildbar | geringe Persistenzrelevanz | keine | Provider-Zugang ueber Stack ENV | Internetzugang | Update-Job laeuft | diff --git a/docs/ROLLBACK.md b/docs/ROLLBACK.md index 258b8df..f6f304e 100644 --- a/docs/ROLLBACK.md +++ b/docs/ROLLBACK.md @@ -89,7 +89,7 @@ Vor dem ersten produktiven Einsatz reicht es, den vorbereiteten Stack nicht zu d Nach einem Deploy: -1. `ops/grafana-influxdb` in Komodo stoppen oder den letzten Git-Stand ohne diesen Stack deployen +1. alten Grafana/InfluxDB-Stack in Komodo gestoppt lassen; der fruehere Compose-Pfad `ops/grafana-influxdb` ist seit 2026-05-26 nicht mehr im aktiven Repo 2. Persistenz unter `/mnt/user/appdata/grafana` und `/mnt/user/appdata/influxdb3` unangetastet lassen 3. Secrets unter `/mnt/user/appdata/secrets/grafana_admin_password.txt`, `/mnt/user/appdata/secrets/grafana_influxdb_token.txt` und `/mnt/user/appdata/secrets/influxdb3_admin_token.json` nur nach bewusstem Entscheid entfernen 4. Grafana-Domain und InfluxDB-Zugriff testen, bis klar ist, dass keine produktiven Dashboards oder Writer mehr davon abhaengen @@ -99,7 +99,7 @@ Nach einem Deploy: Der Zielzustand ist `monitoring/` als einziger Observability-Stack. Bei Problemen nach der Migration: 1. `monitoring` in Komodo stoppen oder auf den letzten funktionierenden Commit zurueckgehen -2. bei Bedarf die abgeloesten Altstaende `ops/loki` und/oder `ops/grafana-influxdb` wieder starten +2. nur im echten Notfall die abgeloesten Altstaende aus der Git-Historie vor dem Repo-Cleanup wiederherstellen, z. B. aus Commit `ff5991c`; nicht dauerhaft parallel zum Zielstack betreiben 3. named volumes `prometheus_data`, `loki_data`, `promtail_positions`, `grafana_data` sowie `/mnt/user/appdata/influxdb3` nicht blind loeschen 4. Secrets `monitoring_grafana_admin_password.txt`, `monitoring_grafana_influxdb_token.txt` und `influxdb3_admin_token.json` nur nach bewusstem Entscheid entfernen 5. Home Assistant Writer erst wieder umstellen, wenn `curl -i http://192.168.178.58:8181/` erwartbar `401 Unauthorized` liefert diff --git a/docs/SECRETS_MAP.md b/docs/SECRETS_MAP.md index ed72bf4..1a1ebe3 100644 --- a/docs/SECRETS_MAP.md +++ b/docs/SECRETS_MAP.md @@ -26,7 +26,6 @@ Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einb | Paperless-ngx | Redis URL | Stack ENV `${PAPERLESS_REDIS}` | aktiv | | code-server | Passwort | `/mnt/user/appdata/code-server/secrets/password` -> `FILE__PASSWORD` | aktiv | | Filebrowser | Admin Password | `/mnt/user/appdata/secrets/filebrowser_admin_password.txt` -> initialisierte SQLite-DB | aktiv | -| Uptime Kuma | Admin Password | `/mnt/user/appdata/secrets/uptime_kuma_admin_password.txt` -> initialisierte SQLite-DB | stillgelegt 2026-05-25; nur fuer Alt-Appdata/Archiv | | Immich (server) | DB Password | Stack ENV `${IMMICH_DB_PASSWORD}` | aktiv | | immich-postgres | DB Password | `/mnt/user/appdata/secrets/immich_postgres_password.txt` -> `POSTGRES_PASSWORD_FILE` | aktiv | | mail-archiver | DB Connection | Stack ENV `${MAILARCHIVER_DB_CONNECTION}` | aktiv | @@ -49,9 +48,7 @@ Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einb | Unraid Flash Backup | Boot-/Array-/Share-/Plugin-Konfiguration, ggf. Hashes/Keys/Templates | `/mnt/user/backups/borg/dumps/latest/unraid-flash-config.tar.gz`, via Borg/Hetzner gesichert | aktiv; wie Secret-Material behandeln | | Hermes Agent | Provider-Keys, Bot-Tokens, API-Server-Key | `/mnt/user/appdata/hermes-agent/data/.env` | VM-seitig offen | | Hermes Agent | SSH-Runner Private Key | `/mnt/user/appdata/secrets/hermes_runner_id_ed25519` -> `/root/.ssh/id_ed25519` | VM-seitig offen | -| Grafana | Admin Password | `/mnt/user/appdata/secrets/grafana_admin_password.txt` -> `GF_SECURITY_ADMIN_PASSWORD__FILE` | aktiv | | InfluxDB 3 Core | Admin Token JSON | `/mnt/user/appdata/secrets/influxdb3_admin_token.json` -> Docker Secret `/run/secrets/influxdb3_admin_token` | aktiv | -| Grafana -> InfluxDB | Datasource Token | `/mnt/user/appdata/secrets/grafana_influxdb_token.txt` -> Docker Secret `/run/secrets/grafana_influxdb_token` | aktiv | | Monitoring Grafana | Admin Password | `/mnt/user/appdata/secrets/monitoring_grafana_admin_password.txt` -> Docker Secret `/run/secrets/monitoring_grafana_admin_password` -> `GF_SECURITY_ADMIN_PASSWORD__FILE` | aktiv | | Monitoring Grafana -> InfluxDB | Datasource Token | `/mnt/user/appdata/secrets/monitoring_grafana_influxdb_token.txt` -> Docker Secret `/run/secrets/monitoring_grafana_influxdb_token` | aktiv | | Home Assistant -> InfluxDB | HA InfluxDB Token | `/homeassistant/secrets.yaml` -> `influxdb3_homeassistant_token` | geplant | @@ -64,6 +61,8 @@ Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einb |---|---|---| | Gotify | `gotify_password.txt` / `GOTIFY_DEFAULTUSER_PASS_FILE` | Dienst nicht mehr aktiv | | diun | Stack ENV | Container entfernt | +| Uptime Kuma | `uptime_kuma_admin_password.txt` | Dienst am 2026-05-25 entfernt; nur fuer Alt-Appdata/Archiv behalten | +| Grafana Altstand | `grafana_admin_password.txt`, `grafana_influxdb_token.txt` | Compose-Pfad aus aktivem Repo entfernt; nur fuer Git-Historie-/Rollback-Fall behalten | --- @@ -87,11 +86,8 @@ Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einb |-- postgres_password.txt |-- redis_password.txt |-- borg_repo_passphrase.txt -|-- grafana_admin_password.txt -|-- grafana_influxdb_token.txt |-- influxdb3_admin_token.json |-- filebrowser_admin_password.txt -|-- uptime_kuma_admin_password.txt `-- vaultwarden_admin_token.txt ``` diff --git a/docs/SERVICE_CATALOG.md b/docs/SERVICE_CATALOG.md index 464c8e8..f9fb489 100644 --- a/docs/SERVICE_CATALOG.md +++ b/docs/SERVICE_CATALOG.md @@ -65,8 +65,6 @@ Secret-Werte sind nicht enthalten. Es werden nur Secret-Namen, Env-Key-Namen und | `speedtest-tracker` | Speedtest-Monitoring | `ops/speedtest/docker-compose.yml` | `https://speedtest.kaleschke.info` | Traefik + Authelia | `/mnt/user/appdata/speedtest-tracker/config` | Tier 3, `speedtest-tracker.sqlite.dump` | ja + Authelia | `APP_KEY`, `ADMIN_PASSWORD` Stack ENV | | `filebrowser` | Datei-Browser fuer Documents/Photos/Projekte | `ops/filebrowser/docker-compose.yml` | `https://files.kaleschke.info` | Traefik + Authelia | `/mnt/user/appdata/filebrowser/*`, `/mnt/user/documents`, `/mnt/user/photos`, `/mnt/user/projekte` | Tier 3, `filebrowser.bolt.dump` + Share | ja + Authelia | Breiter Appdata-Mount entfernt; Secrets und Traefik-Dynamic-Config sind nicht mehr ueber Filebrowser gemountet | | `code-server` | Web-Editor / Operations Workspace | `ops/code-server/docker-compose.yml` | `https://code.kaleschke.info` | Traefik + Authelia | `/mnt/user/appdata/code-server`, `/mnt/user/services/dev` | Tier 3 | ja + Authelia | Passwort ueber LSIO `FILE__PASSWORD`; Workspaces beachten | -| `grafana` | abgeloester Altstand fuer Grafana/InfluxDB | `ops/grafana-influxdb/docker-compose.yml` | kein aktiver Zugang; frueher `https://grafana.kaleschke.info` | Traefik + Authelia, InfluxDB 3 Core | `/mnt/user/appdata/grafana`, Grafana provisioning | Tier 3, `grafana.sqlite` | nur Rollback-Referenz | Docker-Runtime ist frei von `grafana`/`influxdb3-core`; Stack nicht parallel zum neuen `monitoring/`-Zielstack betreiben | -| `influxdb3-core` | abgeloester Altstand fuer Home-Assistant-Langzeitdaten | `ops/grafana-influxdb/docker-compose.yml` | kein aktiver Zugang; LAN `8181` gehoert dem Monitoring-Zielstack | Grafana, Home Assistant Writer | `/mnt/user/appdata/influxdb3/data`, `/mnt/user/appdata/influxdb3/plugins` | Tier 3 | nein | Alter Stack ist gestoppt; Datenpfad bleibt fuer `monitoring-influxdb3-core` erhalten und wird nicht blind geloescht | | `monitoring-grafana` | zentrale Observability-UI fuer Metriken, Logs und InfluxDB | `monitoring/docker-compose.yml` | `https://monitoring.kaleschke.info` | Traefik + Authelia, Prometheus, Loki, InfluxDB 3 Core | named volume `grafana_data`, Provisioning unter `monitoring/grafana/provisioning`, Dashboards unter `monitoring/grafana/dashboards` | Tier 3, named volume | ja + Authelia | Admin-Passwort ueber `monitoring_grafana_admin_password.txt`; Zielbestand: `Homelab / Availability`, `Homelab / Host Overview`, `Homelab / Containers + Logs`, `Traefik Official Standalone Dashboard`; Dashboard-Importer ist optionales `bootstrap`-Profil fuer Traefik | | `monitoring-prometheus` | Metrik-Speicher fuer Homelab-Monitoring | `monitoring/docker-compose.yml`, `monitoring/prometheus/prometheus.yml`, `monitoring/prometheus/alerts.yml` | intern `http://prometheus:9090` | `monitoring_net`, node-exporter, cAdvisor, Traefik-Metrics, Blackbox Exporter, Alertmanager | named volume `prometheus_data` | Tier 3, transiente Metriken mit 30 Tagen Retention | nein | Scrapes: Prometheus, node-exporter, cAdvisor, Traefik `:8082`, `blackbox-http`; Prometheus-Regeln senden an Alertmanager und von dort nach ntfy | | `monitoring-alertmanager` | Alert-Routing fuer Prometheus-Regeln | `monitoring/docker-compose.yml`, `monitoring/alertmanager/alertmanager.yml` | intern `:9093` | Prometheus, ntfy Bridge | named volume `alertmanager_data` | Tier 3 | nein | sendet firing und resolved Alerts an `monitoring-alertmanager-ntfy-bridge` | @@ -77,8 +75,6 @@ Secret-Werte sind nicht enthalten. Es werden nur Secret-Namen, Env-Key-Namen und | `monitoring-node-exporter` | Host-Metriken fuer Prometheus | `monitoring/docker-compose.yml` | intern `:9100` | Host `/proc`, `/sys`, `/` read-only, Prometheus | kein kritischer Zustand | rebuildbar | nein | Host-Observability-Ausnahme mit read-only Rootfs/Proc/Sys-Mounts | | `monitoring-cadvisor` | Container-Metriken fuer Prometheus | `monitoring/docker-compose.yml` | intern `:8080` | Docker/Host read-only Mounts, Prometheus | kein kritischer Zustand | rebuildbar | nein | Host-Observability-Ausnahme fuer Container-Metriken; keine direkten Ports | | `monitoring-influxdb3-core` | InfluxDB 3 Core fuer Home-Assistant-/Ecowitt-Langzeitdaten | `monitoring/docker-compose.yml` | LAN `8181` je `INFLUXDB_BIND_IP`, keine Public URL | Monitoring-Grafana, Home Assistant Writer | `/mnt/user/appdata/influxdb3/data`, `/mnt/user/appdata/influxdb3/plugins` | Tier 3 | nein | LAN-only Host-Port-Ausnahme; `user: "0"` ist fuer den lokalen Object-Store-Pfad dokumentiert; uebernimmt den bisherigen InfluxDB-Daten-/Token-Katalog; `401 Unauthorized` beim Curl ohne Token ist erwarteter Reachability-Test | -| `loki` | abgeloester Altstand fuer Container-Logs | `ops/loki/docker-compose.yml`, `ops/loki/config/loki-config.yml` | kein aktiver Zugang | `backend_net`, Grafana | `/mnt/user/appdata/loki/config`, `/mnt/user/appdata/loki/data` | Tier 3, transiente Logs mit 30 Tagen Retention | nein | Durch `monitoring-loki` ersetzt; Docker-Runtime ist frei vom Altcontainer | -| `alloy` | abgeloester Altstand fuer Docker-Log-Collection | `ops/loki/docker-compose.yml`, `ops/loki/config/config.alloy` | kein aktiver Zugang | Docker socket read-only, Loki, `backend_net` | `/mnt/user/appdata/alloy/config`, `/mnt/user/appdata/alloy/data` | rebuildbar | nein | Durch `monitoring-promtail` ersetzt; Socket-Ausnahme bleibt nur fuer aktive Collector relevant | | `hermes-gateway` | Hermes Agent Gateway/API intern | `ops/hermes-agent/docker-compose.yml` | intern `8642` auf `hermes_net` | SSH Runner (VM 192.168.178.143), LLM Provider, optional Home Assistant | `/mnt/user/appdata/hermes-agent/data`, SSH key path | Tier 3, Borg/Share | nein | NAS-Stack bleibt deaktiviert, solange die separate Hermes-VM/Runner-Seite nicht wiederhergestellt ist; kein Docker-Socket | | `hermes-dashboard` | Hermes Dashboard | `ops/hermes-agent/docker-compose.yml` | `https://hermes.kaleschke.info` via `${HERMES_DASHBOARD_HOST}` | `hermes-gateway`, Traefik + Authelia | shared read-only data mount | Tier 3, Borg/Share | ja + Authelia | Compose-Profil `dashboard`; aktuell VM-seitig offen, nicht Teil des NAS-Finalstarts | diff --git a/docs/STORAGE_LAYOUT.draft.md b/docs/STORAGE_LAYOUT.draft.md index 19fb8ef..2309fef 100644 --- a/docs/STORAGE_LAYOUT.draft.md +++ b/docs/STORAGE_LAYOUT.draft.md @@ -292,7 +292,7 @@ Diese Regeln sind nicht optional. Verstoß ist Incident, kein Feature-Request. 12. **Kein Backup-Lauf ohne vorgeschalteten Posture-Check (siehe §11).** Backup auf kompromittiertem Filesystem überschreibt unter Umständen den letzten guten Stand und kontaminiert die Backup-Historie. **Dokumentierte Host-Observability-Ausnahmen (Operator-Entscheidung 2026-05-16):** -`glances`, `scrutiny`, `monitoring-promtail`, `monitoring-node-exporter` und `monitoring-cadvisor` duerfen gezielt Host-/Device-Bind-Mounts ausserhalb `/mnt/user/...` nutzen, weil ihre Kernfunktion sonst nicht erfuellbar ist. Erlaubt sind nur die in `docs/SERVICE_CATALOG.md` pro Dienst genannten Binds. Diese Ausnahmen sind keine Datenpersistenz-Pfade und duerfen nicht fuer Appdaten, Backups oder normale Service-Konfiguration erweitert werden. Neue oder geaenderte Host-Binds brauchen eine explizite Doku-Aenderung im selben Commit. `alloy` ist nur noch als abgeloester Altstand relevant. +`glances`, `scrutiny`, `monitoring-promtail`, `monitoring-node-exporter` und `monitoring-cadvisor` duerfen gezielt Host-/Device-Bind-Mounts ausserhalb `/mnt/user/...` nutzen, weil ihre Kernfunktion sonst nicht erfuellbar ist. Erlaubt sind nur die in `docs/SERVICE_CATALOG.md` pro Dienst genannten Binds. Diese Ausnahmen sind keine Datenpersistenz-Pfade und duerfen nicht fuer Appdaten, Backups oder normale Service-Konfiguration erweitert werden. Neue oder geaenderte Host-Binds brauchen eine explizite Doku-Aenderung im selben Commit. ## 13. Soft Rules — Konventionen diff --git a/monitoring/README.md b/monitoring/README.md index 96a840a..e509ac4 100644 --- a/monitoring/README.md +++ b/monitoring/README.md @@ -15,7 +15,7 @@ Zielzustand: ein zentraler Observability-Stack fuer KalliLab CORE. - `monitoring-blackbox-exporter`: externe HTTP-Erreichbarkeit als Uptime-Kuma-Ersatz - `monitoring-influxdb3-core`: InfluxDB 3 Core fuer Home-Assistant-/Ecowitt-Langzeitdaten -Die alten Pfade `ops/loki` und `ops/grafana-influxdb` sind damit abgeloeste Altstaende. Sie bleiben vorerst im Repo als Rollback- und Migrationsreferenz, sollen aber nach erfolgreichem Live-Deploy nicht parallel betrieben werden. +Die alten Pfade `ops/loki` und `ops/grafana-influxdb` wurden am 2026-05-26 aus dem aktiven Repo entfernt. Rollback erfolgt bei Bedarf ueber Git-Historie, nicht ueber parallel gepflegte Compose-Verzeichnisse. Live-Stand 2026-05-25: die zehn `monitoring-*` Container laufen produktiv, die alten Container `grafana`, `influxdb3-core`, `loki` und `alloy` sind in Docker nicht mehr vorhanden. Uptime Kuma ist durch Blackbox Exporter, Prometheus-Alerts und das Dashboard `Homelab / Availability` abgeloest. @@ -53,8 +53,9 @@ INFLUXDB_BIND_IP=192.168.178.58 2. Alten `ops/loki`-Stack stoppen, wenn `monitoring-loki` und `monitoring-promtail` live gehen. Erledigt. 3. Alten `ops/grafana-influxdb`-Stack stoppen, bevor `monitoring-influxdb3-core` den LAN-Port `192.168.178.58:8181` uebernimmt. Erledigt. 4. `monitoring` via Komodo deployen und `INFLUXDB_BIND_IP=192.168.178.58` erst setzen, wenn der Altcontainer den Port freigegeben hat. Erledigt. -5. Optionales Dashboard-Bootstrap-Profil einmalig ausfuehren. -6. Home Assistant Writer gegen `http://192.168.178.58:8181/` pruefen; `401 Unauthorized` ohne Token ist erwartbar. +5. Alte Repo-Verzeichnisse `ops/loki` und `ops/grafana-influxdb` entfernen. Erledigt. +6. Optionales Dashboard-Bootstrap-Profil einmalig ausfuehren. +7. Home Assistant Writer gegen `http://192.168.178.58:8181/` pruefen; `401 Unauthorized` ohne Token ist erwartbar. ## Smoke-Tests diff --git a/ops/grafana-influxdb/README.md b/ops/grafana-influxdb/README.md deleted file mode 100644 index ec64cd6..0000000 --- a/ops/grafana-influxdb/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# Grafana + InfluxDB 3 Core - -Status: abgeloester Altstand. Der zentrale Zielzustand ist `monitoring/` mit `monitoring-grafana`, `monitoring-influxdb3-core`, Prometheus, Loki und Promtail. - -Monitoring-Stack fuer Grafana + InfluxDB 3 Core. InfluxDB bleibt ohne Public Route; interne Writer wie Home Assistant koennen ueber einen gezielt gebundenen LAN-Port schreiben. - -Nach erfolgreichem `monitoring/`-Deploy diesen Stack nicht parallel weiterbetreiben. Er bleibt vorerst als Rollback- und Migrationsreferenz im Repo. - -## Quellen / Entscheidungen - -- Grafana nutzt das offizielle OSS-Image `grafana/grafana:12.4.3`. -- InfluxDB nutzt `influxdb:3.9.1-core`, nicht `latest`, weil `latest` bei InfluxDB aktiv in Richtung InfluxDB 3 umgestellt wird. -- Grafana wird ueber Traefik + `authelia@file,secure-headers@file` unter `grafana.kaleschke.info` veroeffentlicht. -- InfluxDB bleibt ohne Traefik-Route. Der HTTP-Port `8181` kann fuer interne Writer wie Home Assistant ueber `INFLUXDB_BIND_IP` auf eine LAN-Adresse gebunden werden; Default ist `127.0.0.1`. -- InfluxDB haengt an zwei Compose-Netzen: `grafana_influx_internal` fuer Grafana und `grafana_influx_lan` fuer das Docker Host-Port-Publishing. Im laufenden Komodo-Stack heissen sie durch den Compose-Projektpraefix `grafana_grafana_influx_internal` und `grafana_grafana_influx_lan`. InfluxDB haengt bewusst nicht im `frontend_net`. -- Grafana provisioning legt eine SQL-Datenquelle fuer InfluxDB 3 Core mit der Datenbank `homelab` und eine Loki-Datasource fuer Container-Logs an. -- Der Grafana-Datasource-Token liegt als Secret-Datei auf dem Host und wird beim Containerstart nur containerintern in die fuer Grafana-Provisioning noetige Environment-Variable geladen. -- Home Assistant schreibt mit der InfluxDB-v2-API-Kompatibilitaet nach InfluxDB 3; Details: `docs/HOME_ASSISTANT_INFLUXDB_ECOWITT.md`. - -## Initiale Einrichtung - -1. Secret fuer Grafana anlegen: - - ```bash - install -m 600 /dev/null /mnt/user/appdata/secrets/grafana_admin_password.txt - ``` - -2. Offline-Admin-Token fuer InfluxDB 3 als JSON anlegen: - - ```json - { - "token": "apiv3_REPLACE_WITH_STRONG_RANDOM_TOKEN", - "name": "admin", - "description": "Admin token for KalliLab InfluxDB 3 Core" - } - ``` - - Pfad: `/mnt/user/appdata/secrets/influxdb3_admin_token.json`, Rechte `600`. - -3. Grafana-Datasource-Token anlegen. Fuer InfluxDB 3 Core aktuell einen eigenen Named-Admin-Token verwenden, damit der Grafana-Zugang getrennt vom initialen Operator-/Admin-Token rotiert werden kann: - - ```bash - install -m 600 /dev/null /mnt/user/appdata/secrets/grafana_influxdb_token.txt - ``` - -4. Provisioning-Dateien aus dem Git-Checkout auf den Host-Appdata-Pfad kopieren: - - ```bash - mkdir -p /mnt/user/appdata/grafana/provisioning/datasources - mkdir -p /mnt/user/appdata/grafana/provisioning/dashboards - cp /mnt/user/appdata/komodo/core/repos/homelab-infra/ops/grafana-influxdb/provisioning/datasources/influxdb.yml /mnt/user/appdata/grafana/provisioning/datasources/influxdb.yml - cp /mnt/user/appdata/komodo/core/repos/homelab-infra/ops/grafana-influxdb/provisioning/dashboards/* /mnt/user/appdata/grafana/provisioning/dashboards/ - chmod 644 /mnt/user/appdata/grafana/provisioning/datasources/influxdb.yml - chmod 644 /mnt/user/appdata/grafana/provisioning/dashboards/* - ``` - -5. Nach dem ersten Start die Datenbank anlegen: - - ```bash - docker exec influxdb3-core influxdb3 create database homelab --token "$INFLUXDB3_AUTH_TOKEN" - ``` - -## Smoke-Test nach Deploy - -- `https://grafana.kaleschke.info` oeffnet nach Authelia die Grafana-Loginseite. -- Grafana `Connections -> Data sources -> InfluxDB 3 Core -> Save & test` ist erfolgreich. -- Grafana `Connections -> Data sources -> Loki -> Save & test` ist erfolgreich, sobald der Loki/Alloy-Stack laeuft. -- Die provisionierten Dashboards `Logs - Last 60m`, `Container Restart Events` und `Container Error Rate` sind sichtbar. -- InfluxDB bleibt ohne Public Route. Falls `INFLUXDB_BIND_IP` auf die LAN-IP gesetzt ist, ist Port `8181` nur im internen Netz fuer Writer wie Home Assistant erreichbar. -- `docker ps` zeigt fuer `influxdb3-core` `192.168.178.58:8181->8181/tcp` oder den per `INFLUXDB_BIND_IP` gesetzten Host. -- `ss -ltnp | grep 8181` zeigt einen Listener auf der gebundenen Host-IP. -- `curl -i http://192.168.178.58:8181/` liefert ohne Token erwartbar `401 Unauthorized`. - -## Drift-Check - -Wenn Komodo, Gitea und Runtime nicht zusammenpassen, zuerst `docs/GITOPS_DRIFT_RUNBOOK.md` verwenden. Besonders wichtig: - -```bash -cd /mnt/user/services/stacks/grafana -git rev-parse --short HEAD -grep -nE "ports:|grafana_influx_lan|grafana_influx_internal" -A4 -B2 ops/grafana-influxdb/docker-compose.yml -docker inspect influxdb3-core --format '{{json .NetworkSettings.Ports}}' -docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep influx -ss -ltnp | grep 8181 -``` - -## Rollback - -- Stack in Komodo stoppen oder Git auf den letzten Stand ohne `ops/grafana-influxdb` zuruecknehmen. -- Persistente Daten liegen unter `/mnt/user/appdata/grafana` und `/mnt/user/appdata/influxdb3`; nicht automatisch loeschen. diff --git a/ops/grafana-influxdb/docker-compose.yml b/ops/grafana-influxdb/docker-compose.yml deleted file mode 100644 index f05d2bb..0000000 --- a/ops/grafana-influxdb/docker-compose.yml +++ /dev/null @@ -1,91 +0,0 @@ -services: - grafana: - image: grafana/grafana:12.4.3@sha256:2e986801428cd689c2358605289c90ab37d2b39e24808874971f54c99bcdc412 - container_name: grafana - restart: unless-stopped - user: "0" - environment: - GF_SERVER_ROOT_URL: https://grafana.kaleschke.info/ - GF_SECURITY_ADMIN_PASSWORD__FILE: /run/secrets/grafana_admin_password - GF_USERS_ALLOW_SIGN_UP: "false" - GF_AUTH_ANONYMOUS_ENABLED: "false" - dns: - - 1.1.1.1 - - 8.8.8.8 - entrypoint: - - /bin/sh - - -c - - | - export GRAFANA_INFLUXDB_TOKEN="$$(cat /run/secrets/grafana_influxdb_token)" - exec /run.sh - volumes: - - /mnt/user/appdata/grafana:/var/lib/grafana - - /mnt/user/appdata/grafana/provisioning:/etc/grafana/provisioning:ro - secrets: - - grafana_admin_password - - grafana_influxdb_token - networks: - - frontend_net - - backend_net - - grafana_influx_internal - security_opt: - - no-new-privileges:true - healthcheck: - test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000/api/health"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - labels: - - traefik.enable=true - - traefik.docker.network=frontend_net - - traefik.http.routers.grafana.rule=Host(`grafana.kaleschke.info`) - - traefik.http.routers.grafana.entrypoints=websecure - - traefik.http.routers.grafana.tls=true - - traefik.http.routers.grafana.tls.certresolver=le - - traefik.http.routers.grafana.middlewares=authelia@file,secure-headers@file - - traefik.http.services.grafana.loadbalancer.server.port=3000 - - influxdb3-core: - image: influxdb:3.9.1-core@sha256:1d58c8b9ac90153ae3a020ede2810c8284933dda50ac71e7573389ab6f012128 - container_name: influxdb3-core - restart: unless-stopped - user: "0" - ports: - - "${INFLUXDB_BIND_IP:-127.0.0.1}:8181:8181" - command: - - influxdb3 - - serve - - --node-id=kallilabcore - - --object-store=file - - --data-dir=/var/lib/influxdb3/data - - --plugin-dir=/var/lib/influxdb3/plugins - - --admin-token-file=/run/secrets/influxdb3_admin_token - volumes: - - /mnt/user/appdata/influxdb3/data:/var/lib/influxdb3/data - - /mnt/user/appdata/influxdb3/plugins:/var/lib/influxdb3/plugins - secrets: - - influxdb3_admin_token - networks: - - grafana_influx_lan - - grafana_influx_internal - security_opt: - - no-new-privileges:true - -secrets: - grafana_admin_password: - file: /mnt/user/appdata/secrets/grafana_admin_password.txt - influxdb3_admin_token: - file: /mnt/user/appdata/secrets/influxdb3_admin_token.json - grafana_influxdb_token: - file: /mnt/user/appdata/secrets/grafana_influxdb_token.txt - -networks: - frontend_net: - external: true - backend_net: - external: true - grafana_influx_lan: - driver: bridge - grafana_influx_internal: - internal: true diff --git a/ops/grafana-influxdb/provisioning/dashboards/container-error-rate.json b/ops/grafana-influxdb/provisioning/dashboards/container-error-rate.json deleted file mode 100644 index 308c4fc..0000000 --- a/ops/grafana-influxdb/provisioning/dashboards/container-error-rate.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "uid": "kallilab-container-error-rate", - "title": "Container Error Rate", - "schemaVersion": 39, - "version": 1, - "refresh": "5m", - "time": { "from": "now-24h", "to": "now" }, - "panels": [ - { - "id": 1, - "type": "table", - "title": "Container Errors Last 24h", - "datasource": { "type": "loki", "uid": "loki" }, - "targets": [ - { - "refId": "A", - "expr": "sum by (container_name) (count_over_time({platform=\"docker\"} |~ \"(?i)(level=error|error|fatal|panic)\" [24h]))" - } - ], - "gridPos": { "h": 16, "w": 24, "x": 0, "y": 0 } - } - ] -} diff --git a/ops/grafana-influxdb/provisioning/dashboards/logs-last-60m.json b/ops/grafana-influxdb/provisioning/dashboards/logs-last-60m.json deleted file mode 100644 index c182aa6..0000000 --- a/ops/grafana-influxdb/provisioning/dashboards/logs-last-60m.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "uid": "kallilab-logs-last-60m", - "title": "Last 60 min before now", - "schemaVersion": 39, - "version": 1, - "refresh": "30s", - "time": { "from": "now-60m", "to": "now" }, - "templating": { - "list": [ - { - "name": "container", - "type": "query", - "datasource": { "type": "loki", "uid": "loki" }, - "query": "label_values(container_name)", - "includeAll": true, - "allValue": ".+", - "refresh": 1 - } - ] - }, - "panels": [ - { - "id": 1, - "type": "logs", - "title": "Docker Log Stream", - "datasource": { "type": "loki", "uid": "loki" }, - "targets": [ - { - "refId": "A", - "expr": "{platform=\"docker\", container_name=~\"$container\"}" - } - ], - "gridPos": { "h": 20, "w": 24, "x": 0, "y": 0 }, - "options": { - "showTime": true, - "showLabels": true, - "wrapLogMessage": false, - "enableLogDetails": true, - "sortOrder": "Descending" - } - } - ] -} diff --git a/ops/grafana-influxdb/provisioning/dashboards/providers.yml b/ops/grafana-influxdb/provisioning/dashboards/providers.yml deleted file mode 100644 index d18173b..0000000 --- a/ops/grafana-influxdb/provisioning/dashboards/providers.yml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: 1 - -providers: - - name: KalliLab Observability - orgId: 1 - folder: KalliLab Observability - type: file - disableDeletion: false - updateIntervalSeconds: 60 - allowUiUpdates: false - options: - path: /etc/grafana/provisioning/dashboards diff --git a/ops/grafana-influxdb/provisioning/dashboards/restart-events.json b/ops/grafana-influxdb/provisioning/dashboards/restart-events.json deleted file mode 100644 index 65bf755..0000000 --- a/ops/grafana-influxdb/provisioning/dashboards/restart-events.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "uid": "kallilab-restart-events", - "title": "Restart Events", - "schemaVersion": 39, - "version": 1, - "refresh": "5m", - "time": { "from": "now-24h", "to": "now" }, - "panels": [ - { - "id": 1, - "type": "heatmap", - "title": "Restart-like Log Events", - "datasource": { "type": "loki", "uid": "loki" }, - "targets": [ - { - "refId": "A", - "expr": "sum by (container_name) (count_over_time({platform=\"docker\"} |~ \"(?i)(restart|restarting|started|exited|oom)\" [5m]))" - } - ], - "gridPos": { "h": 16, "w": 24, "x": 0, "y": 0 } - } - ] -} diff --git a/ops/grafana-influxdb/provisioning/datasources/influxdb.yml b/ops/grafana-influxdb/provisioning/datasources/influxdb.yml deleted file mode 100644 index d04baff..0000000 --- a/ops/grafana-influxdb/provisioning/datasources/influxdb.yml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: 1 - -prune: true - -datasources: - - name: InfluxDB 3 Core - uid: influxdb3-core - type: influxdb - access: proxy - url: http://influxdb3-core:8181 - isDefault: true - jsonData: - version: SQL - dbName: homelab - httpMode: POST - insecureGrpc: true - secureJsonData: - token: $GRAFANA_INFLUXDB_TOKEN - - name: Loki - uid: loki - type: loki - access: proxy - url: http://loki:3100 - isDefault: false - jsonData: - maxLines: 1000 diff --git a/ops/grafana-influxdb/stack.env.example b/ops/grafana-influxdb/stack.env.example deleted file mode 100644 index af41733..0000000 --- a/ops/grafana-influxdb/stack.env.example +++ /dev/null @@ -1,3 +0,0 @@ -# Safe default: local host only. -# Set this to the Unraid LAN IP, for example 192.168.178.58, when a VM such as Home Assistant must write to InfluxDB. -INFLUXDB_BIND_IP=127.0.0.1 diff --git a/ops/hermes-agent/services.json b/ops/hermes-agent/services.json index 03f3cd9..8312e4f 100644 --- a/ops/hermes-agent/services.json +++ b/ops/hermes-agent/services.json @@ -315,48 +315,41 @@ "first_check": "HTTPS erreichbar? NTFY_BEHIND_PROXY=true gesetzt? Traefik healthy?", "notes": "KRITISCH: Ausfall bedeutet keine anderen Alerts ankommen" }, - "homepage": { - "description": "Start-Dashboard", + "glance": { + "description": "Homelab-Dashboard", "tier": 3, "category": "ops", - "container_name": "homepage", + "container_name": "glance", "dependencies": ["traefik"], - "url": "https://home.kaleschke.info", + "url": "https://glance.kaleschke.info", "dump_file": null, - "data_paths": ["/mnt/user/appdata/homepage"], - "first_check": "Traefik erreichbar? Docker-Socket read-only lesbar? API-Tokens gueltig?", - "notes": "Docker socket read-only; viele API Tokens in Config" + "data_paths": [], + "first_check": "Traefik erreichbar? Docker-Socket-Proxy intern erreichbar? API-Tokens fuer Widgets gueltig?", + "notes": "aktives Homelab-Dashboard; Homepage wurde entfernt" }, - "uptime-kuma": { - "description": "Monitoring / Uptime Checks", + "monitoring-grafana": { + "description": "Zentrale Observability-UI", "tier": 3, "category": "ops", - "container_name": "UptimeKuma", - "dependencies": ["traefik"], - "url": "https://uptime.kaleschke.info", + "container_name": "monitoring-grafana", + "dependencies": [ + "monitoring-prometheus", + "monitoring-loki", + "monitoring-influxdb3-core", + "traefik" + ], + "url": "https://monitoring.kaleschke.info", "dump_file": null, - "data_paths": ["/mnt/user/appdata/uptime-kuma"], - "first_check": "Datenbank-Volume intakt? Traefik erreichbar?", - "notes": "Monitore nach Restore manuell pruefen" + "data_paths": ["grafana_data"], + "first_check": "Authelia-Redirect? Datasources Prometheus, Loki und InfluxDB 3 Core gruen?", + "notes": "ersetzt alten Grafana-Altstand und Uptime-Kuma-Views" }, - "grafana": { - "description": "Metrik-Dashboard", + "monitoring-influxdb3-core": { + "description": "Zeitreihen- / Metrikdaten fuer Monitoring und Home Assistant", "tier": 3, "category": "ops", - "container_name": "grafana", - "dependencies": ["influxdb3-core", "traefik"], - "url": "https://grafana.kaleschke.info", - "dump_file": null, - "data_paths": ["/mnt/user/appdata/grafana"], - "first_check": "influxdb3-core healthy? Datasource-Token gesetzt? Provisioning-Konfig vorhanden?", - "notes": "laeuft als user 0; Datasource wird provisioniert" - }, - "influxdb3-core": { - "description": "Zeitreihen- / Metrikdaten fuer Grafana und Home Assistant", - "tier": 3, - "category": "ops", - "container_name": "influxdb3-core", - "dependencies": [], + "container_name": "monitoring-influxdb3-core", + "dependencies": ["monitoring-grafana"], "url": null, "dump_file": null, "data_paths": [ diff --git a/ops/hermes-agent/services.yaml b/ops/hermes-agent/services.yaml index 692dea0..68cdfed 100644 --- a/ops/hermes-agent/services.yaml +++ b/ops/hermes-agent/services.yaml @@ -395,55 +395,43 @@ services: # TIER 3 — Ops / Tools (Ausfall schmerzt, blockiert nichts Kritisches) # --------------------------------------------------------------------------- - homepage: - description: Start-Dashboard + glance: + description: Homelab-Dashboard tier: 3 category: ops - container_name: homepage + container_name: glance dependencies: - traefik - url: https://home.kaleschke.info + url: https://glance.kaleschke.info dump_file: null - data_paths: - - /mnt/user/appdata/homepage - first_check: "Traefik erreichbar? Docker-Socket read-only lesbar? API-Tokens gueltig?" - notes: "Docker socket read-only; viele API Tokens in Config" + data_paths: [] + first_check: "Traefik erreichbar? Docker-Socket-Proxy intern erreichbar? API-Tokens fuer Widgets gueltig?" + notes: "aktives Homelab-Dashboard; Homepage wurde entfernt" - uptime-kuma: - description: Monitoring / Uptime Checks + monitoring-grafana: + description: Zentrale Observability-UI tier: 3 category: ops - container_name: UptimeKuma + container_name: monitoring-grafana dependencies: + - monitoring-prometheus + - monitoring-loki + - monitoring-influxdb3-core - traefik - url: https://uptime.kaleschke.info + url: https://monitoring.kaleschke.info dump_file: null data_paths: - - /mnt/user/appdata/uptime-kuma - first_check: "Datenbank-Volume intakt? Traefik erreichbar?" - notes: "Monitore nach Restore manuell pruefen" + - grafana_data + first_check: "Authelia-Redirect? Datasources Prometheus, Loki und InfluxDB 3 Core gruen?" + notes: "ersetzt alten Grafana-Altstand und Uptime-Kuma-Views" - grafana: - description: Metrik-Dashboard + monitoring-influxdb3-core: + description: Zeitreihen- / Metrikdaten fuer Monitoring und Home Assistant tier: 3 category: ops - container_name: grafana + container_name: monitoring-influxdb3-core dependencies: - - influxdb3-core - - traefik - url: https://grafana.kaleschke.info - dump_file: null - data_paths: - - /mnt/user/appdata/grafana - first_check: "influxdb3-core healthy? Datasource-Token in Secret gesetzt? Provisioning-Konfig vorhanden?" - notes: "laeuft als user 0 wegen Host-Appdata-Permissions (dokumentiert); Datasource wird provisioniert" - - influxdb3-core: - description: Zeitreihen- / Metrikdaten fuer Grafana und Home Assistant - tier: 3 - category: ops - container_name: influxdb3-core - dependencies: [] + - monitoring-grafana url: null dump_file: null data_paths: diff --git a/ops/loki/README.md b/ops/loki/README.md deleted file mode 100644 index 8758272..0000000 --- a/ops/loki/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Loki / Alloy - -Status: abgeloester Altstand. Der zentrale Zielzustand ist `monitoring/` mit `monitoring-loki` und `monitoring-promtail`. - -Internal logging stack for KalliLab CORE. - -## Services - -- `loki`: internal log store on `backend_net`, no Traefik route, `auth_enabled: false` because access is limited to internal Docker networking. -- `alloy`: Docker log collector. It mounts `/var/run/docker.sock:ro` as a documented observability exception and forwards Docker container logs to Loki. - -## Migration note - -Do not run this stack in parallel with `monitoring/` unless you are deliberately comparing collectors during migration. After `monitoring-loki` and `monitoring-promtail` are live and Grafana can query logs, stop this Komodo stack and keep the files only as rollback reference. - -## Host sync - -Before first deploy, sync the checked-in config files to appdata: - -```bash -mkdir -p /mnt/user/appdata/loki/config /mnt/user/appdata/loki/data -mkdir -p /mnt/user/appdata/alloy/config /mnt/user/appdata/alloy/data -cp /mnt/user/services/homelab-infra/ops/loki/config/loki-config.yml /mnt/user/appdata/loki/config/loki-config.yml -cp /mnt/user/services/homelab-infra/ops/loki/config/config.alloy /mnt/user/appdata/alloy/config/config.alloy -chown -R 10001:10001 /mnt/user/appdata/loki/data -chmod 644 /mnt/user/appdata/loki/config/loki-config.yml /mnt/user/appdata/alloy/config/config.alloy -``` - -## Restore posture - -Loki data is transient operational telemetry. Docker raw logs remain the first fallback, Loki chunks on disk are a convenience cache, and ntfy critical events provide the external first-crash marker. diff --git a/ops/loki/config/config.alloy b/ops/loki/config/config.alloy deleted file mode 100644 index e38c7fd..0000000 --- a/ops/loki/config/config.alloy +++ /dev/null @@ -1,43 +0,0 @@ -discovery.docker "containers" { - host = "unix:///var/run/docker.sock" -} - -discovery.relabel "docker_logs" { - targets = [] - - rule { - source_labels = ["__meta_docker_container_name"] - regex = "/(.*)" - target_label = "container_name" - } - - rule { - source_labels = ["__meta_docker_container_label_com_docker_compose_project"] - target_label = "compose_project" - } - - rule { - source_labels = ["__meta_docker_container_label_com_docker_compose_service"] - target_label = "compose_service" - } -} - -loki.source.docker "containers" { - host = "unix:///var/run/docker.sock" - targets = discovery.docker.containers.targets - labels = { platform = "docker", host = "kallilabcore" } - relabel_rules = discovery.relabel.docker_logs.rules - forward_to = [loki.process.docker.receiver] -} - -loki.process "docker" { - forward_to = [loki.write.local.receiver] - - stage.docker {} -} - -loki.write "local" { - endpoint { - url = "http://loki:3100/loki/api/v1/push" - } -} diff --git a/ops/loki/config/loki-config.yml b/ops/loki/config/loki-config.yml deleted file mode 100644 index d8c03bf..0000000 --- a/ops/loki/config/loki-config.yml +++ /dev/null @@ -1,47 +0,0 @@ -auth_enabled: false - -server: - http_listen_port: 3100 - grpc_listen_port: 9096 - -common: - instance_addr: 127.0.0.1 - path_prefix: /loki - storage: - filesystem: - chunks_directory: /loki/chunks - rules_directory: /loki/rules - replication_factor: 1 - ring: - kvstore: - store: inmemory - -query_range: - results_cache: - cache: - embedded_cache: - enabled: true - max_size_mb: 100 - -schema_config: - configs: - - from: 2026-05-16 - store: tsdb - object_store: filesystem - schema: v13 - index: - prefix: index_ - period: 24h - -limits_config: - retention_period: 720h - allow_structured_metadata: true - ingestion_rate_mb: 16 - ingestion_burst_size_mb: 32 - -compactor: - working_directory: /loki/compactor - compaction_interval: 10m - retention_enabled: true - retention_delete_delay: 2h - delete_request_store: filesystem diff --git a/ops/loki/docker-compose.yml b/ops/loki/docker-compose.yml deleted file mode 100644 index f5ddbe5..0000000 --- a/ops/loki/docker-compose.yml +++ /dev/null @@ -1,36 +0,0 @@ -services: - loki: - image: grafana/loki:3.7.2@sha256:191d4fdfb7264f16989f0a57f320872620a5a7c2ceeec6229212c4190ec49b86 - container_name: loki - restart: unless-stopped - command: - - -config.file=/etc/loki/loki-config.yml - volumes: - - /mnt/user/appdata/loki/config:/etc/loki:ro - - /mnt/user/appdata/loki/data:/loki - networks: - - backend_net - security_opt: - - no-new-privileges:true - alloy: - image: grafana/alloy:v1.16.1@sha256:51aeb9d829239345070619dad3edd6873186f913c84f45b365b74574fcb38ec0 - container_name: alloy - restart: unless-stopped - command: - - run - - /etc/alloy/config.alloy - - --storage.path=/var/lib/alloy/data - volumes: - - /mnt/user/appdata/alloy/config:/etc/alloy:ro - - /mnt/user/appdata/alloy/data:/var/lib/alloy/data - - /var/run/docker.sock:/var/run/docker.sock:ro - networks: - - backend_net - security_opt: - - no-new-privileges:true - depends_on: - - loki - -networks: - backend_net: - external: true diff --git a/ops/policy-checks/exceptions.json b/ops/policy-checks/exceptions.json index 02e54f3..c0b0da0 100644 --- a/ops/policy-checks/exceptions.json +++ b/ops/policy-checks/exceptions.json @@ -21,9 +21,6 @@ "gitea": [ "222:22" ], - "influxdb3-core": [ - "${INFLUXDB_BIND_IP:-127.0.0.1}:8181:8181" - ], "monitoring-influxdb3-core": [ "${INFLUXDB_BIND_IP:-127.0.0.1}:8181:8181" ], @@ -33,8 +30,6 @@ ] }, "allowed_root_identities": [ - "grafana", - "influxdb3-core", "monitoring-influxdb3-core" ], "allowed_privileged_identities": [ diff --git a/ops/policy-checks/last-report.md b/ops/policy-checks/last-report.md index 6b14ce4..050213d 100644 --- a/ops/policy-checks/last-report.md +++ b/ops/policy-checks/last-report.md @@ -1,10 +1,10 @@ # Policy Check Report ## Summary -- Compose files checked: 31 +- Compose files checked: 29 - Critical findings: 0 -- Warnings: 7 -- Info findings: 10 +- Warnings: 5 +- Info findings: 9 ## Critical - none @@ -14,8 +14,6 @@ - [IMAGE001] infra\ddns-updater\docker-compose.yml :: ddns-updater: Image uses a latest tag. Prefer a concrete version tag, even when a digest is present. - [USER001] monitoring\docker-compose.yml :: influxdb3-core: Runs as user 0. Documented exception, keep visible for hardening. - [IMAGE001] ops\glances\docker-compose.yml :: glances: Image uses a latest tag. Prefer a concrete version tag, even when a digest is present. -- [USER001] ops\grafana-influxdb\docker-compose.yml :: grafana: Runs as user 0. Documented exception, keep visible for hardening. -- [USER001] ops\grafana-influxdb\docker-compose.yml :: influxdb3-core: Runs as user 0. Documented exception, keep visible for hardening. - [IMAGE001] ops\scrutiny\docker-compose.yml :: scrutiny: Image uses a latest tag. Prefer a concrete version tag, even when a digest is present. ## Info @@ -25,7 +23,6 @@ - [PORT001] host-services\Adguard\docker-compose.yml :: adguard: Allowed host port mapping: 100.80.98.33:8082:80 - [HOSTNET001] host-services\tailscale\docker-compose.yml :: tailscale: network_mode: host is a documented exception. - [PORT001] monitoring\docker-compose.yml :: influxdb3-core: Allowed host port mapping: ${INFLUXDB_BIND_IP:-127.0.0.1}:8181:8181 -- [PORT001] ops\grafana-influxdb\docker-compose.yml :: influxdb3-core: Allowed host port mapping: ${INFLUXDB_BIND_IP:-127.0.0.1}:8181:8181 - [PRIV001] ops\scrutiny\docker-compose.yml :: scrutiny: Privileged mode is a documented exception. - [PORT001] traefik\docker-compose.yml :: traefik: Allowed host port mapping: 80:80 - [PORT001] traefik\docker-compose.yml :: traefik: Allowed host port mapping: 443:443