83 KiB
BF-Netzwerk — Teilprojekte (kanonische Steuerung, Stand 2026-06-10)
Zweck: Das große Netz-Projekt in einzeln durchziehbare Teilprojekte (TP) zerlegt — jedes mit klarem Scope, aktuellen Entscheidungen, Abhängigkeiten und Status. Jedes TP ist so geschnitten, dass es eine frische Session mit sauberem Kontext straight abarbeiten kann. Architektur/Historie:
~/.claude/plans/ich-will-das-delegieren-atomic-sunrise.md.
Kanonisches VLAN-Modell (gültig — überschreibt ältere Tabellen)
| VLAN | Name | Subnetz (Ziel) | Zweck |
|---|---|---|---|
| 10 | MAIN | 10.40.10.0/24 | Trusted (Handy/Laptop/Apple Watch) |
| 20 | INFRA | 10.40.20.0/24 | NAS/VMs/Docker/HA |
| 30 | IOT | 10.40.30.0/24 | Smart-Home (HA-managed), Waage, Fitness-Tracker |
| 40 | MEDIA | 10.40.40.0/24 | Sonos, AppleTV, TV, VuPlus, Cast-Ziele (getauscht ggü. früher) |
| 50 | UNTRUSTED | 10.40.50.0/24 | Spielekonsole, eBook-Reader, Low-Trust-Internet |
| 90 | GUEST | 10.40.90.0/24 | nur Internet |
| 99 | MGMT | 10.40.99.0/24 | Switch/AP/Hypervisor-Mgmt |
| 100 | WAN | (Arris-Transfer) | zum Arris-Kabelmodem (Liwest, Bridge-Mode, Public-IP an ap1) |
IP-Blöcke: .1–10 Router/APs (ap1=.1, ap2=.2) · .11–20 Switches (ALLNET=.11, Omada=.12). GW je VLAN = .1. |
Ist-Stand (Kurz)
ALLNET-Core .11 (FW2.2.1, VLANs 10/20/30/40/50/90/99/100; GE1/GE2/GE8 Trunk; TP1 ✅ 2026-06-15). Omada-Switch .12 (adopted, TP2 ✅ 2026-06-15; Trunk-ALL auf P1+P2, Access-Profile auf P3-P8; Profile noch PVID=1 bis Omada-PVID-Fix).
Omada-Controller .175 (DS923/macvlan, mbentley 6.2, 🟢 live). omada-mcp .176 (pve-LXC, StreamableHTTP, 🟢 live, 84 read-Tools; Controller-API v2 intern via christoph@emsenhuber.com).
2× hAP ax² (7.23.1): ap1 .1 (ALLNET P1) — TP4 ✅ 2026-07-01: Router + WAN-Edge (VLAN-Subinterfaces, DHCP, DNS, NAT, Public-Edge). ap2 .2 (Omada P2 — Trunk).
Edge-Cutover ✅ 2026-07-01: FB6660 physisch entfernt (Liwest-Kabelmodemtausch, kein Zurück), Arris-Kabelmodem im Bridge-Mode; WAN = sw1 gi16 Access VLAN100 → gi15 Trunk → ap1 ether2 → vlan100 auf bridge (NICHT ether1); ap1 hält Public-IP direkt (Liwest, kein CGNAT), Double-NAT weg. Telefonie war auf der FB und wird nicht weitergeführt. Vorarbeit: TP10-Kern durch (2026-06-27, WG-Hub live) → Bridge-Gate vorher gelöst. Runbook: routeros/wan-cutover-runbook.md.
Kontrolle: MikroMCP (MikroTik) live · ALLNET = Klickanleitungen · Omada → Controller + omada-mcp 🟢.
Nächster Schritt: Omada-PVID-Fix (MAIN→PVID10, INFRA→PVID20, untagNetworkIds bereinigen) + IP-Migration Geräte + TP5 Deny-by-default fertigziehen (Sonos-/HA-/mDNS-Holes und WAN-Input-Seal stehen bereits).
🎯 Ziel: sauberes System „from scratch", keine Leichen/Altlasten. Migrations-Session-Endstand = VLAN1 + altes cudy-WLAN komplett weg (VLAN1 nur noch Mgmt,
defconf-Client-DHCP zurückgezogen, cudy-Uplinks aufs Ziel-Client-VLAN getaggt oder cudy abgebaut). Unterpunkte/Aufräum-Liste bei Migration: (a) die Interim-Härtung ap2wifi1/wifi2 frame-types=admit-only-vlan-tagged(TP3.1, 2026-07-06) bleibt gültig — verschwindet automatisch mit VLAN1; (b)st-main rrm/wnm= reines Roaming-Provisorium, prüfen ob nach Migration noch nötig; (c) cudy1 = verbleibender aktiver VLAN1-Leak (Dual-DHCP-Race, Doku Memoryproject_vlan1_dhcp_incident). Bis dahin sind diese Griffe Krücken, kein Zielzustand. ⚠️ HW-Constraint hAP ax²: 1 GB RAM, aber nur 128 MB Flash + KEIN USB → Container auf dem Router NICHT praktikabel. Folge: native RouterOS-Features bevorzugen (z.B. Built-in-mDNS statt Container); Container (mDNS-Reflector, BIND9-DNS, Omada-Controller) laufen auf NAS/pve, nicht am hAP. 🔒 Governance-Entscheid (User, 2026-07-16, ausgeweitet 2026-07-16): Config ausschließlich über Nautobot — keine Direkt-Changes mehr an einzelnen im Netz verstreuten Geräten. Ursprünglich als ap1/ap2-Config-Freeze bis TP21 formuliert, noch am selben Tag verallgemeinert: jede Netz-Gerätekonfiguration (Router, APs, künftig auch die CRS326-Switches) läuft ab jetzt exklusiv über Nautobot Golden Config (TP21), sobald das steht — keine ad-hoc MikroMCP-Writes/UI-Klicks mehr an Einzelgeräten. TP19.1 war die letzte Ausnahme (ap1-DNS-Fix + ap2/sw1/sw2-Mgmt-VLAN-Umzug, s.u.) — davon ist nur der risikolose ap1-Teil noch direkt gemacht worden, ap2 wurde bewusst auf „nach Nautobot" vertagt. Macht Nautobot + alle Prerequisites (TP18→TP20→TP20.1→TP21, jetzt auch Komodo) zum aktuell kritischen Pfad, vor TP5/TP6. Betrifft nicht Software-Migrationen auf NAS/pve (anderes Substrat) und die Frage, ob sw1/sw2 vor der CRS326-Ablösung noch angefasst werden (offen, s. TP15/TP19.1).
Teilprojekte
TP1 — ALLNET Core-Switch finalisieren ▸ ✅ FERTIG (2026-06-15)
- ✅ GE8 Trunk (native vlan1, tagged 10/20/30/40/50/90/99/100) — war bereits aktiv.
- ✅ VLAN 40 umbenannt: UNTRUSTED → MEDIA (
switch/cli/04-vlan50-media-untrusted.cli). - ✅ VLAN 50 angelegt + benannt: UNTRUSTED.
- ✅ GE1/GE2 (AP-Trunks) um VLAN 50 ergänzt; GE8 auto-includiert (Trunk).
- Ergebnis: Core trägt alle VLANs (10/20/30/40/50/90/99/100) an P1/P2/P8.
TP2 — Omada Access-Switch + Controller ▸ ✅ FERTIG (2026-06-15)
- ✅ Omada Controller 6.2.10.17 auf DS923 (macvlan
.175):omada/docker-compose.yml, Stack via Portainer endpointId=14. Wizard abgeschlossen (configured=true), Creds inmcp/omada/.env. - ✅ pve-mcp (samik081) in Claude Code eingetragen (
~/.claude/settings.json, SSE.173:3000). - ✅ omada-mcp live auf pve-LXC (
.126, endpointId=2), ipvlan-IP.176, Stack Id=200, URL in~/.claude/settings.json.- Transport: StreamableHTTP
http://10.40.41.176:3000/mcp(Health/health→ 200). Settings-Bug (doppelter Eintrag) behoben 2026-06-15. - Auth: Omada Open API Client-Credentials. Creds in
mcp/omada/.env. Token-Format:Authorization: AccessToken=<token>(nicht Bearer). OMADA_TOOL_CATEGORIES=all (alle 84 read-Tools aktiv; write für VLANs/Ports nicht im MCP implementiert → direkte Open API oder Controller-UI). - omadac_id=
adbef8fa…, site_id=6a2fe68e….
- Transport: StreamableHTTP
- ✅ VLANs im Controller: 1/10/20/30/40/50/90/99/100 — alle angelegt, Switch adopted (switchConsistent=true).
- ✅ Port-Plan (ES208G, alle 8 Ports konfiguriert):
Port Name Profil Gerät Status 1 uplink Trunk-ALL → ALLNET GE8 ✅ korrekt 2 ap2 Trunk-ALL hAP ax² #2 ✅ korrekt 3 Port3 Access-MAIN — (frei) ⚠️ PVID=1 4 dock/monitor Access-MAIN Docking-Station ⚠️ PVID=1 · Lifeline-Port, nicht anfassen 5 drucker Access-MAIN Drucker ⚠️ PVID=1 6 Port6 Access-MAIN — (frei) ⚠️ PVID=1 7 macmini Access-INFRA Mac mini ⚠️ PVID=1 · fixe IP 10.40.41.x, nicht anfassen 8 ds923+ Access-MAIN NAS (2. Port) ⚠️ PVID=1 · nicht anfassen - ⚠️ Profile-PVID-Constraint (bis TP4 offen): NAS, Mac mini und andere Geräte haben fixe IPs im
Bereich
10.40.41.x(VLAN-1-Subnetz der FritzBox). Solange diese nicht auf VLAN-10/20-Subnetze migriert sind, mussnativeNetworkId=Default(VLAN 1)in allen Access-Profilen bleiben — sonst kein DHCP, kein Internet für diese Geräte. Fix nach TP4. - ⚠️ Bekannter Fehler
untagNetworkIds(Analyse 2026-06-15 via Controller-API v2): Access-MAIN hatuntagNetworkIds=[VLAN1, VLAN20, VLAN10](3 untagged!) statt[VLAN10]. Access-INFRA hatuntagNetworkIds=[VLAN20, VLAN1]statt[VLAN20]. Geräte erhalten Frames aus mehreren VLANs ungetaggt → Inter-VLAN-Tests verfälscht. Fix erst sinnvoll nach TP4 zusammen mit PVID-Korrektur. - Sichere Testports (kein kritisches Gerät): P3, P5, P6.
- ✅ Portainer-Ablösung: Komodo empfohlen (einzige Option mit nativem MCP
mcp-server-komodo). Eigener Task. - Abh. erfüllt: TP1 (GE8 Trunk ✅).
- → TP4 wird vorgezogen: Alle VLANs im Controller definiert (status=false = kein Management-IP, normal). Traffic läuft noch auf VLAN 1 bis TP4 die L3-Interfaces + DHCP-Server je VLAN aktiviert.
TP2.1 — Omada-Switch (sw2/ES208G) → Standalone-Recovery (kein Controller) ▸ ✅ FERTIG (2026-07-16, User solo)
- Root Cause: beim VLAN20-Umzug des Omada-Controllers (TP14.1, 2026-07-10) ist die Controller↔sw2-Verbindung zerbrochen (sw2 seither „Disconnected", ursprünglich als reiner Mgmt-Loss vertagt). Beim Rettungsversuch hat der User versehentlich einen Werks-Reset am Switch ausgelöst. Ein anschließender Wiederherstellungsversuch (durch Claude) hat Teile der Config unbemerkt halluziniert — der damalige „wiederhergestellte" Stand war nicht vertrauenswürdig.
- Entscheidung (User 2026-07-15): Controller-Zustand als invalid betrachtet, sw2 komplett neu — diesmal OHNE Managementsoftware. Kein Omada-Controller-Re-Adopt, kein Omada-Ecosystem-Anschluss (s. TP15-Korrektur — Omada bekommt generell keine Rolle mehr, auch nicht WLAN). sw2 direkt über eigenes Web-UI konfiguriert, wie ein eigenständiger Switch.
- ✅ 2026-07-16 (User-Aussage): „voll durch, Funktionsweise erfolgreich getestet." Nach dem gescheiterten Claude-Versuch hat der User sw2 komplett allein neu aufgesetzt (Runbook
docs/tp2.1-omada-switch-standalone-runbook.mdals Playbook-Referenz, nicht Schritt-für-Schritt-Log). Keine formale Einzelschritt-Verifikation dieser Session (kein Port-für-Port-Protokoll, keine Live-Prüfung durch Claude) — Status beruht auf User-Bestätigung „es geht einfach", nicht auf eigener Nachkontrolle. - sw2 bleibt Solo: „bekommt nie Geschwister" — keine weiteren Omada-Geräte geplant. Interimslösung bis zur Ablösung durch CRS326 (TP15).
- Offen/nachzuziehen (nicht blockierend): finale Portbelegung + IP von sw2 in
docs/ip-plan.md/CLAUDE.md-Hardware-Tabelle nachtragen (aktuell dort noch „Adoption pending" — stale, aber Wert unbekannt, nicht geraten);omada/.secretsauf neue Standalone-Creds prüfen; ob Omada-Controller-Container jetzt komplett überflüssig ist. - Abh.: TP1 ✅ (VLAN-Trunk am Uplink). Verwandt: TP15 (löst sw2 mittelfristig durch CRS326 ab), TP14.1 (Auslöser).
TP3 — WLAN / CAPsMAN ▸ ✅ KERN FERTIG (2026-06-18) — routeros/tp3-capsman.rsc
- ✅ 5 sichtbare SSIDs live, beide APs, beide Bänder, je SSID→VLAN (wifi datapath vlan-id):
dirtyvader-main(10, WPA3-only, FT),-iot(30, nur 2,4 GHz, WPA2+3),-media(40, WPA2+3, FT=no wg. Sonos),-untrusted(50, WPA2+3),-guest(90, WPA2+3). Alt-SSIDsinstall*/BF-Main/wv*entfernt. Temp-PSK (User setzt echte). - ✅ CAPsMAN-Architektur: ap1=Manager+AP (lokale Radios), ap2=CAP (dynamisch via Provisioning,
remote-cap=Ok). Kernlektion: Der Manager kann seine eigenen Radios NICHT über CAPsMAN provisionieren → ap1 lokal zuweisen (Master viaset+ statische Slave-VAPs), ap2 zieht Master+Slaves dynamisch. Ein CAP hält keine Eigen-Config. - ✅ Kanal-Plan (non-DFS, überlappungsfrei): ap1 ch36/5180 + ch1/2412 · ap2 ch149/5745 + ch11/2462.
(Auto-Channel hatte beide APs auf 5500-DFS/2437 gelegt = Co-Channel → fix gepinnt. ap2-Kanaländerung braucht
remote-cap provision-Push.)bound-Problem damit obsolet/sauber gelöst. - ✅ Sonos-Migration abgeschlossen (2026-07-02): alle 10 Sonos auf
dirtyvader-media/VLAN 40 mit MAC-fest reservierten DHCP-Leases indhcp-v40. Household geschlossen, iOS-App findet alle Geräte (mDNS via Repeater). Inventar/IPs = SSoTdocs/sonos-inventar.md(IPs haben sich verschoben — Arc jetzt.199, Arbeitszimmer-Paar auf.191/.192). - Vertagt: hidden
dirtyvader-infra(20)+-mgmt(99) (Mgmt verkabelt). TP8: eine 802.1X-SSID (dirtyvader-secure) mit FreeRADIUS-Dynamic-VLAN → dann PSK-main/infraeinstampfen (Konsolidierung). - SSID-Strategie-Entscheid (Begründung): unterschiedl. WPA-Typ/Band erzwingen separate SSIDs; „alles in 1 SSID per Auth" nur via 802.1X (Geräte ohne EAP wie Sonos/TV/IoT brauchen ohnehin PSK) → Hybrid in TP8.
- Mesh = NEIN (beide APs wired-trunk → Loop-Risiko). DoH-Upstream = Cloudflare Gateway (seit TP4 aktiv).
- Abh. erfüllt: TP4 ✅ (L3/VLAN-Interfaces). Folge: TP8 (802.1X), Sonos-Migration.
TP3.1 — ap2 VLAN-Trunk-Fix ▸ ✅ Config live (2026-07-01) — routeros/tp3.1-ap2-vlan.rsc
- Root Cause: ap2 (CAP, local forwarding) hatte
bridge vlan-filtering=no→datapath.vlan-idwurde nie auf die Leitung geschrieben → ALLE WLAN-Clients auf ap2 (main/media/iot/…) egressten ungetaggt in VLAN1 (defconf/10.40.41.x) statt ins Ziel-VLAN. Symptom: iPhone (VLAN10) im OG „verbunden, aber sporadisch kein WLAN-Symbol" — beim Roaming ap1↔ap2 sprang es VLAN10↔VLAN1 (Subnetz-Flip → Abbruch). Sonos-Terrasse landete auf ap2 fälschlich auf10.40.41.183. TP3 „ein CAP hält keine Config" gilt nur für Manager-Forwarding — hier local forwarding, daher braucht ap2 doch VLAN-Config. - ✅ Fix (wie ap1): ap2-Bridge
vlan-filtering=yes; VLAN1 untagged=bridge,ether2 (Mgmt), VLANs 10/30/40/50/90 tagged auf ether2. Da nur die Master-Radios wifi1(5G)/wifi2(2.4G) Bridge-Ports sind (Slave-VAPs forwarden über den Master), zusätzlich wifi1/wifi2 als tagged-Member je Client-VLAN (wifi1: 10/40/50/90, wifi2: 10/30/40/50/90). CAPsMAN legt diese auf dem CAP nicht automatisch an → manuell gesetzt. Danachremote-cap provision. - Lockout-Risiko gehandhabt: ap2-Mgmt (10.40.41.2) untagged VLAN1 blieb erhalten; kein Scheduler (device-mode=home) → Recovery = Power-Cycle OG. Ausgeführt im leeren-registration-table-Fenster.
- ⏳ Offen — funktionaler OG-Test durch User: Handy auf
dirtyvader-mainim OG → Lease mussdhcp-v10/10.40.10.xsein (nichtdefconf/10.40.41.x). Falls kein DHCP: Omada-Port-2-Trunk (tagged 10/30/40/50/90) prüfen. - Abh.: TP3 ✅, TP4 ✅ (Bridge-VLAN-Muster gespiegelt). Config ap2-lokal (nicht CAPsMAN-verwaltet).
- 🔁 Interim-Härtung 2026-07-06 (Migrations-Provisorium, fliegt mit VLAN1 raus): Symptom „kein DHCP auf
dirtyvader-main, Altnetz ebenso, nichts geändert". Diagnose via MikroMCP (ap1+ap2): Dual-DHCP-Race — dieselben Main-MACs (56:71:6C:22:E6:A9,F2:62:4C:E1:AF:09,C0:C7:DB:DE:71:BE) hielten gleichzeitig eine korrekte VLAN10-Lease (dhcp-v10/10.40.10.x) und eine VLAN1-Lease (defconf/10.40.41.18x);defconfunddhcp-v10boten parallel →offering ... without success+ Minutentakt-Flapping.bridge-ARP auf ap1 = 333 Einträge (flache VLAN1 lebt voll weiter; IoT/Shelly untagged auf10.40.41.2xx). Griff: auf ap2 die Master-Radio-Bridge-Portswifi1/wifi2vonframe-types=admit-allaufadmit-only-vlan-tagged— untagged Main/Slave-Frames werden verworfen statt in VLAN1 gedumpt (im Zielbild ohnehin korrekt, daher kein Rückbau nötig, verschwindet mit VLAN1).ether2bleibtadmit-all(VLAN1-Mgmt/Trunk, kein Lockout). Rollback:frame-types=admit-allauf beiden Ports. ⚠️ Rest-Leak bleibt: cudy1 (altes WLAN) bridged Clients weiter untagged in VLAN1 — nur per Switch-Port-Tag bzw. Alt-WLAN-Abbau (Migration) zu schließen, NICHT auf der MikroTik-Seite. Zusätzlichst-main rrm=yes wnm=yes(802.11k/v, behandelt nur das Roaming-Symptom). SSoT-Detail: Memoryproject_vlan1_dhcp_incident. - 🔴 Update 2026-07-15: gleiches Leck jetzt auf ap1 vermutet.
dirtyvader-main-Clients bekommen zeitweise10.40.41.x-IPs statt10.40.10.x— identisches Dual-DHCP-Race-Muster wie oben, aber die 2026-07-06-Härtung wurde nur auf ap2 gemacht. Nächster Schritt: gleicheadmit-only-vlan-tagged-Umstellung auf ap1s lokalen Main-Radio-Bridge-Ports (⚠️ NICHTether2anfassen — das ist ap1s Mgmt-/WAN-Trunk-Pfad). Diagnose+Fix-Schritte:docs/tp19-vlan1-cudy-teardown-runbook.mdPhase A (~30-60 Min). Diese Härtung ist wie die ap2-Variante ein Provisorium, das mit TP19s VLAN1-Abbau automatisch obsolet wird.
TP3.2 — WLAN Coverage / P750W-Discovery ▸ ⏳ teil-erledigt (2026-07-02) — docs/wifi-p750w-coverage-and-map.md
- ✅ Brother P750W (VLAN30) gelöst: DHCP-
client-id-Fix (matcht über MAC → feste10.40.30.5); an ap1 gepinnt (geordnete wifi-access-listaccept w2-iot→ blanketreject, überlebt ap2-Re-Provision) — dozende Legacy-Clients nur am co-located-GW ap1 per ARP erreichbar, CAP ap2 nicht; mDNSvlan30inmdns-repeat-ifaces+5353 → in MAIN auffindbar. Druck+Selbsttest OK. Web-UIhttp://10.40.30.5/general/information.html. - ✅ Nebenbei:
multicast-enhance=enabled(iot+media), Guestft=yes, INFRA-SSID(20) angelegt (nur ap2), Steering-Profilst-main/neighbor-group=bf-mainauf beide Main-Configs. - Nomenklatur: dynamische ap2-CAP-Slaves (
wifi13–22) nicht praktikabel umbenennbar (name-formatunzuverlässig) → Map dokumentiert statt umbenannt. Backupsbf-ap{1,2}-pre-nomen-20260702.backup/.rscauf den Geräten. - ⏳ Offene Coverage-Arbeit → ausgelagert nach TP3.3 (Fortsetzung in neuer Session).
TP3.3 — WLAN Coverage-Kur ▸ 🔜 TODO (Fortsetzung, neue Session) — docs/wifi-p750w-coverage-and-map.md
Problem: Kanten/Terrasse grenzwertig — Clients (iPhone/iPad) landen bei −76..−89 dBm und springen zwischen allen 4 Main-Radios (ap1-5G/2,4G ↔ ap2-5G/2,4G) → „0–1 Striche + häufiger Abriss"; Terrasse auch mittags schlecht. FT kaschierte das bisher als „Roaming" statt „schwache Abdeckung".
Bereits geklärt/erledigt (nicht nochmal aufrollen):
- NICHT config-verursacht (ap1 kein Reboot, RF-Konfig unverändert). TX schon am AT-Max (18/15 dBm, EIRP-Deckel — kein Hebel).
- Kanalplan intern überlappungsfrei (ap1 ch1/ch36, ap2 ch11/ch149). Steering
st-main/neighbor-group=bf-mainauf beiden Main-Configs gesetzt (hilft Client-Entscheidung, macht Signal aber nicht stärker). - ap1-only ist vom Tisch (echte Funklöcher) → beide APs nötig, aber besser platziert.
Offene Arbeit:
- Dead-Spot-Kartierung (Tageslicht): User stellt sich in jeden Problempunkt (Terrasse zuerst, entfernte Räume,
dicke Wand) → je Punkt
registration-table+monitor(Signal je Radio/Band/AP). Zusätzlich Nachbar-WLAN-Scan/interface/wifi/scanje AP (störend — wirft Clients kurz ab) gegen Abend-Congestion. Output → SSoT-Doku. - Remediation nach Befund: Platzierung (ap2 Richtung Schwachseite umstellen / 3. AP / Outdoor-Unit / Kabelweg);
Roaming-Feintuning (802.11v
transition-Schwellen ab 7.21, Band-Overlap reduzieren); Kanalplan aus Scan nachziehen. - INFRA(20) auf ap1 ergänzen (fehlt — sendet nur auf ap2): lokaler
w2-/w5-infra-Slave analog w2-/w5-media. - Danach Re-Walk-Test (wie 2026-07-02, aber mit Kartierung als Baseline).
Sicherheitsnetz: Backups bf-ap{1,2}-pre-nomen-20260702.backup/.rsc auf den Geräten. Kontext-Memory project_wifi_coverage
ref_wifi_powersave_multicast. Abh.: TP3 ✅, TP3.1 ✅, TP3.2 ✅.
TP4 — Router-Cutover (hAP#1 = Router + WAN-Edge) ▸ ✅ FERTIG (2026-07-01)
- ✅ Bridge VLAN-Filtering aktiviert (
vlan-filtering=yes); VLAN-Tabelle: VLAN1 untagged bridge+ether2, VLANs 10/20/30/40/50/90/99/100 tagged bridge+ether2. - ✅ VLAN-Subinterfaces: vlan10/20/30/40/50/90/99 auf bridge; je GW
.1(10.40.10.1 … 10.40.99.1). - ✅ DHCP: dhcp-v10…dhcp-v99 je auf eigenem VLAN-Interface, pools .100-.200, GW+DNS = VLAN-GW.
- ✅ DNS: RouterOS-nativ, allow-remote-requests=yes. Upstream seit 2026-06-16: DoH Cloudflare Gateway (
use-doh-server=https://px35ynlol3.cloudflare-gateway.com/dns-query, verify-doh-cert,servers=1.1.1.1als Bootstrap; FB-Upstream abgelöst). Statische Einträge für alle Infra-Hosts unterbf.lan(13 Einträge, Transition-IPs bis PVID-Fix).- ⚠️ Auto-Suffix
.lan(RouterOS-Einschränkung, kann nicht auf leer gesetzt werden) — TP5-Cleanup.
- ⚠️ Auto-Suffix
- ✅ NAT: srcnat masquerade out-interface=vlan100 (ap1 = Public-Edge; kein Double-NAT mehr). Fallback-Konfig für ether1 bleibt reversibel dokumentiert (
routeros/wan-cutover-runbook.md). - ✅ Routing-Tabelle: 0.0.0.0/0 via Liwest-Gateway auf vlan100; alle 7 VLAN-Subnetze als Connected-Routes aktiv.
- ✅ Edge-Cutover vollzogen (2026-07-01): FritzBox 6660 physisch weg (Liwest hat gegen ein Arris-Kabelmodem im Bridge-Mode getauscht — kein Zurück). WAN =
Arris → sw1 gi16 Access VLAN100 → gi15 Trunk → ap1 ether2 → vlan100 auf bridge(NICHT ether1). ap1 hält Public-IP direkt (Liwest, kein CGNAT). WAN-Input-Seal live (TP10-seal-Regeln: est/inv/dhcp/icmp/lan/wandrop iminput-Chain,list_firewall_rules2026-07-02 verifiziert). Telefonie war auf der FB und wird nicht weitergeführt (User-Bestätigung 2026-07-02). - DNS-Entscheidung (Technitium und externer BIND verworfen): RouterOS-DNS als Resolver, keine DHCP→DNS-Auto-Registrierung (soweit möglich). Infra-Hosts als statische
/ip dns static-Einträge unterbf.lan; dynamische Clients bewusst ohne Namen. Filtering/DNSSEC via DoH-Upstream (TP3). HA: 2. Resolver auf ap2, statische Einträge beidseitig pflegen. - Abh.: TP1 ✅. TP3-Abhängigkeit entfällt (WLAN läuft weiterhin über FB bis TP3).
- Ermöglicht jetzt: PVID-Fix in Omada-Profilen (MAIN→PVID10, INFRA→PVID20), untagNetworkIds-Bereinigung, DHCP-Reservierungen für NAS/macmini/pve auf neue VLAN-Subnetze migrieren.
TP5 — Firewall & Inter-VLAN-Policy ▸ ⏳ TEIL-LIVE (Sonos/HA-Holes + WAN-Seal gebaut, Deny-by-default steht aus)
- Deny-by-default + least-privilege (Ziel). MAIN→INFRA nur Whitelist-Dienste; MAIN↔MEDIA allow (+mDNS); UNTRUSTED/GUEST nur Internet; MGMT isoliert; Router-input gehärtet.
- ✅ Bereits live (verifiziert
list_firewall_rules2026-07-02):forward accept vlan10↔vlan40— TP5: MAIN↔MEDIA (AirPlay/Sonos)forward accept vlan20↔vlan40— TP5: INFRA↔MEDIA (HA↔Sonos)input accept udp/5353 vlan10/vlan20/vlan30/vlan40— mDNS-Repeater (TP7-Anschluss)forward accept vlan90↔vlan40+input accept udp/5353 vlan90— GUEST→MEDIA (Sonos/Cast), permanent (TP7.2, 2026-07-03)- WAN-Input-Seal komplett (TP10-seal-est/inv/dhcp/icmp/lan/wandrop + WG-Hub UDP/51821 accept)
- ⏳ Offen: Deny-by-default am Ende von
forward(aktuell noch permissiv nach fasttrack); UNTRUSTED/GUEST auf Internet-only pinnen; MGMT isolieren; IoT→INFRA-Whitelist bauen. - IoT→INFRA-Rückmeldung (deine Frage): IoT darf aktiv zu INFRA-Diensten initiieren — Firewall-Allow IoT→INFRA NUR auf MQTT (1883/8883), HA-API, InfluxDB (8086) o.ä.; Antworten via established/related; IoT→MAIN bleibt deny. So pusht ein Sensor Daten an HA/MQTT/Influx, ohne dass IoT „frei" ist.
- Abh.: TP4 ✅.
TP5.1 — DNS-Visibility & Flow-Observability für Low-Trust-Geräte (Airfryer-Fall) ▸ vorgemerkt
- Kontext (2026-07-08/09): Airfryer „airschreier" (Philips/Versuni, ESP,
10.40.30.180) bekam per DHCP-Option 6dns 1.1.1.1als Override, weil das OTA-Update über den ap1-DoH-Gateway-Pfad nicht durchging (DoH-Latenz beim primitiven ESP-Stack — kein Content-Block, via Gateway-Logs bewiesen, s.memory/ref_esp_ota_doh_not_block). Nebenwirkung: public 1.1.1.1 = anonymer Consumer-Resolver ≠ accountgebundener Gateway-DoH (px35ynlol3.cloudflare-gateway.com) → DNS-Sicht auf das Gerät weg, Gerät umgeht zudem die Filterung. - (a) DNS-Redirect statt Geräte-Override (der dauerhafte Fix): dst-nat „UDP/53 (+TCP/53) von Low-Trust-Src → auf einen plain Resolver umbiegen" gibt Logging zurück UND funktionierendes OTA (kein langsamer DoH-Pfad fürs Gerät). Redirect-Ziel-Optionen: (i) ap1-Resolver mit nicht-DoH-Upstream für dieses Src-Set, (ii) direkt public 1.1.1.1 (dann nur Flow-Logging), (iii) eigener plain-Resolver. Sauberer als „Gerät verschwindet auf 1.1.1.1". Verortung: Teil des UNTRUSTED-Internet-only-Pinnings (TP5-„Offen"); Entscheidung v50-DNS-Policy (gefiltert vs. plain) hängt dran.
- (b) Live-Torch als Ad-hoc-Observability: DNS ist bei direktem 1.1.1.1 blind, Flows nicht (NATen über ap1).
torchaufvlan30/vlan50gefiltert auf die Geräte-IP zeigt Ziel-IPs live (Versuni → AWSeu-west-1IoT erkennbar). Voraussetzung: Gerät aktiv. Merkregel: Airfryer nur online wenn er kocht → Capture ans Einschalten koppeln. - Abh.: UNTRUSTED-Move des Airfryers (Kandidat, s. VLAN50) + TP5-Deny-by-default. Kein Blocker.
TP6 — QoS/CAKE + Call-Quality-A/B-Test ▸ DAS Ziel
- CAKE am WAN-Upload (~85–95 % Linerate) → Bufferbloat weg. Verifikation waveform.com → A/A+.
- ⚠️ Vor „Erfolg": A/B-Test, denn Kollegen-Befund sagt DE-Calls = internat. Pfad AT↔DE, nicht Heimnetz → ggf. WARP statt/zusätzlich CAKE. Nicht am einen Telefonat festmachen.
- Abh.: TP4.
TP7 — Media-Discovery (mDNS) für VLAN 40 ▸ ✅ FERTIG (2026-07-02) — docs/tp7-mdns.md
- ✅ Built-in mDNS-Repeater aktiv:
/ip/dns set mdns-repeat-ifaces=vlan10,vlan20,vlan40,vlan30,vlan90,bridge(RouterOS 7.23.1;vlan90+bridge=VLAN-1 seit TP7.2 2026-07-03). MAIN/INFRA/IOT/GUEST/VLAN1 ↔ MEDIA. Reversibel (Feld leeren). Realbestand: MAIN=iOS-Client + MacBook, INFRA=Home Assistant, MEDIA=10× Sonos (siehedocs/sonos-inventar.md). - ✅ Funktional durchgetestet (2026-07-02): iOS-Sonos-App (vlan10) und Home Assistant (vlan20) finden die
9 online-Sonos per
_sonos._tcp.local.(Bonjour) automatisch. Household nicht mehr gesplittet. - ✅ TP5-Anschluss live:
forward accept vlan10↔vlan40+forward accept vlan20↔vlan40+input accept udp/5353auf vlan10/20/30/40 sind gebaut (mit „TP5:"-Kommentar), damit Discovery + Steuerung + Streaming ohne Umwege gehen. - ⚠️ SSDP/Cast (UDP 1900) bewusst NICHT gebaut (bräuchte Reflector-Container auf NAS/pve; hAP hat kein USB/Flash). Konsequenz: macOS-Desktop-Sonos-App nutzt SSDP → quert die VLAN-Grenze NICHT und findet die Sonos nicht. iOS-App (mDNS) und HA-Integration decken den Nutzungsbedarf ab; Spotify Connect läuft über Cloud.
- Abh.: TP4 ✅, TP5 (Sonos-Holes) ✅ live.
TP7.1 — SSDP-Reflector (macOS-Sonos-App über VLAN-Grenze) ▸ vorgemerkt
- Bedarf: macOS-Desktop-Sonos-App auf VLAN 10 findet die Sonos in VLAN 40 nicht (Discovery per SSDP UDP 1900, RouterOS reflektiert kein SSDP). iOS-App + HA decken den Alltag ab, aber User will die Desktop-App nutzen.
- Lösung: kleiner SSDP-Reflector-Container mit Bein je Ziel-VLAN. Auf NAS oder pve (nicht am hAP, 128 MB
Flash + kein USB). Kandidaten:
bkupreck/ssdp-repeater,scyto/multicast-relay, oder eigenes Python-Skript. - Scope: vlan10 ↔ vlan40 (MacBook → Sonos). Optional vlan20 ↔ vlan40 falls HA je SSDP-Discovery brauchen sollte (aktuell nicht — HA nutzt zeroconf/mDNS).
- Anschluss TP5:
input accept udp/1900auf den bedienten VLANs (falls Router-lokal reflektiert wird) bzw. Container-Port-Freigaben je Bein. - Alternative (verworfen): macOS-Client temporär in VLAN 40 hängen (unpraktikabel für Alltagsnutzung).
- Abh.: TP7 ✅. Kein Blocker für TP5-Deny-by-default.
TP7.2 — HA↔Sonos static-host binding + VLAN1/GUEST-Discovery ▸ ✅ FERTIG (2026-07-03) — docs/sonos-inventar.md
- Root Cause (widerlegt frühere Doku): HA-
media_player.*-Sonos alleunavailable. HA sitzt nicht auf VLAN 20, sondern noch auf10.40.41.105(VLAN-1-Transfernetz, IP-Migration steht aus). Der mDNS-Repeater deckte VLAN 1 nicht ab, und die HA-Sonos-Integration ist SSDP-abhängig (manifest dependencies:[ssdp], soco 0.31.1) → quert die VLAN-Grenze nicht. Die alten „HA nutzt mDNS/zeroconf, fixed 2026-07-02"-Notizen waren falsch. - ✅ HA-Fix (discovery-unabhängig):
sonos: media_player: hosts:mit allen 11 Sonos-IPs +advertise_addr: 10.40.41.105inconfiguration.yaml(Backup.bak-sonos-20260703).advertise_addrfixt die UPnP-Event-Callbacks trotz HA-Multi-Homing (.105/172.16.0.18/docker). Core-Restart → alle 6 Online-Zonenidle/playing(Wohnzimmer-Push verifiziert = Callbacks OK). Terrasse.198offline = kein Entity (kommt beim Einschalten). Kurzes Flapping direkt nach Restart = Settling, danach stabil. - ✅ Nebeneffekt: mit
bridgeim Repeater (s.u.) meldet HA jetzt „Automatic discovery is working, hosts not needed" — die statischen Hosts sind also Redundanz (Gürtel+Hosenträger), bleiben aber als Absicherung. - ✅ VLAN 1 (temp) + GUEST (perm) Discovery/Reach (User-Wunsch 2026-07-03):
- mDNS-Repeater erweitert →
mdns-repeat-ifaces=vlan10,vlan20,vlan40,vlan30,vlan90,bridge(VLAN-1-untagged=bridge). - Firewall:
input accept udp/5353 vlan90+forward accept vlan90↔vlan40(ganzes MEDIA, beide Richtungen; User-Wahl). VLAN 1/bridgebrauchte nichts (schon viaTP10-seal-lan+ permissiver Forward). - Bewusst in Kauf: flacher Repeater → Guests sehen auch MAIN/INFRA/IOT-mDNS-Announcements (Discovery-Leak; echte Verbindungen regelt TP5-Deny-by-default).
- mDNS-Repeater erweitert →
- Offen/später: HA→VLAN 20 (IP-Migration nach Omada-PVID-Fix) → dann nur
advertise_addrauf neue IP; macOS-Desktop-App weiter via SSDP-Reflector TP7.1. Abh.: TP7 ✅, TP5-Holes ✅.
TP8 — Identity & Access-Control ▸ research-gated
- RADIUS = FreeRADIUS auf der NAS (✏️ User-Manager v5 kann KEIN LDAP → openldap nur via FreeRADIUS anbindbar).
- EAP-TLS (Zert) je Gerät + dynamische VLAN-Zuweisung (RADIUS-Attribut
Tunnel-Private-Group-ID). Einfachste Heim-Alternative: pro VLAN eine SSID mit WPA3-PSK (kein RADIUS) — Abwägung Komfort vs. Admin-Aufwand. - Abh.: TP3. (Research erledigt, s. TP-R.)
TP9 — Gateway-/Router-HA ▸ research-gated
- „Was, wenn ap1 ausfällt?" → VRRP löst Gateway-Failover je VLAN ~gratis (kreuzweise Master/Backup). ⚠️ Haken (nicht Last): DHCP/Firewall/NAT/DNS müssen auf BEIDEN APs identisch gepflegt sein, sonst „Gateway up, Internet tot". Empfehlung: VRRP nur für MAIN/INFRA, sonst ap2 als Kalt-Ersatz + Backup. DHCP/DNS schon redundant (Split + 2 Resolver).
- Abh.: TP4. (Research erledigt, s. TP-R + Config-Skizze im Report.)
TP10 — Multi-Site VPN ▸ ✅ KERN DURCH (2026-06-27) — beide WG live auf ap1-Hub (docs/tp10-vpn-migration.md)
Details/Cutover/Gotchas/Eckdaten →
docs/tp10-vpn-migration.md(Single Source of Truth). Research:docs/research/vpn-comparison.md.
- ✅ KERN DURCH (2026-06-27) + EDGE-CUTOVER (2026-07-01): beide AVM-Tunnel → 2× WireGuard mit Hub auf ap1 migriert. Live:
peer fm(10.101.0.0/24, bidirektional, myfritz-Endpoint) undpeer dw(10.95.10.0/24, CGNAT-Dial-in) mit frischem Handshake + Traffic. Public-Edge direkt — ap1 hört UDP/51821 aufvlan100(Edge-Cutover 2026-07-01), keine FB-Portfreigabe mehr, kein Double-NAT. FM-IPsec gekillt, Gelis alter FB↔FB-WG sauber geswappt. - ✅ DW/Geli on-site verifiziert (2026-06-27): Geli auf
10.95.10.0/24renumbert, FB-WG single10.95.10.1/24, Keepalive 25, Endpointbf4…:51821. End-to-End von macmini/Linz → Gelis 24/7-APs10.95.10.246/.247sauber (echte LAN-IPs, kein10.255.255.x-NAT-Leak). - 💡 Root Cause (FM-PoC bewiesen): FB masqueradet WG, wenn die Interface-
Addresseine Transfernetz-IP ist → muss die FB-LAN-IP sein (AVM Proxy-ARP). War der Schlüssel zum sauberen LAN-LAN. - Hub:
wg-hub(UDP 51821, KeyP/bzt…, MTU 1412, keine IF-IP). Endpoint = DDNSbf4.emsenhuber.net:51821(Cloudflare, DNS-only → Public-IP). Apply gebündelt inrouteros/tp10-cutover-apply.rsc. - ✅ Permanenter Edge-Cutover durch (2026-07-01) — Details in TP4 (WAN via sw1 vlan100, ap1 = Public-Edge, WAN-Input-Seal live). BF-FB-eigenen WG-Server 51820 entfällt (FB physisch weg).
- Offen: DDNS-Auto-Updater für
bf4.emsenhuber.netauf NAS/pve, damit der A-Record der Public-IP folgt (falls Liwest sie tauscht). Aktuell manuell in Cloudflare gepflegt.
TP11 — Monitoring & Mgmt-Control-Plane ▸ research-gated
- MikroMCP + omada-mcp + SNMP/icinga-mikrotik, RoMON, NTP, E-Mail-Alerts, Netwatch. → Teil von
docs/research/routeros-capabilities.md. - CF-Tunnel #1033 Track A ✅ live (2026-06-30): Round-Robin-1033er über 3 asymmetrische Connectors behoben
durch Reduktion auf pve-only Connector (NAS + macmini scheiterten an pve-lokalen/stalen Origins). SSoT:
docs/cf-tunnel-mapping.md. Track B/C läuft über TP14 (Ingress bereits v116 .41→.20 für NAS; pve-Connector→VLAN20 via TP14 Session B = #1033-Zielbild).
TP12 — IPv6 (intern + extern, 3 Standorte) ▸ research-gated
- Konzept für FM/BF/DW. → TP-R.
TP13 — „Botschafts-WLANs" ▸ fun, low-prio
- Nutzlose SSIDs mit Botschaft („Kanal 500 bitte nicht nutzen"), offenes WLAN mit Captive-Portal das auf statische Info-HTML zeigt (Nachbarschafts-WLAN-Tuning, Auto-Kanalwechsel). Idee: wer's sieht, kann auch stören → Infoseite = beste Adresse. ⚠️ Recht prüfen (Impressum/TMG, Störerhaftung bei offenem WLAN — User privat). RouterOS-Hotspot/Captive-Portal kann das.
TP14 — Host/Container-IP-Migration VLAN1→VLAN20 (Docker-Cutover NAS+pve) ▸ ⏳ WIP — docs/nas-vlan20/RUNBOOK.md, Handoff docs/nas-vlan20/handoff/
- ✅ NAS (DS923, ep14) migriert (2026-07-09/10): Docker von
default_external(macvlan .41) auf einvlan20-Macvlan (10.40.20.0/24, gw .1, parentovs_eth0); DSM-Cutover.20.10; Portainer-Endpoint.20.10:9001. Root-Cause der Dauerfehler = Portainer Config-Only-Macvlan-Falle (Driver:null, kein Container-Attach) + Macvlan-Parent-Exklusivität (default_externalmuss weg fürvlan20) +default_internal(172.18) weg. Container laufen auf.20.x. - ✅ CF-Ingress v116 (2026-07-10): 6 NAS-Origins .41→.20 (SSoT
docs/cf-tunnel-mapping.md§8);vw200 via Tunnel = pve→VLAN20-Routing steht (502 direkt nach Ingress-PUT = transient). - ⚠️ Abh./Reihenfolge: verzahnt mit Omada-PVID-Fix/IP-Migration (Reihenfolge #3); Sessions = Sub-TPs TP14.1–14.5, sequenziell A→B→C→(D jederzeit)→E, keine parallelen Branches (geteilte Live-Infra). Anschlussstatements:
docs/nas-vlan20/handoff/README.md. - ✅ TP14.1 (Session A) durch 2026-07-10: alle ep14-Container auf vlan20 + pve-mcp neu; nur Omada-Inform-Adresse offen (Controller-UI-Task, s.u.).
- ✅ TP14.2 (Session B) durch 2026-07-10: pve-LXC (400/
docker) auf VLAN20 (.20.126, ipvlanparent=veth20); omada-mcp/adguard→.20.x; CF-Connector jetzt VLAN20 = #1033 gelöst. Nächste Session = TP14.3 (Session C, dormante Stacks + Referenz-Sweep ap1-DNS). - ✅ Netz-Abgleich 2026-07-11 (live via MikroMCP/pve-mcp): NAS
.20.10, Mac mini.20.167, pve-LXC.20.126alle reachable auf VLAN20 (+ Container.20.xpopuliert;iobroker .107/ccu .232/z2m .106/vw .127jetzt auch VLAN20). Sonst in VLAN1 (bridge) nur noch: sw1.11/sw2.12/ap2-Mgmt.2(Switch-/AP-Mgmt, interim bis MGMT-VLAN99) + Streu-Clients übers cudy-Alt-WLAN (MacBook.182, iPhone.186, SwitchBot.184, Sonoff) + die 16 VLAN1-Shellys (TP17).defconf/pool-v1-DHCP aufbridgeläuft noch (VLAN1 aktiv). - ✅ pve-Host-Mgmt → VLAN20 (2026-07-13): letzter verbliebener Host-Umzug.
vmbr0bleibt VLAN1.41.100(ohne Default-Route, interim), neuesvmbr0.20(bereits vorbereitet, aber mit kaputteraddress 10.40.20.0/24vorgefunden) korrigiert auf10.40.20.100/24→ifreload -alive (ifupdown2, kein Reboot, LXC 400 durchgehend unbeeinflusst) → Default-GW auf10.40.20.1geflippt. SSH-Key-Auth bestätigt auf.20.100. Nachgezogen: ap1-DNS (pve.bf.lan→.20.100; dabei Fund+Fix eines Alt-Bugs:pve-mcp.bf.lanzeigte noch auf.41.173statt.20.173), CF-Tunnelbf-pveIngress (pve+j44d6tua-SSH-Hostname .41.100→.20.100, PUT viaCF_API_TOKEN, Smoke 200/200), CLAUDE.md,docs/ip-plan.md.~/.claude.jsonwar schon sauber.
TP14.1 — Session A: NAS fertigstellen ▸ ✅ DURCH (2026-07-10); Omada-Inform/sw2 VERTAGT
- ✅ Alle ep14-Container auf vlan20 redeployed + verifiziert running/.20.x (via Portainer-Stack-Redeploy, Env preserved, Volumes intakt): oc-stack(112 → prometheus
.151/node-exporter.154/grafana.109), default(72 → hms-mqtt.124), nginx(101 → dashboard-web.148), oc-central(160 → qdrant.159), oc-charlie(158 →.162+cf), oc-johnny2(150 →.161+cf), gitea(111 →.157, DB.20.23:3306erreichbar ✓), drawio(107 →.139, intern; CF-CNAME war eh gelöscht). - ✅ pve-mcp NEU als Stack (id 202, vlan20-only
.20.173), verbunden mit Proxmox.41.100(v9.0.11) — ⚠️ StreamableHTTP am Root-Pfad/, NICHT/sse(mcp-pve v0.4.8,MCP_TRANSPORT=http).~/.claude.jsonmcpServers.pve-mcpNEU angelegt{type:http, url:http://10.40.20.173:3000/}(war vorher gar nicht drin) → wirkt nach Claude-Code-Restart. - ✅ Tunnel-Smoke (CF-Ingress v116 zeigte schon auf
.20): gitea 200, grafana 302, vw 200 — Origins existieren jetzt real. - ⚠️ alertmanager
.153: korrekt an vlan20, aber crash-loop wegen PRE-EXISTING Config-Bug (${TELEGRAM_CHAT_ID}-Literal in/etc/alertmanager/alertmanager.yml→ int64-Parse-Fehler; Alertmanager macht kein Env-Substitution). NICHT migrationsbedingt, braucht echte chat_id. Out-of-scope. - ⚠️ openclaw-DB
10.40.41.122:3306down (shared MariaDB, pre-existing; Bots kamen trotzdem hoch).DB_HOST-Env unverändert gelassen.OLLAMA_BASE_URL=.41.167=Mac-mini bleibt korrekt.41(migriert nicht → kein Blanket-Env-.41→.20!). - ⚪ OBSOLET (2026-07-16) —
omada-controller Inform-Adresse + sw2 re-adopt: ursprünglich vertagt (2026-07-10, Controller-Login schlug fehl). Gegenstandslos seit TP2.1: der Controller-Login-Ausfall eskalierte zum Werks-Reset von sw2, User hat daraufhin entschieden, sw2 dauerhaft standalone ohne Controller zu betreiben — und den Omada-Controller-Container samt omada-mcp am 2026-07-16 komplett gelöscht (overkill für 1 Switch auf der Abschussliste, s. TP15/CRS326). Kein Re-Adopt mehr vorgesehen. - 🐞 Gotcha gefunden: Portainer-Stack 111 (gitea) hatte den
vlan20-Networks-Block auskommentiert (Vorsession-Artefakt) → Container landete aufgitea_default/172.18. Fix = Redeploy mit Disk-Filedocs/nas-vlan20/stacks/111-gitea.ymlals Override.
TP14.2 — Session B: pve-Docker-LXC (.126) → VLAN20 ▸ ✅ DURCH (2026-07-10) (ipvlan)
- ✅ ep2-Container auf
vlan20: omada-mcp.20.176(OMADA_BASE_URL→.20.175), adguard_bf1.20.16, adguard_fm2.20.17— alle running/reachable (health 200, adguard 302). Transf. Filesdocs/nas-vlan20/stacks/{195-adguard,200-omada-mcp}.yml. - ✅ LXC 400 (
docker) net0 →tag=20, ip=10.40.20.126/24, gw=10.40.20.1(⚠️ Retag brauchte Christoph — Tokenclaude@pam!claudehat keinVM.Config.Network; UI-Edit, dann Reboot via API mitVM.PowerMgmt). Portainer wandert aufhttps://10.40.20.126:9443. - 🐞 Gotcha: in-Container-Iface heißt jetzt
veth20, NICHTeth0(UI setzte Name analog net1=veth16) → Dockervlan20=ipvlanparent=veth20(nicht eth0 wie im Runbook). cloudflared(host)/portainer(bridge) unberührt. - ✅ CF-Connector
db713b30jetzt in VLAN20 (Tunnelbf.emsenhuber.nethealthy/8 conns) = löst TP11-Track-B/C (#1033-Zielbild). Ingressportainer.41.126→.20.126. Smoke: portainer/gitea/vw 200, grafana 302. - ✅ Refs nachgezogen:
mcp/portainer/.env(PORTAINER_URL),~/.claude.json(omada-mcp.20.176), CLAUDE.md,docs/ip-plan.md,docs/cf-tunnel-mapping.md. Next = TP14.3 (Session C, dormante Stacks + Referenz-Sweep ap1-DNS). - ✅ Live-Smoke re-verifiziert 2026-07-10: alle 6 VLAN20-IPs ping OK + dienstseitig grün — Portainer
.20.126:9443HTTP 200 (LXC 400 running, net0veth20 tag=20 gw/ns=.20.1), omada-mcp.20.176→Controller.20.175v6.2.10.17 (HTTPS :8043 200), pve-mcp.20.173liefert Proxmox-Config, adguard.20.16/.20.17HTTP :80 302→login (nicht HTTPS/:3000).
TP14.2a — pve-mcp Single-Session-Fix + VLAN20-Host-DNS ▸ ✅ (2026-07-10)
- pve-mcp „Failed to connect": Ursache = mcp-pve v0.4.8 kann im HTTP-Transport nur eine MCP-Session (ein globaler
StreamableHTTPServerTransport,sessionIdGeneratorgesetzt) → erster Client nach Boot belegt den Slot, jeder weitere Init (neue Claude-Code-Session,claude mcp list-Healthcheck, Reconnect) =400 "Server already initialized". omada-mcp NICHT betroffen (frische Session-ID pro Init → Per-Session-Transport). Fix = Upgrade auf 0.6.1 (Per-Session-Map,serverFactory()je Session, gleiche Env-Vars = Drop-in); Stack 202 neu deployed, Container.20.173= 0.6.1,Connected to Proxmox VE 9.0.11,tools/listliefertpve_*, Claude Code ✔ Connected. 3× init hintereinander = 3× 200 mit verschiedenen session-ids (verifiziert). - Kollateral-Fund — VLAN20-Host-DNS kaputt (beide Docker-Hosts): nach dem VLAN20-Umzug zeigten NAS und pve-LXC
/etc/resolv.confnoch auf totes.41.254→docker pullghcr.io scheitert (EAI_AGAIN/ 5s-Resolver-Timeout; Egress zu ghcr-IP140.82.x:443= OK 31 ms, also nur Resolver tot, nicht Egress). Fixes: LXC.20.126→pct set 400 --nameserver 10.40.20.1(Christoph). NAS → DSM-„Allgemein"-DNS war.20.1, ABER die Netzwerkschnittstelle zog DNS per DHCP und überschriebresolv.conf; Fix = Schnittstelle „DNS manuell"10.40.20.1(Christoph) → NAS pullt wieder direkt. Merkregel Synology: GUI-DNS ≠ wasdockerdliest (Quelle/etc/resolv.conf, per DHCP überschreibbar). Workaround solange NAS-DNS tot:docker save(LXC, hat DNS) → gzip (191-MB-tar reißt am Portainer-Agent-Socket-Proxy „context canceled"; ~70 MB gz geht) → PortainerPOST /endpoints/14/docker/images/load→ Stack-RedeploypullImage:false. Gotcha: laufende Container frieren den127.0.0.11-Upstream zum Erstellzeitpunkt ein (Recreate nötig; für pve-mcp egal — Proxmox per IP.41.100). Memoryref_pve_mcp_singlesession_and_vlan20_dns.
TP14.3 — Session C: Dormante Stacks vlan20-tauglich + Referenz-Sweep ▸ ✅ Referenz-Sweep durch (2026-07-16); dormante Stacks weiter bewusst nicht deployt
- ✅ Dormante Stacks bereitgestellt (2026-07-11):
transform.pyauf core(43)/openclaw(92)/openclaw2(97)/oc20260307(119)/openspeedtest(74)/speedtest_tracker(80)/technikscheiss(42) →.new.yml+.orig.ymlindocs/nas-vlan20/stacks/(gitignored). Nicht deployt (User: „im Bedarfsfall später", Container-Zukunft ungewiss). 42/43 warendefault_internal→ jetzt vlan20-only (DHCP-.20.x). ⚠️ Deploy-Caveats: externe Refs bewusst NICHT umgeschrieben (DB_HOST=.41.122[pre-existing tote openclaw-DB, in 80+119],OLLAMA_BASE_URL=.41.129,REDIS_URL=.41.111in 119); Kollision43-corewill.20.23= gitea-DB-IP (nicht gleichzeitig deploybar). - ✅ Referenz-Sweep
.41→.20(2026-07-16, im Rahmen der TP19-Backup-Vorbereitung live gefunden + gefixt): ap1/ip dns statichatte nochnas.bf.lan→.41.10unddocker.bf.lan→.41.126stale — korrigiert auf.20.10/.20.126(MikroMCPmanage_dns_entry, dry-run+apply). Zusätzlich per User-Entscheid Omada-Controller + omada-mcp komplett gelöscht (overkill für 1 Switch auf der Abschussliste) → DNS-Einträgeomada.bf.lan/omada-mcp.bf.lanentfernt statt migriert.fritzbox.bf.lan(totes Gerät, physisch weg seit 2026-07-01) ebenfalls entfernt.docs/ip-plan.md+ CLAUDE.md nachgezogen. - ⏸️ Noch offen:
~/.claude.json(omada-mcp-Eintrag verwaist, Server wird nie mehr connecten — Aufräumen), CF-Ingress-Rest (obomada/omada-mcp-Hostnames dort existieren, ungeprüft). - ↪️ Shelly-Geräte-Übersiedelung ausgegliedert → TP17 (die ~26 IoT-Shellys sind eine eigenständige WLAN-Migration, nicht Teil des Docker-Ref-Sweeps).
TP14.4 — Session D: CF-Access-Profil für Claude ▸ 🔜 TODO (nicht cutoff-kritisch)
- CF-Token „claude code mcp" hat jetzt
Access: Service Tokens: Write+Read→claude-mcprotieren (POST …/access/service_tokens/{id}/rotate) →CF_ACCESS_CLIENT_ID/_SECRETinmcp/cloudflare/.env(chmod600). Memoryref-cf-access-claude-profile.
TP14.5 — Session E: Freigabe-Gate → TP5-Firewall ▸ 🔜 (ZULETZT)
- Erst wenn TP14.1–14.3 durch (alle Origins/Connectoren in VLAN20) → dann TP5 (Deny-by-default) starten. Reines Reihenfolge-Gate, kein eigener Change.
TP15 — HW-Refresh: Switching + Router + DC-USV ▸ 🟡 Beschaffung läuft, Lieferung 2026-07-17 (morgen) — docs/hw-refresh-requirements.md, Memory project_mikrotik_commit_nautobot_gc
- 📦 2× CRS326-24G-2S+RM werden morgen (2026-07-17) geliefert. Sequenzierung ggü. Nautobot (TP21, noch Wochen entfernt: TP18→TP20→TP20.1→TP21 + jetzt Komodo-Abh.) noch zu klären — Governance-Regel „Config exklusiv über Nautobot" (s. oben) steht in Spannung zu „Config vorab machen" (User-Wunsch 2026-07-16): offen ist, ob (a) nur Config-as-Code/Intended-Config vorbereitet wird (Hardware bleibt bis Nautobot steht ungenutzt/eingelagert), oder (b) die Switches zeitnah klassisch von Hand eingebaut werden (verstößt gegen die frische Regel, Nautobot importiert später den Ist-Stand), oder (c) alles wartet bis Nautobot steht. Ebenfalls offen: lohnt sich der TP19.1-sw1/sw2-VLAN99-Umzug noch, wenn die CRS326-Ablösung so nah ist?
- 🧭 Grundsatzentscheid (2026-07-14, korrigiert 2026-07-15): reines MikroTik-Ecosystem — Routing + Switching + WLAN. Omada bekommt KEINE Rolle (weder Switching noch WLAN — der ursprüngliche „Omada=WLAN"-Satz war ein Fehlschluss beim Dokumentieren, User-Korrektur 2026-07-15: „WLAN war NIE von Omada die Rede"). Begründung Switching: Projektziel #1 CAKE nur RouterOS/OpenWrt/OPNsense (Omada-Gateway kann kein CAKE) → Switching = MikroTik CRS. WLAN bleibt auf hAP ax²/CAPsMAN (kein EAP-Kauf), Coverage-Fix bleibt Platzierungsfrage (TP3.3). Verworfene Vollvarianten (Omada-only, MikroTik-only) samt Begründung + Ansible/Nautobot-Recherche → Memory. Anlass der Korrektur: Omada-Controller↔sw2-Link beim VLAN20-Umzug (TP14.1) zerbrochen, versehentlicher Werks-Reset bei Rettungsversuch, fehlerhafter Wiederherstellungsversuch → sw2 wird standalone neu eingerichtet, s. TP2.1.
- 🛒 Switches: 2× CRS326-24G-2S+RM bestellt (2026-07-14 — CSS326-Fehlbestellung storniert → CRS). 24×1G + 2×SFP+, lüfterlos, DC-input (USV-tauglich). Lösen ALLNET-Core (sw1) + Omada-ES208G (sw2, s. TP2.1 — Solo/Interim bis CRS-Tausch) + Cudy ab.
- ✅ CRS = RouterOS-fähig → in-model: MikroMCP-Write + Nautobot Golden Config (TP21) managen auch die Switches, nicht nur den Router → config-as-code deckt den ganzen Kabel-Fabric. (SwOS-Boot bliebe als Fallback möglich, aber nicht genutzt.)
- ⚠️ kein PoE (Sonoff/PoE-Verbraucher via Injektor, falls nötig).
- 📶 WLAN bleibt hAP ax²/CAPsMAN — kein Hardware-/Ecosystem-Wechsel. Coverage-Schwachstellen (P750W-Fall, Terrasse/Kanten) bleiben Platzierungs-/Roaming-Thema von TP3.3, nicht durch neue Hardware gelöst.
- 🧭 Router → RB5009 (mittelfristig): L3/CAKE/Firewall vom hAP ax² lösen (device-mode=home blockt scheduler/fetch; „AP=Router"-Fragilität) → dedizierte RouterOS-Box, in MikroMCP + Nautobot. hAP ax² danach nur noch WLAN/Reserve.
- 🔋 DC-USV (unverändert gültig): MeanWell LRS-150-48 + DDR-120-48 + LiFePO4 20Ah (~€190), 48V-Bus; CRS326 DC-input passt.
- Offen: RB5009-Beschaffung; Standort-Zuordnung der 2 CRS326 (Diele/OG) nach TP19-VLAN1-Retirement; ob/wann sw2 durch einen 3. CRS326 abgelöst wird.
- Hinweis: die A/B/C/D-Switch-Varianten in
hw-refresh-requirements.mdsind durch die CRS326-Beschaffung überholt (Doc = Recherche-Archiv + USV/Energie-Referenz). - Abh.: TP14 ✅ (IP-Migration). Verzahnt: TP20 (Platform-DB), TP21 (Nautobot GC), TP2.1 (sw2-Standalone-Recovery).
TP16 — CF-Tunnel: Round-Robin killen + reziprokes HA ▸ ✅ KERN UMGESETZT (2026-07-10) — docs/cf-tunnel-mapping.md §10, #1033
✅ Umgesetzt (2026-07-10, eigene Session): reziprokes 3-Tunnel-HA live (bf-nas
70d6a4cf/ bf-pvef7fdf3a6/ bf-mm7a322261), 6 Connectoren (2/Host, je Fremdhost), 19 FQDNs Loop-Smoke 0×530, HA per Host-Ausfall-Sim bewiesen. Round-Robin-#1033 strukturell weg. As-Built =docs/cf-tunnel-mapping.md §10. Offen: Schritt 5 Access-Strang (vwbypass→geschützt via WARP,hass/ha-mcp400/403 → iPhone-WARP-Enrollment) = user-gated;gateway-dw(WG→404) klären.
-
Symptom (User): FQDNs über CF werden sporadisch / „sehr unsicher" aufgelöst = #1033-Muster zurück („jeden 3. Schuss eine Niete"). User hat alle 3 cloudflared-Images + Container aktualisiert/neu gestartet.
-
✅ Root-Cause endgültig (User-Diagnose bestätigt): macvlan/ipvlan-Host-Isolation. Ein cloudflared-Connector ist blind für macvlan/ipvlan-Container auf seinem EIGENEN Host (Linux-Kernel-Regel), erreicht aber Fremdhost-L2 + co-lokierte Bridge-Container. Mehrere Connectoren auf EINEM Tunnel = geteilter Ingress + CF-Round-Robin → jede Origin, die auf dem Host eines Connectors liegt, fällt bei ~1/N aus. Strukturell, nicht durch „Origins fixen" heilbar. Bsp:
omada .20.175/pve-mcp .20.173/gitea .20.157/grafana .20.109= NAS-macvlan → vom NAS-Connector NICHT erreichbar. -
Invariante: innerhalb EINES Tunnels ist kein Route→Connector-Pinning möglich (alle Connectoren teilen Ingress, CF round-robined). „Ausgewählte Routen für ausgewählte Connectoren" = getrennte Tunnel.
-
Ziel-Design (HA): reziproke Per-Host-Tunnel — jeder Host-Dienst wird von den Connectoren der ANDEREN Hosts bedient (nie vom eigenen):
Tunnel (= Dienste eines Hosts) Connectoren auf HA pve-Dienste NAS + macmini 1 abdrehbar NAS-Dienste (omada/pve-mcp/gitea/grafana/…) pve + macmini 1 abdrehbar macmini-Dienste ( .20.167)pve + NAS 1 abdrehbar 3 Tunnel, jeder Host fährt 2 cloudflared → Host-Ausfall ⇒ jeder Tunnel ≥1 Connector = voll HA. Voraussetzung: jede Origin L2-erreichbar.
-
Ist-Inventory (live 2026-07-10, s.
cf-tunnel-mapping.md §9): Ingress v119, 24 Hostnames, 2 live Connectoren. DOWN/stale:pbs .20.135,nginx-bf .41.123(noch VLAN1!),hermes+hermes-geli .20.167. Zu klären (Host/Netz):vw .20.127/ccu .20.232/iobroker .20.107/z2m25 .20.106— ggf.vw/ccuauf VLAN20-macvlan heben.gateway-dw(192.168.178.1) = WG-Sonderfall. -
CF-Access-Strang (verzahnt, s. TP11 Track-B):
hass-400 in der HA-iPhone-App = CF-Access davor (Companion-App kann Access-Login nicht) → Fix ohne Passthrough: iPhone in WARP enrollen (Device-Identity erfüllt Access; „Warp Login App" existiert bereitsallow:christoph). ⚠️vw= aktuellbypass(öffentlich!) → von bypass auf geschützt heben. „Passthrough-Hosts sind die kritischen" (User). -
Umsetzungs-Reihenfolge (für die eigene Session): (1) Reachability-Matrix je Host (pve/NAS/macmini → jede Origin, read-only) BEVOR gruppiert wird; (2) Interim-Sofortfix: bf-Tunnel auf pve-only (pve erreicht alles außer gateway-dw) → 0×1033, reversibel; (3) reziprokes 3-Tunnel-HA bauen (CNAMEs re-pointen, 6 Connectoren, Token je Tunnel; NAS/macmini-Alt-Token entfernen); (4) tote Origins bereinigen; (5) Access-Strang (WARP + vw); (6) Loop-Gegentest.
-
Abh.: TP14.1/14.2 ✅. Verwandt: TP11 (CF-Tunnel-Track-B/C + Access), #1033. SSoT:
docs/cf-tunnel-mapping.md. Memoryproject_cf_tunnel_1033.
TP17 — Shelly-Übersiedelung VLAN1 → VLAN30 (IOT) + shelly-mcp ▸ ✅ WLAN+IP DURCH (22/26, 2026-07-13); Geräte-PW + cudy-Teardown offen — mcp/shelly/, Runbook docs/tp17-shelly-go-runbook.md
- ✅ GO durchgezogen 2026-07-13 (16 Shellys VLAN1→VLAN30, 0 Fehler): Pilot s26 + Welle A (s4–s9) + Welle B (s10/11/13/15/17/19/20/21/25) → alle auf
dirtyvader-iot/10.40.30.<octet>verifiziert (SSID+IP+rssi). Mit den 6 Vorab-Migrierten (s14/16/18/22/23/24) = 22/26 auf VLAN30; VLAN1-Sweep.180-250= 0 Shellys. Offen nur 4 saisonal ausgesteckte (s1/s2/s3/s12 → beim Einstecken). - 🔧 Anker-Verfahren (User-Idee, statt sta1-Backup): je Gerät vor dem sta-Write die geräteeigene AP-Funktion aktiviert (
WiFi.SetConfig ap.enable— Firmware verlangt WPA2, kein offenes AP → PSK=IOT-PSK, live/kein Reboot) = Notanker, falls VLAN30-Join scheitert (Gerät bleibt überShelly*-<mac>-AP erreichbar, kein physischer Reset). Nach Verify alle 22 AP-Anker wiederdeanchort. Runner:mcp/shelly/migrate.py(migrate/deanchor/auth/table, Dry-Run default, stoppt bei erstem Fehler, reuseddiscover.py). - ✅ HA-Cross-Check nach Batch: einzige
unavailableShelly-Entities = s12 (saisonal aus) — alle 22 migrierten reconnecten via mDNS/zeroconf (TP7-Repeater vlan30↔vlan20-HA) auf neuer.30.x-IP, Entity-IDs unverändert (keyt per MAC). Inventarinventory/bf.csv.41→.30 nachgezogen (22 Zeilen, Section→IOT). - ⚠️ Coverage-Flag:
s4 kueche_mikrowelleverbindet mit rssi −93 (Metallgehäuse), hat aber verifiziert — grenzwertig, im Auge behalten. s7 Tiefkühl −85. Rest gut (−26…−81). - ✅ Eco-Mode-Policy (2026-07-13, PROVISORISCH): eco senkt CPU-Takt + WiFi-TX-Leistung → eco AN für RSSI ≥ −80 (Energie-Win, TX irrelevant), eco AUS für < −80 (Uplink-Headroom): s4/−91, s7/−88, s17/−81, s18/−79…−82, s19/−86 → 17× ON / 5× OFF, live via
Sys.SetConfig device.eco_mode(kein Reboot). s4 (Küchen-Sockel/Metall, −91, fix) bewusst eco-OFF = schwächster Link. ⏳ 2. Eval nötig nach TP3.3 (WLAN-Ausrichtung/Aufbau ändert RSSI → Grenzfälle neu bewerten; User 2026-07-13). - ✅ HA-Referenz http vs https geklärt (2026-07-13): HA speichert
configuration_urlfür alle 22 Shellys bereitshttp://10.40.30.x:80(Integration korrekt + neue IPs übernommen). Das „https" ist client-seitig (Mixed-Content-Upgrade, wenn HA selbst über https/Tunnel geöffnet) — kein HA-Fix möglich/nötig, Shelly-SSL bewusst NICHT (CPU/Energie, IoT-Netz). ⚠️ Rand-Fund: 1 HA-Shelly-Device zeigt auf10.95.10.206(Fremd-Subnetz, nicht BF) → separat prüfen. - ⏳ NOCH OFFEN: (1) einheitliches Geräte-PW → zurückgestellt als #TP17.2 (Kosmetik, User 2026-07-13). (2) Nicht-Shelly-Mover + cudy-Teardown + VLAN1-Client-Retirement → eigener aktiver TP19 (nächste Priorität, User 2026-07-13). (3) DNS/ip-plan Restfeinschliff (mit TP19).
TP17.2 — einheitliches Geräte-Passwort (Shelly SetAuth) ▸ ⏸️ ZURÜCKGESTELLT (Kosmetik, User 2026-07-13)
- Was: je Gerät
Shelly.SetAuth(Useradmin, realm-individuellerha1= sha256("admin::"), einheitliches Klartext-PW) viamcp/shelly/migrate.py auth --go.SHELLY_DEVICE_PWliegt inmcp/shelly/.env(gesetzt, len 13). Runner + Digest-Auth-Fallback in_rpcfertig. - Warum zurückgestellt: rein kosmetisch/Härtung; bricht die HA-Shelly-Integration, bis pro Config-Entry (22×) das Credential neu eingetragen ist → disruptiv, kein Mehrwert im abgeschotteten IOT-VLAN. Erst nach dem Netz-Teardown (TP19) neu bewerten.
- Ziel: ~26 Shellys (aktuell untagged VLAN1
10.40.41.2xx, weil auf alt-WLAN cudy, s. TP3.1/project_vlan1_dhcp_incident) auf SSIDdirtyvader-iot(VLAN30,w2-iot, WPA2/WPA3-mixed, PSK74c9L283$669) umklemmen → DHCPdhcp-v30/pool-v30 (live). Kein netzseitiger Move möglich (anderes WLAN) → per-Gerät WiFi-Reconfig. - User-Entscheide (2026-07-11): (1) volles
shelly-mcpbauen (reusable, nicht nur Skript); (2) Pilot 2–3, dann Rest; (3) DHCP-Reservierungen je MAC in VLAN30 (stabile IPs für HA/ioBroker/DNS). - ✅ Recon durch (
mcp/shelly/discover.py, read-only /shelly-Sweep): 16 live, alle Gen3/Gen4 (uniforme RPC-APIWiFi.SetConfig, auth=off — kein Gen1-Sonderfall). 10 „offline" = weihnachten_* (s1/s2/s3, saisonal ausgesteckt Juli) + s12/s14/s16/s18/s22/s23 (aus/DHCP-drift). ⚠️ Inventar-Fix: s6 (kueche_kuehlschrank,.213) MAC falsch erfasst (0c:72:74:36:90:9e) → reald0:cf:13:d8:18:fc. s24 hat gar keine MAC. - Mechanismus je Gerät: Gen2+ RPC
WiFi.SetConfig {sta:{ssid,pass,enable}}→ Reboot → landet.30.x. ⚠️ Risiken: falsches PSK → AP-Mode (physischer Reset); Gerät kurz offline; HA/ioBroker-Refs brechen bis re-pointed; WPA3-mixed ggf. zickig auf alter FW; ap1 2,4-GHz-Masterwifi2running:false→ Coverage v.a. via ap2 prüfen. - ✅ Live-Abgleich 2026-07-11 (go-ready): (a)
shelly-mcp(server.py) fertig — discover/get/set_sta/verify/reservation_plan, PSK in.envgesetzt (noch nicht als MCP registriert, optional). (b) Alle VLAN30-DHCP-Reservierungen liegen (.30.2xx, Oktett erhalten, außerhalb Pool.100–.200); s6-Reservierung.30.213MAC gefixt (falsch0C:72…9E→ realD0:CF:13:D8:18:FC). (c) IOT-SSID live verifiziert: ap1w2-iotrunning:true, 8 Clients −26…−68 dBm (ap1-wifi2-„running:false" ist kosmetisch). (d) Migration bereits ~5/26 durch: s14/16/18/22/23 seit ~2,5 d stabil auf reservierten.30.221/.223/.225/.202/.203(+.30.204unbekannt, evtl. s24) → Pilot faktisch bestanden. - ✅ HA-Cross-Check 2026-07-11 (alle IPv4-Geräte in HA): Shellys deckungsgleich;
.30.204= Shelly „Bad/Spiegelschrank" (Plus RGBW PM,14:33:5c:d8:2d:7c) = vmtl. s24 → 6 statt 5 schon migriert. Netzweite Aufstellung + VLAN1-Leerstand-Analyse im Runbook: nach TP17 + pve-Host→VLAN20 + Christophs Endgeräte→VLAN10 ist VLAN1 endgeräte-frei; es bleiben nur Switch-/AP-Mgmt (sw1/sw2/ap2 → VLAN99-Cutover, eigener Schritt) + 1 unidentifiziertes Gerät.41.246(morgen klären). Nicht-Shelly-VLAN30-Mover (User-bestätigt): ✅ SwitchBot floor-lamp.41.184+ ✅ Twinkly-Girlande.30.228(beide 2026-07-16 übersiedelt, s. TP19) + Creality Ender (fehlt noch, off). Withings schon übersiedelt; Tasmota existiert nicht mehr (kein aktives Gerät → stale HA-Eintrag). EOS-Smartwatches/eBook-Reader später + von Christoph selbst (eBook eher VLAN50). - Scope-Erweiterung (User 2026-07-11): je Gerät 3 Änderungen — WLAN→
dirtyvader-iot+ IP (.41.2xx→.30.2xx) + einheitliches Geräte-Passwort (Shelly.SetAuth, Useradmin, realm-individueller ha1 → Toolset_authinserver.pynachrüsten). PW entschieden: eigenes Shelly-Admin-PW (getrennt vom WLAN-PSK) →SHELLY_DEVICE_PWin.env(Christoph liefert Wert). HA-Entities unverändert (keyt per MAC). HA-Entities bleiben unverändert (HA keyt per MAC). Projektion TP17.1 (experimentell, nachrangig): Gen4 (~11 St.) auf Thread/Matter flashen (Firmware-Verfügbarkeit + Thread-Border-Router offen) — Konflikt mit „Entities unverändert" (Matter = neue Entities) → erst WiFi-Migration stabilisieren. - ✅ Reservierungs-/Pool-Konvention (User 2026-07-11): alle Shellys bekommen statische IP (
10.40.30.<octet>, gw/dns.30.1) + in-pool DHCP-Reservierung als Backup.pool-v30auf.100-.250erweitert (Reservierungen jetzt in-pool);set_staaufstatic=trueumgestellt; s24-Inventar +.30.204-Reservierung angelegt. Vollständiger HA-MAC-Scan: 2 verpasste Media-Geräte Apple TV 4K + Philips TV (aus, → VLAN40) — vor cudy-Abschuss VLAN verifizieren; Apple TV = vmtl. Thread-Border-Router (TP17.1)..41.246/.247 = cudy1/cudy2(Teardown-Ziele). Tasmota bestätigt tot. - Offene Schritte (morgen, „nur noch go", Runbook
docs/tp17-shelly-go-runbook.md): die 16 verbliebenen VLAN1-Shellys (s4–s11, s13, s15, s17, s19–s21, s25, s26 auf10.40.41.2xx) perWiFi.SetConfig→dirtyvader-iotumklemmen (Batch, je Gerät.30.xverifizieren) → Geräte-PW setzen → HA/ioBroker-Re-Point → SwitchBot/Tasmota/3. Nicht-Shelly → saisonale s1/s2/s3/s12 beim nächsten Einstecken → cudy-Alt-WLAN abbauen → DNS/Inventar/ip-plannachziehen. - Abh.: SSID/VLAN30 (TP3/TP4 ✅), DHCP-v30 ✅. Verwandt:
project_vlan1_dhcp_incident(cudy-Rest-Leak), TP5 (IOT-Firewall danach). Memoryproject_shelly_migration_tp17.
TP18 — Souveräner Objektspeicher (Garage, Multi-Site, S3-Cold-Tier) ▸ 🔜 KONZEPT (2026-07-12)
- Auslöser: 9-TB-Syno-Backup-Volume zu 2/3 voll; reine Daten ~3 TB, Tendenz steigend, „schlagartiger" Bedarf nicht ausgeschlossen. „Wenn skalieren, dann jetzt Syno-Nachfolger mitdenken."
- Kriterien (User-priorisiert): (1) keine Fremd-Abhängigkeit / kein Cloud-Lock-in (Cloud-Opex abschreckend); (2) Multi-Site BF/FM/DW; (3) HA (Standort-Verlust überlebbar); (4) billig/teuer trennen — Variante „kalt = Objektspeicher, heiß = lokal" genügt (kein Hot/Cold innerhalb des Stores nötig); (5) horizontal + vertikal skalierbar; (6) S3-API als Branchenstandard, den jedes Backup-Tool spricht.
- Entscheid Engine = Garage (Deuxfleurs, Rust): einziger Kandidat, der geo-verteilt über offenes Internet/WAN latenztolerant ist (CRDT-Metadaten, eventually consistent) → passt aufs 3-Keller-Modell BF/FM/DW. Ceph verworfen (will Sub-ms-LAN, Single-Cluster-über-WAN = Anti-Pattern; zu schwer, ~1 GB RAM/TB). MinIO (AGPL + Console/Feature-Abbau 2025) und SeaweedFS (kann Hot/Cold + Erasure-Coding, aber komplexer, Multi-Site async) = Fallback, falls später feingranulares Tiering / EC-Effizienz bei zweistelligen TB dominant wird.
- Entscheid Disk-Layout = JBOD, KEIN RAID. Redundanz gehört in eine Schicht: Garage RF=3 über 3 Sites ist die Redundanz. RAID 1 darunter = Doppelt-Bezahlen (3 Sites × 2 Mirror = 6× roh für 1× nutzbar, absurd). RAID 0 verworfen (1 Platte tot = ganzer Node-Rebuild über WAN). JBOD = jede Platte eigenes Garage-Data-Dir (v1 Multi-HDD): Failure-Domain = 1 Platte, Rebuild nur deren Anteil, kein Kapazitätsverlust. Merksatz: distributed store = „just a bunch of disks", Redundanz ausschließlich über die Sites.
- Was man dafür bezahlt: Plattentod triggert Re-Replikation über WAN (durch Upload-BW gedeckelt). Bei ~3 TB/Site tolerabel; wenn Bedarf „schlagartig" auf zweistellige TB springt → mehr/kleinere Platten (Blast-Radius) oder 4. Node, ggf. Wechsel auf SeaweedFS-EC.
- Dimensionierung (Planungsanker 10 TB nutzbar; heute 3 TB unique / 6 TB Backup-used): RF=3 → 30 TB roh gesamt = 1 volle Kopie ~10 TB/Site (provisionieren ~16 TB roh/Site: 2 Platten = halber Blast-Radius + Headroom). Linear skalierend.
- Kostenmodell (Annahmen: HDD neu CMR ~€18/TB · recert ~€10/TB · Strom €0,25/kWh · Lean-Node Mini-PC/pve 12 W + 2 HDD ~20–28 W):
- Capex kumulativ (3 Sites): Platten €540 (recert) – €900 (neu) + Nodes €400 (BF=pve €0; FM/DW je Mini-PC
€200) = **€600–1.300**. Vergleich: ein resilienter Syno-Nachfolger für 10 TB = €1.000–1.600 capex ohne Geo-HA → Garage-3-Node gleich teuer/billiger mit HA. - Opex kumulativ: ~€135–185/J Strom — aber getrennt gerechnet: FM/DW laufen über fremde Zähler, auf Christophs Zähler landet nur der BF-Node ≈ €50–60/J (Gegenleistung: er hostet deren Kopie, reziprok wie TP16).
- JBOD-vs-RAID1-Ersparnis: Strom bloß €9–22/J (Christophs Zähler) → kein Entscheidungsgrund; der Hebel ist Capex ~€900 (nicht gekaufte Spiegelplatten) + architektonische Korrektheit. (Reicht nicht für ein BW-Upgrade €120–240/J, taugt aber als Seed für HW-Rückstellungen.)
- Capex kumulativ (3 Sites): Platten €540 (recert) – €900 (neu) + Nodes €400 (BF=pve €0; FM/DW je Mini-PC
- Konzeptioneller Bruch (Syno-Nachfolger): Kein großes resilientes NAS mehr nötig — die kollektive 3-Site-Redundanz ist die Garantie. Syno-Rolle splittet: Hot/SMB/VM-Disks bleiben lokal (Syno oder ZFS auf pve, klein/schnell); Backup/Cold wandert in Garage über BF/FM/DW → das 9-TB-Volume wird aufgelöst statt ersetzt (aus 1 SPOF werden 3 geo-redundante Kopien). Backup-Tool (restic/Kopia) sprechen S3 nativ.
- Impacts auf Bestand (Kurz): (a) Storage-Redundanz-Philosophie kippt — weg von SHR/RAID pro NAS, hin zu 3× JBOD; (b) Backup-Kette Hyper-Backup/SMB → S3-Bucket umstellen; (c) Container-Host-System (TP14) kriegt Garage als LXC/Container je Site, aber auf rohen Platten, nicht auf bestehenden SHR-Volumes; (d) Upload-BW wird Durchsatz-/Rebuild-Limit; (e) HW-Planung verzahnt mit TP15 (Node-HW, DC-USV, pve-Standort), FM/DW brauchen je 1 Node.
- Startpfad (inkrementell/reversibel): ① BF zuerst — Garage-Container auf pve, 2 HDDs JBOD, Backups lokal auf Bucket (sofort Nutzen, noch keine Redundanz). ② FM/DW nachziehen (Mini-PC + 2 Platten), RF→3, ab jetzt geo-redundant+HA. ③ Syno entlasten (Backup-Last abgeben).
- Offen (Modell scharfstellen): realer Strompreis; ob FM/DW eigene Nodes stellen oder Christoph HW hinstellt; Backup-Tool-Wahl (restic vs Kopia); ob heißes Zeug künftig auf ZFS/pve statt Syno.
- Abh.: TP10 (WG-Multi-Site = Transport, Upload-BW-Constraint), TP14 (Container-Hosts), TP15 (Node-HW/USV), Muster von TP16 (reziprokes Per-Host-HA). Kein Blocker für laufende TPs. SSoT dieser Session.
TP19 — cudy-Teardown + VLAN1-Client-Retirement ▸ ⏳ WEIT FORTGESCHRITTEN (Live-Sweep 2026-07-16: VLAN1 faktisch schon fast leer) — docs/tp19-vlan1-cudy-teardown-runbook.md
- ⚠️ Eskaliert 2026-07-15: der unter TP3.1 dokumentierte VLAN1-Leak tritt jetzt auch auf ap1/
dirtyvader-mainauf — die ap-seitige Interim-Härtung (TP3.1) mildert das Symptom, die endgültige Lösung ist hier, TP19: VLAN1 physisch weg = kein Leck mehr möglich. Das erhöht die Dringlichkeit dieses TPs, verschiebt aber keinen Scope hierher. - 🟢 cudy-Stand (User 2026-07-16): cudy1 (
.41.246) auf10.40.10.246umgehängt — bewusst kein Abbau-Ziel mehr, dient als Standalone-WLAN-Sender während der Umstellungsphase (nicht Teil des Teardowns, extern vom User selbst umkonfiguriert). cudy2 (.41.247) wird nicht mehr reaktiviert — faktisch tot, ARP-Sweep bestätigt keine Präsenz mehr auf VLAN1. B2.2 („cudy1/cudy2 stromlos/Reset/ausbauen") ist damit erledigt/gegenstandslos (cudy2 aus, cudy1 schon migriert statt abgebaut). - 🟢 Live-Sweep 2026-07-16 (ap1, vor geplantem Teardown): VLAN1 ist bereits viel weiter zurückgebaut als dokumentiert:
defconf/pool-v1-DHCP-Server ist bereitsdisabled=yes(Export bestätigt) — B2.4 („defconf zurückziehen") ist de facto schon erledigt, Ursprung/Zeitpunkt dieser Änderung nicht aus dieser Session bekannt (nicht in dieser Doku protokolliert).- ARP auf
bridge(VLAN1): nur noch 2 „reachable"-Hosts —sw1(.41.11, by design, bleibt bis MGMT-VLAN99) undpve-Interim-Fallback (.41.100) (B1.5-Aufräumziel, noch offen — Host-seitige Änderung auf pve, nicht Router). Alle anderen ~20 ARP-Einträge sind stale/„failed" (Cache-Reste längst migrierter Hosts wie macmini/.20.167, NAS/.20.10, grafana/.20.109 etc.), keine aktive Kommunikation mehr. - B1.1 MacBook (Claude-Sandbox-Client) bereits sicher migriert: aktive DHCP-Leases nur noch auf
dhcp-v20(10.40.20.101) unddhcp-v10(10.40.10.187), keinedefconf-Lease mehr. ⚠️ Dual-Homed über 2 VLANs gleichzeitig (project_dual_homing_slowness_incident-Muster) — funktional ok, aber im Auge behalten. - B1.2 unidentifizierte Geräte
.41.133/.41.198: kein ARP-Eintrag mehr vorhanden — entweder migriert oder abgeklungen, gelten für den Teardown als nicht mehr blockierend. - ⚠️ B1.3 (Media→VLAN40) und B1.4 (saisonale Shellys) nicht in diesem Sweep verifiziert — weiterhin offen, kurz vor dem finalen Cutover gegenchecken.
- Backup-Stand vor Cutover (2026-07-16): nur ap1 gesichert (Binary
bf-ap1-pre-vlan1-teardown-20260716.backupauf dem Router + lokaler Exportrouteros/state-backups/ap1-export-20260716-pre-vlan1-teardown.rsc). ap2 nicht gesichert, aber unkritisch: bewusst ausgesteckt (User-bestätigt 2026-07-16, kein Ausfall) — kein Backup nötig, solange es aus bleibt. sw1 nicht per Telnet gesichert (claudecode-Login 2× deterministisch abgelehnt), aber kein Blocker: User macht sw1-Änderungen ohnehin direkt im UI/CLI selbst (effizienter als über den Claude-Runner, gemeinsame Entscheidung) — Telnet-Automation für sw1 ist hier kein Muss. - Ziel (Kapstein der Segmentierung, s. Zeile 27): altes cudy-WLAN weg + VLAN1 als Client-Netz stilllegen (
defconf/pool-v1-Client-DHCP zurückziehen, ✅ bereits disabled). Nicht VLAN1 komplett: Switch-/AP-Mgmt (sw1.11/sw2.12/ap2.2) bleiben by design in VLAN1 (statisch, kein DHCP nötig) bis zum separaten MGMT-VLAN99-Cutover (eigener TP).cudy1/cudy2 =— cudy1 migriert auf.41.246/.247(Teardown-Ziele).10.246(Reuse statt Abbau), cudy2 tot/nicht reaktiviert (s.o.). - 🎯 User-Gate (Update 2026-07-14): Shelly ist wieder da (kein Blocker mehr) — SwitchBot ist KEIN Prereq mehr, funktioniert laut User erst NACH VLAN1-Retirement (Reihenfolge ggü. 2026-07-13 umgedreht) → wandert in die Teardown-Nachlese. TP19 damit direkt startbereit. Twinkly nebenher (saisonal).
- Verlorene Shelly — IDENTIFIZIERT via HA 2026-07-13 (User-Hinweis „du siehst ihn im HA"): HA-Device
shellyplugsg3-e4b063e41ab8, Modell = Shelly Plug S Gen3, MACe4:b0:63:e4:1a:b8, HA-device_id7a21e8f3349e6660f8b35974fc989a7b. NICHT im 26er-Inventar (Spare/Küchen-Steckdose, die Christoph beim Einrichten verbockt hat; er nannte sie „küche s20", aber s20=98:a3:16:7c:5f:ecläuft sauber auf.30.206— Verwechslung). KEIN AP-Mode, nicht tot: assoziiert am Altnetzelektrosmog.c(cudy → untagged VLAN1-L2), aber mit bogus-IP10.95.10.206(Fremd-Subnetz, User-Fehler) → unrouting-bar, daher weder in VLAN1/30-Sweep noch normal per IP erreichbar, aber per MAC in HA/WiFi-Table sichtbar. Der.219/s12-Verdacht war Sackgasse (s12 nur saisonal aus). - Update 2026-07-14: Shelly wieder da (User-Meldung) — Live-Status (noch bogus-IP
10.95.10.206oder inzwischen normal erreichbar?) zu Sessionbeginn per HA/ARP verifizieren; Recovery-Plan unten ggf. obsolet, falls sich das Gerät selbst erholt hat. - Recovery-Plan (falls beim Verify noch nötig): ap1 bekommt temporäre Zweit-IP
10.95.10.1/24auf der Bridge →10.95.10.206per L2 erreichbar → einWiFi.SetConfig {sta: ssid=dirtyvader-iot, pass=IOT-PSK, static, ip=10.40.30.<frei>}+Shelly.Reboot→ Gerät kommt auf VLAN30 hoch → temp-IP entfernen. Danach.30.x-Reservierung + Inventar (MACe4:b0:63:e4:1a:b8) + eco-Policy. Umgeht die „blutige Nase" (IP am Gerät ändern während man drauf hängt = Verbindungsverlust) — vom Router aus in einem Rutsch. Christophs manueller Direkt-Versuch (AP-IP auf 10.40.30 „verdrehen") war genau deshalb gescheitert. - ✅ SwitchBot floor-lamp
.41.184(b8:f8:62:09:f2:04) → erfolgreich auf VLAN30 übersiedelt (2026-07-16, Christoph via App/BLE), Res..30.227.
- Verlorene Shelly — IDENTIFIZIERT via HA 2026-07-13 (User-Hinweis „du siehst ihn im HA"): HA-Device
- Prereqs-Status (live nachgezogen 2026-07-16, s. Live-Sweep oben):
- ✅ Christophs Endgeräte → VLAN10/20 erledigt: MacBook-Air (
c0:c7:db:de:71:be, Claude-Sandbox-Client) hat aktive Leases nur noch aufdhcp-v10/dhcp-v20, keinedefconf-Lease mehr. iPhone.41.186nicht im aktuellen Sweep erneut geprüft (zuletzt off/asleep) — kurz vor Cutover gegenchecken. - ✅ 2 unidentifizierte VLAN1-Geräte (
.41.133/.41.198) aus dem ARP verschwunden — kein aktueller Eintrag mehr, gelten als nicht mehr blockierend (entweder migriert oder abgeklungen). - ⏳ Media → VLAN40 weiterhin offen: Apple TV 4K + Philips TV nicht in diesem Sweep verifiziert.
- ⏳ Saisonale Shellys s1/s2/s3/s12 weiterhin offen — nicht blockierend, kann übersprungen werden (Re-Onboarding-Aufwand akzeptiert).
- ⏳ pve-Interim-IP
.41.100weiterhin aktiv/reachable — Host-seitiger Cleanup auf pve selbst noch offen (nicht Router-Config).
- ✅ Christophs Endgeräte → VLAN10/20 erledigt: MacBook-Air (
- Teardown-Sequenz (angepasst an den Live-Stand): VLAN1-Client-Sweep ist schon fast leer (nur sw1-Mgmt + pve-Interim reachable) →
defconf/pool-v1 ist bereits disabled → cudy-Abbau entfällt (cudy1 umgenutzt statt abgebaut, cudy2 tot) → ✅ SwitchBot + Twinkly erledigt (2026-07-16) → verbleibt: Media-Check (B1.3), pve-.41.100abräumen (B1.5), Interim-Krücken bewerten (ap2frame-types=admit-only-vlan-tagged,st-main rrm/wnm), Inventar/ip-plan/DNS.41→Zielfinal. - Abh.: TP14 ✅ (Hosts raus aus VLAN1), TP17 ✅ (Shellys raus). Verwandt:
project_vlan1_dhcp_incident(cudy-Dual-DHCP-Leak), TP5 (Deny-by-default danach sauberer). SSoT hier +docs/tp19-vlan1-cudy-teardown-runbook.md. Folge: TP19.1.
TP19.1 — VLAN99-MGMT-Cutover (sw1/sw2/ap2-Mgmt VLAN1 → VLAN99) ▸ ⏳ ap1-Teil ✅, ap2 auf Nautobot vertagt, sw1/sw2 offen (Stand 2026-07-16)
- Scope: die einzigen Dinge, die TP19s Hauptteil bewusst in VLAN1 belässt — sw1 (
.41.11), sw2 (.41.181), ap2-Mgmt (.41.2) — auf VLAN 99 (MGMT,10.40.99.0/24) umziehen. Erst danach ist VLAN1 wirklich komplett weg, nicht nur als Client-Netz. - User-Entscheid (2026-07-16): kein eigenständiges TP-Nummer — bewusst als Unterpunkt von TP19 geführt („VLAN1 killen"), nicht als TP22 o.ä.
- ✅ ap1-Teil erledigt (2026-07-16): ap1 brauchte keinen funktionalen Umzug (vlan99-Interface/GW
.99.1läuft schon seit TP4) — nur der kosmetische DNS-Static-Nachtragap1.bf.lan10.40.41.1→10.40.99.1war offen, per MikroMCP erledigt (dry-run→apply,manage_dns_entry). - 🔜 ap2-Teil bewusst vertagt (User-Entscheid 2026-07-16): erst NACH Nautobot (TP21). Nautobot übernimmt dann in einem Rutsch ap1 + ap2 + die neuen CRS326-Switches (TP15) als config-as-code-Fleet — der ap2-Mgmt-VLAN-Umzug wird also nicht mehr isoliert von Hand gemacht, sondern Teil der Nautobot-Erstadoption.
ap2.bf.lan-DNS-Static bleibt bewusst auf10.40.41.2bis dahin. - 🔒 TP19.1 war die letzte Ausnahme vom ap1/ap2-Config-Freeze — der jetzt (2026-07-16) zur generellen Regel ausgeweitet wurde (s. Governance-Entscheid oben): jede Gerätekonfiguration künftig ausschließlich über Nautobot, keine direkten Änderungen mehr an einzelnen im Netz verstreuten Geräten. Der ap1-DNS-Fix oben war die letzte direkte MikroMCP-Write-Aktion unter der alten (engeren) Regel.
- ⏳ sw1/sw2-Teil: Status offen, hängt an der CRS326-Sequenzierung. Klickanleitungen liegen fertig vor (
switch/ui-guides/02-vlan99-mgmt-cutover.md,sw2/ui-guides/01-vlan99-mgmt-cutover.md), aber ob sie noch ausgeführt werden oder obsolet sind, hängt davon ab, wie TP15 (CRS326-Lieferung 2026-07-17) gehandhabt wird — s. TP15. - Bereits vorbereitet:
docs/ip-plan.mdPhase 2 hat schon einen Entwurf (ap2→10.40.99.2, sw2→10.40.99.12, sw1→10.40.99.11, „Lockout-Risiko, sorgsam", sw1 zuletzt). - Abh.: TP19-Hauptteil (VLAN1-Client-Retirement) — logisch danach, da VLAN99 als eigenes Mgmt-Netz erst dann wirklich nötig wird, wenn VLAN1 sonst leer ist. sw1-Teil braucht sw1-Telnet-Zugriff (User macht sw1-Changes direkt, s. Feedback-Memory) — Lockout-Risiko am größten bei sw1 (einziger Netzpfad zu sw2 hängt am Uplink).
TP20 — Platform-Datenbank (Postgres Precious-Tier + MariaDB Tier-2) ▸ 🔜 KONZEPT (2026-07-14) — Memory project_mikrotik_commit_nautobot_gc
- Auslöser: Mehrere Dienste brauchen zentrale DB (Nautobot-SoT [TP21], Vaultwarden, HA-Recorder). Grundsatzentscheid statt Nautobot-Insellösung — „wir skalieren schneller als wir schauen können" (User).
- ✅ 2-Tier (User 2026-07-14):
- Tier-1 „Platform-Postgres" (precious): EIN Postgres-Cluster, getrennte DBs für Nautobot (hier provisioniert) + Vaultwarden (Onboarding = TP20.1). PG 16 (Nautobot-Matrix-safe; Nautobot unterstützt kein MariaDB, nur PG/MySQL-8 → Postgres ist gesetzt, nicht optional).
- Tier-2 (Bestand): HA-Recorder bleibt MariaDB (Write-Churn, andere Zuverlässigkeitsklasse, single-site). (Vaultwarden liegt heute ebenfalls auf MariaDB → wandert per TP20.1 nach Tier-1.) Engine-Split fällt sauber entlang der Tier-Grenze.
- ✅ Single-Site-first (User 2026-07-14): jetzt nur BF-Primary. Nimmt das 2-Site-Quorum/Split-Brain-Problem (bräuchte 3. Witness) vom Tisch. ABER replication-ready ab Tag 1:
wal_level=replica,archive_mode=on, pgBackRest (WAL+Base) → Garage-S3 (TP18) = PITR sofort (DR auch ohne Standby) + späterer Standby =pg_basebackup, kein Primary-Umbau/Restart. - Substrat: Postgres in LXC auf pve (DB-Klasse, nicht Docker).
- Scope TP20 = Plattform: Cluster hoch, Tiering, Backup/PITR, Nautobot-DB anlegen. vw-Migration + Cross-Site-HA = TP20.1 (ausgelagert).
- Offene Sub-Steps: pgBackRest-Bucket in Garage (Abh. TP18-Startpfad ①); PG-Version final (16 vs 17); Rollen/DB-Anlage Nautobot.
- ⚠️ Neue Abh. (User 2026-07-16): TP20 (Postgres-LXC) + weitere neue Softwarepakete sollen über Komodo deployt werden, nicht mehr direkt/Portainer. Komodo hat aber aktuell keine eigene TP-Nummer — bislang nur als „Eigener Task" unter TP2 (Portainer-Ablösung, Zeile 72) und in CLAUDE.md-Tooling erwähnt. Noch zu klären: eigenes TP (z.B. TP22) heraustrennen, oder unter TP11 (Monitoring & Mgmt-Control-Plane) hängen? Bis geklärt: TP20 gilt als an Komodo-Rollout gebunden, nicht mehr eigenständig startbar.
- Abh.: TP18 (Garage-S3 für Backups — mind. BF-Node ①), Komodo-Rollout (s.o., TP-Nummer offen). Blockt TP21 + TP20.1.
TP20.1 — Vaultwarden → Platform-Postgres + Cross-Site-HA ▸ 🔜 KONZEPT (2026-07-14, ausgelagert aus TP20)
- Ziel:
vw(.20.127, heute MariaDB) auf den Precious-Tier holen und das eigentliche User-Ziel erfüllen: DB-Replikation über 2 Sites (Standort-Verlust überlebbar). - Phase 1 — Migration (single-site): vw MariaDB→Postgres (Export → Import in Tier-1-DB
vaultwarden→DATABASE_URLumstellen → verifizieren). Danach ist vw precious + im pgBackRest/PITR-Schirm von TP20. (Alternative verworfen: vw auf MariaDB lassen + MariaDB-Repl — zugunsten EINER Replikations-/Backup-Mechanik im Precious-Tier.) - Phase 2 — Cross-Site-Standby:
db-platform-standby-LXC am 2. Standort →pg_basebackup/Streaming-Replication über WG (TP10) → manuelles Promote-Runbook. Repliziert den ganzen Tier-1-Cluster (vw = HA-Ziel, Nautobot bekommt Gratis-DR-Kopie). Patroni + 3. Witness nur, falls später Auto-Failover statt manuellem Promote gewünscht. - Verwandt/Abgrenzung: vw ist auch in TP16 offen (CF-Access:
bypass→WARP-geschützt) — DB-HA ≠ Access, getrennt behandeln. Reziprokes 2-Site-Muster analog TP16/TP18. - Abh.: TP20 (Tier-1 Postgres muss stehen), TP10 (WG-Transport für Phase-2), TP18 (Backup-Schirm). Kein Blocker für TP21.
TP21 — Nautobot Golden Config (config-as-code Control-Plane) ▸ 🔜 KONZEPT (2026-07-14) — Memory project_mikrotik_commit_nautobot_gc
- Ziel: modellierter Control-Plane über den MikroTik-RouterOS-Kern: GUI-SoT + Config-Compliance/Drift + intended-config + Push. Ergänzt MikroMCP (interaktiv/Debug), ersetzt es nicht (deklarativ/DR/Compliance). Aus User-Recherche 2026-07-14: MikroTik in Golden Config erstklassig (
mikrotik_routeros+_api, Nornir/NAPALM, backup+deploy). - Scope-Grenze: RouterOS in-model = Router (ap1 heute / RB5009 künftig) + beide CRS326-Switches (RouterOS-Boot) → Golden Config deckt den ganzen Kabel-Fabric. Außerhalb bleibt nur Omada-WLAN (eigener Controller).
- Stack:
nautobot-docker-compose(Django/gunicorn + Redis + Celery worker/beat) auf Docker-Host; DB extern → Platform-Postgres (TP20); Redis lokal/ephemer; Git-Backend (backups/intended/templates) → bestehendes Gitea (project_gitea_backup_state). - PoC-Pfad: Nautobot-Stack hoch → ap1 via RouterOS-API adoptieren → Backup + Compliance/Drift an einem Gerät zeigen → dann Templates/intended für VLAN-/Firewall-Standards.
- Offen: Nautobot- + GC-App-Version; ob OpenWrt je in-model muss (custom Nornir-Dispatcher — nur relevant falls Router doch OpenWrt+cake-autorate statt RB5009).
- Abh.: TP20 (Postgres muss stehen), Gitea ✅, RouterOS-Router (ap1 heute / RB5009 TP15).
TP-R — Router-Capabilities-Sweep ▸ FERTIG (docs/research/routeros-capabilities.md)
- Leitsatz: nativ vor Container, NAS vor Router (128MB-Flash-Limit).
- Sofort nativ (~0 RAM): RoMON · Netwatch · Scheduler + Auto-Backup/Mail · SNMP→externes Monitoring · mDNS-Repeater · spectral-scan · CAPsMAN + 802.11r/k/v (Fast-Roaming statt Mesh) · Back-to-Home/WireGuard.
- Auf NAS: FreeRADIUS(+LDAP) · NPM · icinga/Grafana · CF-Tunnel.
- Weglassen: LoRa (keine HW) · OpenFlow · CALEA · ZeroTier (CPU-Fresser bis ~60 % → WireGuard) · lokales
dude. - ✏️ Korrektur Reverse-Proxy: RouterOS 7.22+ HAT einen nativen (
/ip/reverse-proxy, ACME/SNI) — aber ersetzt NPM NICHT (kein WebSocket/gRPC/Sticky, nur IPv4-Backends, TLS frisst Router-CPU) → NPM bleibt auf NAS. - Speist TP8/9/11/12.
Reihenfolge / Abhängigkeiten
🎯 AKTUELLER KRITISCHER PFAD (Stand 2026-07-16, überschreibt die Reihenfolge unten): TP18 (Garage-S3, mind. BF-Node ①) → TP20 (Platform-Postgres, jetzt zusätzlich an Komodo-Rollout gebunden, TP-Nummer offen) → TP20.1 (Vaultwarden) ∥ TP21 (Nautobot Golden Config) → danach erst TP19.1-Rest (ap2/sw1/sw2) + TP5/TP6. Grund: Governance-Entscheid „Config exklusiv über Nautobot" (s. oben) macht Nautobot zur Voraussetzung für praktisch jede weitere Router-/Switch-Änderung. Die Punkte 3-4 unten (Omada-PVID-Fix etc.) sind historisch/überholt (Omada spielt seit TP15-Korrektur keine Rolle mehr) — ganze Liste braucht mal eine Aufräum-Session, hier nur der aktuelle Fokus vorangestellt. ✅ TP16 (CF-Tunnel Round-Robin/macvlan-Host-Isolation → reziprokes 3-Tunnel-HA) KERN UMGESETZT 2026-07-10 (#1033 strukturell weg). Offen nur Access-Strang (WARP/
vw) = user-gated. As-Builtdocs/cf-tunnel-mapping.md §10.
TP1 (GE8) → TP2 (Omada Controller).✅ erledigt 2026-06-15.TP4 (Router-Cutover L3-Infra + WAN-Edge).✅ erledigt 2026-06-15 (L3) + 2026-07-01 (Edge-Cutover, FB physisch weg).- Jetzt: Omada-PVID-Fix — Omada Access-Profile korrigieren (PVID 10/20, untagNetworkIds bereinigen, sicher P3/P5/P6 zuerst), dann IP-Migration NAS/macmini/pve auf VLAN-Subnetze + DNS-Einträge updaten. IP-Migration NAS/pve = TP14 (NAS ✅ 2026-07-10, pve 🔜 Session B).
- Dann: TP5 (Deny-by-default fertigziehen — Sonos-/HA-/mDNS-Holes + WAN-Input-Seal stehen bereits; TP5.1 = DNS-Redirect + Live-Torch für Low-Trust-Geräte/Airfryer hängt dran) → TP6 (QoS/CAKE).
TP7 (mDNS)✅ 2026-07-02 (inkl. HA/vlan20),TP3 (WLAN/CAPsMAN)✅ 2026-06-18,TP3.1 (ap2-VLAN-Trunk)✅ 2026-07-01,TP3.2 (P750W/Discovery)✅ 2026-07-02,Sonos-Migration✅ 2026-07-02 (alle 10 auf VLAN 40). ⏳ TP3.3 (WLAN-Coverage-Kur) offen — Fortsetzung neue Session (docs/wifi-p750w-coverage-and-map.md). TP10 (VPN)✅ Kern durch (2026-06-27) + Edge-Cutover (2026-07-01) → DURCH. Offen nur: DDNS-Auto-Updater.- Nachgelagert/Research-getrieben: TP8 (Access), TP9 (HA), TP11 (Monitoring + CF-Tunnel-Track-B/C), TP12 (IPv6), TP13 (Spaß).
- Foundation (2026-07-14): TP15 (MikroTik-Switching / Omada-WLAN, 2× CRS326 bestellt) ∥ TP20 (Platform-Postgres, single-site replication-ready) → TP21 (Nautobot Golden Config) ∥ TP20.1 (Vaultwarden→PG + 2-Site-HA). TP20 hängt an TP18 ① (Garage-Bucket für pgBackRest).