Files
homelab-infra/docs/GITOPS_DRIFT_RUNBOOK.md

128 lines
3.9 KiB
Markdown

# GitOps Drift Runbook
Dieses Runbook ist fuer Faelle, in denen Gitea, lokaler Clone, Komodo Workspace und Docker Runtime nicht sichtbar denselben Stand haben.
## Ziel
Vor jeder Reparatur muss klar sein, welche Ebene vom Sollzustand abweicht:
1. Lokaler Clone
2. Gitea `origin/master`
3. Komodo Stack Workspace auf dem Host
4. Laufender Docker-Container
5. Host-Netzwerklistener
Nicht mehrere Ebenen gleichzeitig reparieren. Erst messen, dann genau eine Abweichung beheben.
## Pflichtmatrix
### 1. Lokaler Clone
```bash
git status -sb
git rev-parse HEAD
git rev-parse origin/master
git ls-remote https://git.kaleschke.info/Micha/homelab-infra.git refs/heads/master
```
Alle Hashes muessen gleich sein, bevor Komodo oder Runtime bewertet werden.
### 2. Komodo Workspace
Auf dem Unraid-Host im Stack-Workspace:
```bash
cd /mnt/user/services/stacks/<stack-name>
git rev-parse --short HEAD
git status -sb
```
Bei Drift:
```bash
git fetch --all --prune
git reset --hard origin/master
```
Erst danach deployen.
### 3. Docker Runtime
```bash
docker inspect <container> --format '{{.Created}}'
docker inspect <container> --format '{{json .NetworkSettings.Networks}}'
docker inspect <container> --format '{{json .NetworkSettings.Ports}}'
docker inspect <container> --format '{{json .HostConfig.PortBindings}}'
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep <container-or-service>
```
Wichtig: `HostConfig.PortBindings` ist nur die Container-Spezifikation. Entscheidend fuer einen aktiven Host-Port sind `NetworkSettings.Ports`, `docker ps` und ein echter Listener.
### 4. Host-Port / Listener
```bash
ss -ltnp | grep <port>
curl -i --max-time 5 http://<host-ip>:<port>/
```
Ein `401 Unauthorized` ist bei geschuetzten APIs oft ein Erfolg: Dienst ist erreichbar, Auth fehlt nur beim Testrequest.
## Komodo/Periphery Checks
Wenn Komodo Stacks nicht aus Gitea deployen kann:
```bash
docker inspect komodo-periphery --format '{{range .Mounts}}{{println .Source "->" .Destination}}{{end}}'
docker inspect komodo-periphery --format '{{range $k,$v := .NetworkSettings.Networks}}{{println $k}}{{end}}'
docker exec komodo-periphery sh -lc 'getent hosts git.kaleschke.info'
docker exec komodo-periphery sh -lc 'wget -S -O- -T 5 --no-check-certificate https://git.kaleschke.info 2>&1 | head -40'
```
Sollzustand:
- `/mnt/user/services -> /mnt/user/services` ist gemountet.
- `komodo_net` und `frontend_net` sind verbunden.
- `git.kaleschke.info` loest auf `192.168.178.58` auf.
- HTTPS zu Gitea antwortet.
## InfluxDB LAN-Port Beispiel
Soll fuer Home Assistant:
```bash
cd /mnt/user/services/stacks/monitoring
git fetch --all --prune
git reset --hard origin/master
docker compose --env-file .env -p monitoring -f monitoring/docker-compose.yml up -d --force-recreate --no-deps influxdb3-core
```
Danach pruefen:
```bash
docker network ls | grep -E "monitoring|influx"
docker inspect monitoring-influxdb3-core --format '{{json .NetworkSettings.Networks}}'
docker inspect monitoring-influxdb3-core --format '{{json .NetworkSettings.Ports}}'
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep influx
ss -ltnp | grep 8181
curl -i --max-time 5 http://192.168.178.58:8181/
```
Erwartung:
- Komodo Workspace `HEAD` entspricht `origin/master`.
- `monitoring-influxdb3-core` haengt an `monitoring_monitoring_net` und `monitoring_monitoring_influx_lan`.
- Docker zeigt `192.168.178.58:8181->8181/tcp`.
- `ss` zeigt `docker-proxy` auf `192.168.178.58:8181`.
- `curl` bekommt `401 Unauthorized` von InfluxDB.
Hinweis: Im Compose-File heissen die Netze `monitoring_net` und `monitoring_influx_lan`. Durch den Compose-Projektnamen `monitoring` koennen daraus zur Laufzeit Docker-Netze mit Projektpraefix werden.
## Stop-Regel
Wenn zwei Reparaturversuche nicht zum erwarteten Ergebnis fuehren:
1. Keine weiteren Schreibbefehle.
2. Pflichtmatrix ausfuellen.
3. Genau eine abweichende Ebene benennen.
4. Erst danach einen neuen Fix ausfuehren.