diff --git a/HOMELAB_ARCHITECTURE_MASTER_V2.md b/HOMELAB_ARCHITECTURE_MASTER_V2.md index e9d81ad..e1a8363 100644 --- a/HOMELAB_ARCHITECTURE_MASTER_V2.md +++ b/HOMELAB_ARCHITECTURE_MASTER_V2.md @@ -247,7 +247,7 @@ Legende Status: | Container | Status | Soll-Netz(e) | Finaler Zugang | Finaler Sollzustand | Offene Punkte | |---|---|---|---|---|---| | `vaultwarden` | ✅ | `frontend_net` | Traefik | kein Host-Port, `ADMIN_TOKEN_FILE` | — | -| `authelia` | ✅ | `frontend_net`, `backend_net` | Traefik via `auth.kaleschke.info` | aktiver ForwardAuth-Provider, Secrets via `_FILE`, PostgreSQL + Redis Shared | — | +| `authelia` | ✅ | `frontend_net`, `backend_net` | Traefik via `auth.kaleschke.info` | aktiver ForwardAuth-Provider, Secrets via `_FILE`, PostgreSQL Storage; bewusst ohne Redis-Session-Backend | — | ### 7.3 Datenbanken / Caches @@ -538,6 +538,11 @@ Mutable Tags wie `latest`, `stable`, `release` oder reine Major-Tags wurden auf - Fuer dieses Port-Publishing nutzt `influxdb3-core` zusaetzlich zum internen Grafana-Netz `grafana_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. +### Authelia ohne Redis-Session-Backend (2026-05-04) +- Authelia nutzt PostgreSQL fuer persistente Storage-Daten, aber bewusst kein Redis-Session-Backend. +- Das haelt den Tier-1-Auth-Pfad einfacher; nach einem Authelia-Restart muessen aktive Sessions neu aufgebaut werden. +- `infra/redis` bleibt shared Cache fuer Dienste wie Paperless, ist aber keine Authelia-Abhaengigkeit. + ### ddns-updater — Netz-Ausnahme Bleibt bewusst in `frontend_net` statt `backend_net`, weil `backend_net` `internal: true` ist und ddns-updater die Cloudflare-API erreichen muss. diff --git a/docs/AI_CONTEXT.md b/docs/AI_CONTEXT.md index 19351db..b190fd9 100644 --- a/docs/AI_CONTEXT.md +++ b/docs/AI_CONTEXT.md @@ -131,7 +131,7 @@ Dump-Skript: Disaster Recovery folgt einer Bootstrap-Reihenfolge: 1. Traefik, AdGuard, Tailscale -2. PostgreSQL, Redis, Authelia, Gitea +2. PostgreSQL, Authelia, Redis, Gitea 3. Komodo 4. kritische Apps 5. restliche Apps/Ops @@ -152,6 +152,7 @@ KI-Agenten sollen konservativ arbeiten: keine indirekten Live-Aenderungen, keine - Traefik dynamic config muss manuell auf den Host synchronisiert werden; Komodo deployed diese Dateien nicht automatisch. - `backend_net` und app-interne Netze muessen bei Runtime-Problemen live geprueft werden, weil Compose-Projektpraefixe Netznamen veraendern koennen. - Authelia Template und Compose-Middlewares koennen auseinanderlaufen; bei Auth-Aenderungen beide Seiten pruefen. +- Authelia nutzt PostgreSQL, aber bewusst kein Redis-Session-Backend; Redis ist kein Authelia-Bootstrap-Blocker. - `paperless-ngx` nutzt fuer DB/Redis bewusst Stack ENV statt `_FILE`. - `homepage`, `glances` und `komodo-periphery` nutzen Docker-Socket-Mounts; Zugriff bewusst behandeln. - `backrest`, `borg-ui` und `filebrowser` haben breite Mounts; bei Hardening nicht ad hoc, sondern gezielt vorgehen. diff --git a/docs/DISASTER_RECOVERY.md b/docs/DISASTER_RECOVERY.md index fd4693d..4bcc8e8 100644 --- a/docs/DISASTER_RECOVERY.md +++ b/docs/DISASTER_RECOVERY.md @@ -223,14 +223,15 @@ Ziel: ### Stufe 2 - Gemeinsame Backends und Identity 4. `infra/postgresql17/` -5. `infra/redis/` -6. `security/authelia/` +5. `security/authelia/` +6. `infra/redis/` 7. `core/gitea/` Ziel: -- gemeinsame DB / Redis verfuegbar -- zentrale Auth laeuft +- gemeinsame DB verfuegbar +- zentrale Auth laeuft; Authelia nutzt bewusst kein Redis-Session-Backend +- Redis als shared Cache fuer abhaengige Apps verfuegbar - Git-Zugriff wiederhergestellt ### Stufe 3 - Deploy-System diff --git a/docs/HOME_ASSISTANT_INFLUXDB_ECOWITT.md b/docs/HOME_ASSISTANT_INFLUXDB_ECOWITT.md index 3770bca..a43deaf 100644 --- a/docs/HOME_ASSISTANT_INFLUXDB_ECOWITT.md +++ b/docs/HOME_ASSISTANT_INFLUXDB_ECOWITT.md @@ -2,6 +2,15 @@ Ziel: Home Assistant schreibt ausgewaehlte Ecowitt- und Energiesensoren nach InfluxDB 3 Core. Grafana bleibt das Langzeit-Dashboard, Home Assistant bleibt die Automationszentrale. +## Live-Stand 2026-05-04 + +- Home Assistant ist per SSH unter `192.168.178.50:22222` erreichbar. +- `ha core check` ist erfolgreich. +- InfluxDB 3 Core ist von Home Assistant aus unter `http://192.168.178.58:8181/` erreichbar; `401 Unauthorized` ohne Token ist der erwartete Reachability-Test. +- In `/homeassistant/configuration.yaml` ist noch kein `influxdb:`-Block aktiv. +- In `/homeassistant/secrets.yaml` ist noch kein `influxdb3_homeassistant_token` eingetragen. +- In der Home-Assistant-Entity-Registry ist noch keine Ecowitt-Integration sichtbar; aktuell existiert nur `weather.forecast_home`. + ## 1. InfluxDB fuer Home Assistant erreichbar machen Der Stack haelt InfluxDB bewusst ohne Traefik-Route. Fuer Home Assistant wird nur der HTTP-Port `8181` auf einer internen LAN-Adresse veroeffentlicht. @@ -9,29 +18,46 @@ Der Stack haelt InfluxDB bewusst ohne Traefik-Route. Fuer Home Assistant wird nu In Komodo/Stack-Environment fuer `ops/grafana-influxdb` setzen: ```env -INFLUXDB_BIND_IP=192.168.178.X +INFLUXDB_BIND_IP=192.168.178.58 ``` -`192.168.178.X` ist die LAN-IP des Docker-Hosts, auf dem `influxdb3-core` laeuft. Nicht `0.0.0.0` verwenden, wenn es nicht notwendig ist. +`192.168.178.58` ist die LAN-IP des Docker-Hosts, auf dem `influxdb3-core` laeuft. Nicht `0.0.0.0` verwenden, wenn es nicht notwendig ist. Danach den Stack neu deployen und von Home Assistant aus pruefen: ```bash -curl -I http://192.168.178.X:8181/health +curl -i --max-time 5 http://192.168.178.58:8181/ ``` +Erwartetes Ergebnis ohne Token: `401 Unauthorized`. Das bestaetigt, dass der LAN-Port erreichbar ist und Authentifizierung aktiv bleibt. + ## 2. Token fuer Home Assistant -Am besten einen eigenen Write-Token fuer Home Assistant verwenden. Fuer den ersten Test kann der bestehende Admin-Token funktionieren; langfristig sollte der HA-Token nur in die Datenbank `homelab` schreiben duerfen. +InfluxDB 3 Core unterstuetzt aktuell Admin- und Named-Admin-Tokens. Einen eigenen Named-Admin-Token fuer Home Assistant verwenden, damit der Token getrennt vom initialen Operator-/Admin-Token rotiert werden kann. Den Token in Home Assistant eintragen: ```yaml # /homeassistant/secrets.yaml -influxdb3_homeassistant_token: "apiv3_REPLACE_WITH_WRITE_TOKEN" +influxdb3_homeassistant_token: "apiv3_REPLACE_WITH_HOME_ASSISTANT_TOKEN" ``` -## 3. Home Assistant konfigurieren +Token niemals ins Git-Repository schreiben. + +## 3. Ecowitt in Home Assistant anbinden + +Die offizielle Ecowitt-Integration ist eine lokale Push-Integration. Home Assistant erzeugt einen HTTP-Webhook; die Wetterstation sendet danach ihre Daten aktiv an Home Assistant. + +1. In Home Assistant `Einstellungen -> Geraete & Dienste -> Integration hinzufuegen -> Ecowitt` oeffnen. +2. Die angezeigten Werte fuer Server/IP, Pfad und Port notieren. +3. Im Ecowitt-Gateway entweder per App oder Web-UI unter `Weather Services -> Customized` eintragen: + - Customized: `Enable` + - Protocol Type Same As: `Ecowitt` + - Server/IP, Path und Port exakt wie in Home Assistant angezeigt +4. Wichtig: Ecowitt kann kein HTTPS. Den lokalen HTTP-Endpunkt von Home Assistant verwenden, nicht eine reine HTTPS-/Traefik-URL. +5. Nach dem ersten Push pruefen, ob neue `sensor.*`- und ggf. `binary_sensor.*`-Entities in Home Assistant auftauchen. + +## 4. Home Assistant fuer InfluxDB konfigurieren Minimaler Startblock fuer `/homeassistant/configuration.yaml`: @@ -39,7 +65,7 @@ Minimaler Startblock fuer `/homeassistant/configuration.yaml`: influxdb: api_version: 2 ssl: false - host: 192.168.178.X + host: 192.168.178.58 port: 8181 token: !secret influxdb3_homeassistant_token organization: homelab @@ -60,7 +86,7 @@ influxdb: - sensor.wallbox_energie_heute ``` -Die `sensor.*gw*`-Regel ist nur ein Startpunkt, weil Ecowitt-Gateways haeufig `gw...` im Entity-Namen haben. Nach dem ersten Export in Grafana pruefen und die Liste enger machen. +Die `sensor.*ecowitt*`- und `sensor.*gw*`-Regeln sind nur Startpunkte. Nach dem ersten Ecowitt-Push die echten Entity-IDs aus Home Assistant auslesen und die Liste enger machen. Nach dem Edit: @@ -69,7 +95,7 @@ ha core check ha core restart ``` -## 4. Grafana Smoke-Test +## 5. Grafana Smoke-Test In Grafana mit der bestehenden Datenquelle `InfluxDB 3 Core` eine SQL-Abfrage testen: @@ -88,7 +114,7 @@ ORDER BY time DESC LIMIT 20 ``` -## 5. Dashboard-Kandidaten +## 6. Dashboard-Kandidaten Sinnvolle Panels fuer das erste Wetter-Dashboard: @@ -101,7 +127,7 @@ Sinnvolle Panels fuer das erste Wetter-Dashboard: - PV-Ueberschuss vs. Wetter - Wallbox-Leistung vs. PV-Ueberschuss -## 6. Erste Automationen +## 7. Erste Automationen Home Assistant bleibt fuer Reaktionen zustaendig: diff --git a/docs/REPO_MAP.md b/docs/REPO_MAP.md index f30773b..57cb4a7 100644 --- a/docs/REPO_MAP.md +++ b/docs/REPO_MAP.md @@ -74,7 +74,7 @@ Secret-Werte werden hier nicht dokumentiert. Aufgefuehrt werden nur Variablennam | Stack | Compose | Services / Images | Traefik Hosts | Networks | Ports | Abhaengigkeiten | |---|---|---|---|---|---|---| | Gitea | `core/gitea/docker-compose.yml` | `gitea` -> `docker.gitea.com/gitea:1.25.4` | `git.kaleschke.info` | `frontend_net` | `222:22/tcp` | SQLite in `/data`; SSH-Port ist dokumentierte Ausnahme | -| Authelia | `security/authelia/docker-compose.yml` | `authelia` -> `authelia/authelia:latest@sha256:...` | `auth.kaleschke.info` | `frontend_net`, `backend_net` | keine | PostgreSQL 17, Redis, Traefik ForwardAuth | +| Authelia | `security/authelia/docker-compose.yml` | `authelia` -> `authelia/authelia:latest@sha256:...` | `auth.kaleschke.info` | `frontend_net`, `backend_net` | keine | PostgreSQL 17 Storage, Traefik ForwardAuth; bewusst ohne Redis-Session-Backend | | Vaultwarden | `security/vaultwarden/docker-compose.yml` | `vaultwarden` -> `vaultwarden/server:latest@sha256:...` | `vault.kaleschke.info` | `frontend_net` | keine | Datei-Persistenz, `ADMIN_TOKEN_FILE` | | ddns-updater | `infra/ddns-updater/docker-compose.yml` | `ddns-updater` -> `ghcr.io/qdm12/ddns-updater:latest@sha256:...` | keine | `frontend_net` | keine | Cloudflare/API-Internetbedarf | | PostgreSQL 17 | `infra/postgresql17/docker-compose.yml` | `postgresql17` -> `postgres:17` | keine | `backend_net` | keine | shared DB-Cluster | diff --git a/docs/RESTORE_MATRIX.md b/docs/RESTORE_MATRIX.md index e060164..19aeaff 100644 --- a/docs/RESTORE_MATRIX.md +++ b/docs/RESTORE_MATRIX.md @@ -31,7 +31,7 @@ Sie ist die fachliche Ergaenzung zu `docs/DISASTER_RECOVERY.md`. | Tailscale | Share / Borg | `/mnt/user/appdata/tailscale` | keine | Tailscale-State im Pfad | Host-Netz | Tailscale verbunden | | PostgreSQL 17 | Share + Dumps | `/mnt/user/appdata/postgresql17` | `postgresql17-globals.sql`, `postgresql17-mailarchiver.dump`, `postgresql17-paperless.dump`, optional `postgresql17-authelia.dump` | `postgres_password.txt` | `backend_net` | DB startet, Ziel-Datenbanken vorhanden | | Redis | Share / Host | `/mnt/user/appdata/redis` | keine | `redis_password.txt` | `backend_net` | Redis startet, Apps verbinden sich | -| Authelia | Borg | `/mnt/user/appdata/authelia/config`, `/mnt/user/appdata/secrets/*authelia*` | Shared PostgreSQL, optional Dump `postgresql17-authelia.dump` | JWT/Session/Storage/Postgres-Secret-Dateien | PostgreSQL 17, Redis, Traefik | Login-Seite und ForwardAuth funktionieren | +| Authelia | Borg | `/mnt/user/appdata/authelia/config`, `/mnt/user/appdata/secrets/*authelia*` | Shared PostgreSQL, optional Dump `postgresql17-authelia.dump` | JWT/Session/Storage/Postgres-Secret-Dateien | PostgreSQL 17, Traefik | Login-Seite und ForwardAuth funktionieren; aktive Sessions werden nach Restart neu aufgebaut | | Gitea | Borg / Share | `/mnt/user/services/gitea/data` | SQLite in `/data` | keine separaten Secret-Dateien dokumentiert | Traefik | Web-UI erreichbar, Repo sichtbar, SSH-Port reagiert | | Komodo | Borg / Share | `/mnt/user/appdata/komodo/core`, `/mnt/user/appdata/komodo/periphery` | `komodo-mongo.archive.gz` falls verifiziert | `komodo_mongo_password.txt`, `KOMODO_*` Stack ENV | Traefik, Mongo, Gitea | UI erreichbar, Periphery verbunden | | Vaultwarden | Borg / Share | `/mnt/user/appdata/vaultwarden` | dateibasiert | `vaultwarden_admin_token.txt` | Traefik | Login-Seite erreichbar, Tresor-Daten sichtbar | diff --git a/docs/SECRETS_MAP.md b/docs/SECRETS_MAP.md index aa5d4d0..c85f36d 100644 --- a/docs/SECRETS_MAP.md +++ b/docs/SECRETS_MAP.md @@ -46,6 +46,7 @@ Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einb | Grafana | Admin Password | `/mnt/user/appdata/secrets/grafana_admin_password.txt` -> `GF_SECURITY_ADMIN_PASSWORD__FILE` | vorbereitet | | InfluxDB 3 Core | Admin Token JSON | `/mnt/user/appdata/secrets/influxdb3_admin_token.json` -> Docker Secret `/run/secrets/influxdb3_admin_token` | vorbereitet | | Grafana -> InfluxDB | Datasource Token | `/mnt/user/appdata/secrets/grafana_influxdb_token.txt` -> Docker Secret `/run/secrets/grafana_influxdb_token` | vorbereitet | +| Home Assistant -> InfluxDB | HA InfluxDB Token | `/homeassistant/secrets.yaml` -> `influxdb3_homeassistant_token` | geplant | --- diff --git a/docs/SERVICE_CATALOG.md b/docs/SERVICE_CATALOG.md index 6533b7d..b78c012 100644 --- a/docs/SERVICE_CATALOG.md +++ b/docs/SERVICE_CATALOG.md @@ -20,7 +20,7 @@ Secret-Werte sind nicht enthalten. Es werden nur Secret-Namen, Env-Key-Namen und | Service | Zweck | Autoritativer Pfad | URL / Zugang | Abhaengigkeiten | Datenpfade | Backup / Restore | Traefik | Besonderheiten / TODOs | |---|---|---|---|---|---|---|---|---| -| `authelia` | ForwardAuth / zentrale Auth fuer Admin-UIs | `security/authelia/docker-compose.yml`, `security/authelia/configuration.yml` | `https://auth.kaleschke.info` | PostgreSQL 17, Redis, Traefik | `/mnt/user/appdata/authelia/config`, Authelia Secret-Dateien | Tier 1, config + DB + secrets | ja | Template im Repo, Host-Datei pruefen; Access-Control und Compose-Middleware bei Aenderungen abgleichen | +| `authelia` | ForwardAuth / zentrale Auth fuer Admin-UIs | `security/authelia/docker-compose.yml`, `security/authelia/configuration.yml` | `https://auth.kaleschke.info` | PostgreSQL 17, Traefik | `/mnt/user/appdata/authelia/config`, Authelia Secret-Dateien | Tier 1, config + DB + secrets | ja | Bewusst ohne Redis-Session-Backend; Template im Repo, Host-Datei pruefen; Access-Control und Compose-Middleware bei Aenderungen abgleichen | | `vaultwarden` | Passwort-Tresor | `security/vaultwarden/docker-compose.yml` | `https://vault.kaleschke.info` | Traefik, `frontend_net` | `/mnt/user/appdata/vaultwarden` | Tier 1 | ja | `ADMIN_TOKEN_FILE`; keine direkten Ports | ## Shared Infrastructure diff --git a/ops/grafana-influxdb/README.md b/ops/grafana-influxdb/README.md index c3c5bcc..e4f0946 100644 --- a/ops/grafana-influxdb/README.md +++ b/ops/grafana-influxdb/README.md @@ -33,7 +33,7 @@ Monitoring-Stack fuer Grafana + InfluxDB 3 Core. InfluxDB bleibt ohne Public Rou Pfad: `/mnt/user/appdata/secrets/influxdb3_admin_token.json`, Rechte `600`. -3. Grafana-Datasource-Token anlegen. Fuer den ersten Start kann der Token aus `influxdb3_admin_token.json` verwendet werden; sobald ein eingeschraenkter Read-Token existiert, diesen hier eintragen: +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