Files
bf-infra/docs/vlan1-rueckbau-howto-manuelle-schritte.md

204 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# VLAN1-Rückbau — Howto für die manuellen Schritte
> Stand 2026-08-15. Gegenstück zum Plan „VLAN1-Rückbau: `.41.211` (Core), `.41.100` (pve),
> Prometheus-Ziele". Hier steht **nur, was du selbst machen musst** — was ich übernehmen kann,
> steht unten unter „Was ich mache".
---
## Die eine Regel, die die Reihenfolge bestimmt
`10.40.41.100` ist derzeit der **einzige lebende VLAN1-Host**, und Home Assistant erreicht pve
heute genau darüber. Dieser Pfad existiert nur, weil der Core noch die Adresse `10.40.41.211`
trägt und damit die Route zu `10.40.41.0/24` stellt.
➡️ **Schritt 1 und 2 müssen fertig sein, bevor irgendjemand `.41.100` oder `.41.211` entfernt.**
Sonst reißt die laufende pve-Anbindung ab.
---
## Schritt 1 — Home Assistant: pve-Integration auf `10.40.20.100`
**Wo:** HA-Weboberfläche → Einstellungen → Geräte & Dienste → **Proxmox VE** (Kachel heißt heute
`10.40.41.100`) → ⋮ → **Neu konfigurieren**. Host auf `10.40.20.100` ändern, Port `8006` bleibt.
**Warum du und nicht ich:** die Integration hat *keinen* Options-Flow (`supports_options: false`),
nur einen Reconfigure-Flow. Der fragt die Proxmox-Zugangsdaten erneut ab — und Passwörter oder
API-Token gebe ich grundsätzlich nicht ein. Das ist der Teil, der bei dir bleiben muss.
**Das Netz ist nachweislich nicht das Problem** (falls es wieder hakt, such nicht dort):
- `pveproxy` lauscht auf `*:8006`, `pve-firewall` ist *disabled*, keine iptables-Regel,
kein `/etc/default/pveproxy`.
- `https://10.40.20.100:8006` antwortet aus VLAN10 **und** VLAN20 mit HTTP 200 in ~0,06 s.
- HA selbst redet längst problemlos mit VLAN20 und VLAN99: `mqtt` → `10.40.20.108`,
`influxdb` → `10.40.20.8`, alle vier `mikrotik`-Integrationen auf `.99.x` sind `loaded`.
---
## Schritt 2 — Portainer hängt: `docker system df` auf der NAS ⏳ OFFEN, deine Entscheidung
> ⚠️ **Korrektur (2026-08-15):** meine erste Erklärung — die tote Umgebung `odroid-m1` — war
> **falsch**. Du hast sie entfernt, die Integration hängt weiter. Alle verbliebenen Endpoints
> antworten in 0,01–0,16 s. Die Vermutung ist damit widerlegt, nicht nur unbestätigt.
**Die tatsächliche Ursache, aus dem HA-Debug-Log:**
```
pyportainer.exceptions.PortainerTimeoutError: Timeout error while accessing
GET https://10.40.20.126:9443/api/endpoints/14/docker/system/df
-> UpdateFailed -> ConfigEntryNotReady -> setup_retry
```
Die HA-Integration ruft beim Setup `docker system df` für **jede** Umgebung auf. Gemessen:
| Endpoint | `docker system df` |
|---|---|
| ep2 `pve` | 0,05 s |
| **ep14 `nas-bf`** | 🔴 **kam nach 180 s nicht zurück** |
| ep20 `macmini` | 0,33 s |
| ep21 `nas-fm` | 0,98 s |
Direkt auf der NAS gemessen (`sudo /usr/local/bin/docker system df`): der Befehl **gibt die Tabelle
aus und beendet sich dann nicht** — Exit-Code 124 nach 120 s, obwohl die Daten längst da waren.
Die Mengen sind harmlos (25 Images / 13 GB, 21 Container, 10 Volumes / 79 MB), es ist also **kein
Größenproblem**, sondern ein hängender Aufruf im dockerd der Synology. Das Container-Listing auf
demselben Endpoint dauert 0,16 s — nur `system df` klemmt.
### Container-Manager-Neustart durchgeführt (2026-08-15) — hat den Hänger behoben, reicht aber nicht
`synopkg stop/start ContainerManager` (Binary liegt unter `/usr/syno/bin/synopkg`, **nicht** im
sudo-PATH). Ergebnis:
- ✅ **Alle 14 Container aus der Baseline sind zurück**, keiner fehlt. Zusätzlich kam `hms-mqtt`
hoch, der vorher nicht lief (Restart-Policy) — **prüfen, ob der bleiben soll**.
- ✅ `docker system df` **beendet sich wieder** (vorher: gab die Tabelle aus und hing dann; rc=124).
- ❌ **Aber es ist weiterhin viel zu langsam und schwankt stark:** 33 s → 92 s → 3× über 120 s.
`pyportainer` gibt lange vorher auf, die Integration bleibt auf `setup_retry`.
**Wo die Zeit hingeht — gemessen, nicht vermutet:**
| Aufruf | Dauer |
|---|---|
| `docker images -q` | 84 ms |
| `docker ps -aq` | 95 ms |
| `docker volume ls -q` | 65 ms |
| **`docker system df`** | **33–92+ s** |
Das Auflisten ist trivial schnell; die Zeit geht **vollständig in die Größenberechnung**, also das
`du`-artige Durchlaufen der overlay2-/Volume-Verzeichnisse auf den NAS-Platten. Das ist ein
struktureller Nachteil dieser Plattform, kein Defekt — und die HA-Integration ruft `system df`
für **jede** Umgebung bei **jedem** Update auf.
### Der aussichtsreichste Weg: eigener Portainer-Benutzer für HA
Portainer kann Umgebungszugriff pro Benutzer beschränken. Ein HA-eigener Benutzer mit Zugriff auf
**ep2, ep20, ep21 — aber nicht ep14** löst das Problem an der Wurzel: die Integration sieht die
langsame NAS-Umgebung dann gar nicht.
**Wo:** Portainer → Users → neuen Benutzer anlegen → Environments → Zugriff auf ep14 entziehen →
Access-Token erzeugen → in HA die Portainer-Integration mit diesem Token neu anlegen.
**Warum du und nicht ich:** Benutzer anlegen und Token erzeugen sind Konto- und Credential-Schritte,
die ich grundsätzlich nicht übernehme.
**Alternativen, ehrlich bewertet:**
- *Nichts tun* — die Integration bleibt auf `setup_retry`, stört sonst nichts. Völlig vertretbar.
- *Images aufräumen* (6,98 GB / 53 % sind reclaimable) — verkürzt den Durchlauf, aber
ob es unter das `pyportainer`-Limit kommt, ist **offen**. Ich würde nicht darauf setzen.
- *ep14 ganz aus Portainer nehmen* — kostet die NAS-Verwaltung, schlechter Tausch.
---
## Schritt 3 — ioBroker: NAS-Ziel korrigieren
**Wo:** ioBroker auf `10.40.20.107` (LXC 101 `iob-master`), in der betroffenen Adapter-Instanz.
`10.40.41.10:8080` → **`10.40.20.10:8080`** (die NAS unter ihrer aktuellen Adresse).
Das steckt in der Adapterkonfiguration, nicht in einer Datei, die ich von außen sicher ändern kann.
---
## Schritt 4 — Entscheidung: die 11 gestoppten VLAN1-LXCs
Auf pve stehen 11 **gestoppte** Container mit VLAN1-Adressen und `gw=10.40.41.254` — das ist ap1s
abgeschaltete Sekundär-IP, dieses Gateway existiert nicht mehr:
| LXC | Name | alte IP |
|---|---|---|
| 103 | minarca | `.41.114` |
| 104 | alpine-grafana | `.41.109` |
| 109 | node-red | `.41.119` |
| 115 | hms-mqtt-publisher | `.41.124` |
| 120 | adguard-bf1 | `.41.116` |
| 121 | adguard-bf2 | `.41.117` |
| 128 | nginx-proxy-manager | `.41.123` |
| 129 | caddy | `.41.118` |
| 130 | pihole1 | `.41.16` |
| 131 | pihole2 | `.41.131` |
| 201 | openproject | `.41.120` |
Solange sie stehen, stören sie nichts. **Wer einen davon startet, landet in einem VLAN ohne
Gateway.** Je Container zu entscheiden: löschen, oder auf VLAN20 umziehen (`tag=20` + Adresse +
`nameserver`). Nichts davon ist dringend — es soll nur nicht aus Versehen passieren.
Zusätzlich tragen mehrere *laufende* VLAN20-Gäste noch `nameserver: 10.40.41.254` in der
LXC-Config. Das greift erst beim nächsten Start neu, ist also eine stille Zeitbombe für später.
---
## Was ich gemacht habe ✅ (2026-08-15)
1. **pve `10.40.41.100` entfernt.** `/etc/network/interfaces`: Adresszeile raus,
`iface vmbr0 inet static` → `inet manual`; Bridge-Parameter unangetastet. Angewendet per
`ip addr del` **ohne** `ifreload -a`. Backup `/root/interfaces.bak-tp19-20260815-183045`.
Nachher: nur noch `vmbr0.20` trägt eine IP, keine `41.0/24`-Route, **alle 9 Gäste weiter
`running`**, `pvesm status` alle aktiv, SSH-Sitzung überlebt.
2. **Core `10.40.41.211` entfernt** über Nautobot GC (`routeros/tp19-core-vlan1-address-remove.rsc`),
Backup `core-pre-tp19-vlan1-addr-20260815.backup`. Nachher: keine Adresse auf `bridge`, keine
`.41`-Route, Mgmt über `.99.1` **und** `10.40.10.1` intakt.
**Compliance 17/17 grün** — der letzte offene Drift auf dem Core ist damit weg.
3. **Prometheus bereinigt.** Der pauschale `41`→`20`-Ersatz hatte 6 Jobs auf Adressen gesetzt,
die es nicht gibt. Ist-Zustand gemessen statt angenommen — **nur 2 Jobs liefern echte Metriken**:
| Job | Befund | Ergebnis |
|---|---|---|
| `grafana` `10.40.20.109:3000` | 200, echte Metriken | ✅ aktiv |
| `n8n` `10.40.20.167:5678` | 200, echte Metriken | ✅ aktiv |
| `gitea` | `.20.157:3000/` gibt 200, aber `/metrics` ist in Gitea **nicht aktiviert** | stillgelegt |
| `vaultwarden` | `/metrics` → **404**, exportiert nativ keine Prometheus-Metriken | stillgelegt |
| `portainer` | `/api/status` → 200, liefert aber **JSON statt Prometheus-Format** | stillgelegt |
| `node`, `alertmanager`, `qdrant` | Container auf der NAS **exited** | stillgelegt |
| `pihole` | abgewählt (TP23 = AdGuard); `.20.23` ist ein fremder Dienst | stillgelegt |
Alle acht **auskommentiert mit Begründung im File**, dazu der `alerting:`-Block (sonst bliebe ein
leerer alertmanagers-Eintrag stehen, der Schärfe vortäuscht). Backup
`prometheus.yml.bak-20260815`. Nach Reload: **3 aktive Ziele, alle `up`**.
🔴 **Falle für das nächste Mal — die Datei ist nicht mit dem Login-User schreibbar.**
`prometheus.yml` gehört `65534:65534`; das *Verzeichnis* gehört `adm.christoph`. Ein
`cat > datei` scheitert an „Permission denied", während ein `cp` daneben klappt — was leicht den
Eindruck erweckt, der Schreibvorgang sei durchgegangen. **Schreiben nur per `sudo tee`, und
danach per `md5sum` gegen die lokale Fassung prüfen**, nicht der Erfolgsmeldung der Shell trauen.
---
## Abnahme
- pve: `ip -4 addr show vmbr0` ohne `.41`, `ip route` ohne `41.0/24`, `pct list` weiter 9× running.
- Core: keine `.41`-Adresse, Mgmt über `.99.1` **und** `10.40.10.1` erreichbar.
- Prometheus: `http://10.40.20.151:9090/api/v1/targets` — alle aktiven Ziele `up`, kein `10.40.41.x`.
- HA: `proxmoxve` und `portainer` beide auf `loaded`.
- **Der eigentliche Test:** TP5-Log-Regel kurz einschalten, 5 Minuten laufen lassen, `out:bridge`
muss auf **0 Zeilen** stehen. Vorher waren das 76 % des gesamten Inter-VLAN-Verkehrs.
Danach ist TP5 Etappe 1 sauber neu startbar.
---
## Nebenbefund
Im HA-Log stehen 79 abgelehnte Anmeldeversuche auf `/api/websocket` von `90.146.33.177` —
das ist **eure eigene öffentliche IP**, der Verkehr kommt also über den CF-Tunnel herein.
Vermutlich der ha-mcp-Server mit einem alten Token vor dem Neustart. Wenn die Zahl jetzt nicht
weiter steigt, war es genau das; wenn doch, lohnt ein zweiter Blick.