Fehlschluss revidiert: ICMP-Häkchen ist Dashboard-only (nicht im API-Spec), aber aktiv â belegt durch funktionierenden Ping ins FM-Netz. Kein To-Do. bf-Ping-Verlust im Incident lag an QUIC-losen macmini-Connectoren (post-http2), nicht am Flag. Re-Check trotzdem nach Scharfschalten (§4.5). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
522 lines
93 KiB
Markdown
522 lines
93 KiB
Markdown
# 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 ap2 `wifi1/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 Memory `project_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 in `mcp/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âŚ`.
|
||
- â
**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, muss `nativeNetworkId=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 hat `untagNetworkIds=[VLAN1, VLAN20, VLAN10]` (3 untagged!) statt `[VLAN10]`.
|
||
Access-INFRA hat `untagNetworkIds=[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.md` als 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/.secrets` auf 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-SSIDs `install*`/`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 via `set` + 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 in `dhcp-v40`. Household geschlossen, iOS-App findet alle Geräte (mDNS via Repeater).
|
||
Inventar/IPs = SSoT `docs/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`/`infra` einstampfen (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-id` wurde 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 auf `10.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. Danach `remote-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-main` im OG â Lease muss `dhcp-v10`/`10.40.10.x`
|
||
sein (nicht `defconf`/`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`); `defconf` und `dhcp-v10`
|
||
boten parallel â `offering ... without success` + Minutentakt-Flapping. `bridge`-ARP auf ap1 = 333 Einträge (flache
|
||
VLAN1 lebt voll weiter; IoT/Shelly untagged auf `10.40.41.2xx`). **Griff:** auf ap2 die Master-Radio-Bridge-Ports
|
||
`wifi1`/`wifi2` von `frame-types=admit-all` auf **`admit-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).
|
||
`ether2` bleibt `admit-all` (VLAN1-Mgmt/Trunk, kein Lockout). **Rollback:** `frame-types=admit-all` auf 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ätzlich `st-main rrm=yes wnm=yes` (802.11k/v,
|
||
behandelt nur das Roaming-Symptom). SSoT-Detail: Memory `project_vlan1_dhcp_incident`.
|
||
- đ´ **Update 2026-07-15: gleiches Leck jetzt auf ap1 vermutet.** `dirtyvader-main`-Clients bekommen zeitweise
|
||
`10.40.41.x`-IPs statt `10.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: gleiche `admit-only-vlan-tagged`-Umstellung auf ap1s lokalen
|
||
Main-Radio-Bridge-Ports (â ď¸ NICHT `ether2` anfassen â das ist ap1s Mgmt-/WAN-Trunk-Pfad). Diagnose+Fix-Schritte:
|
||
`docs/tp19-vlan1-cudy-teardown-runbook.md` Phase 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 â feste `10.40.30.5`); **an ap1 gepinnt**
|
||
(geordnete wifi-access-list `accept w2-iot` â blanket `reject`, Ăźberlebt ap2-Re-Provision) â dozende Legacy-Clients
|
||
nur am co-located-GW ap1 per ARP erreichbar, CAP ap2 nicht; mDNS `vlan30` in `mdns-repeat-ifaces`+5353 â in MAIN
|
||
auffindbar. Druck+Selbsttest OK. Web-UI `http://10.40.30.5/general/information.html`.
|
||
- â
**Nebenbei:** `multicast-enhance=enabled` (iot+media), Guest `ft=yes`, INFRA-SSID(20) angelegt (**nur ap2**),
|
||
Steering-Profil `st-main`/`neighbor-group=bf-main` auf beide Main-Configs.
|
||
- **Nomenklatur:** dynamische ap2-CAP-Slaves (`wifi13â22`) nicht praktikabel umbenennbar (`name-format` unzuverlässig)
|
||
â Map dokumentiert statt umbenannt. Backups `bf-ap{1,2}-pre-nomen-20260702.backup`/`.rsc` auf 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-main`
|
||
auf 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:**
|
||
1. **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/scan` je AP (**stĂśrend** â wirft Clients kurz ab) gegen Abend-Congestion. Output â SSoT-Doku.
|
||
2. **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.
|
||
3. **INFRA(20) auf ap1 ergänzen** (fehlt â sendet nur auf ap2): lokaler `w2-`/`w5-infra`-Slave analog w2-/w5-media.
|
||
4. 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.1` als Bootstrap; FB-Upstream abgelÜst). Statische Einträge fßr alle Infra-Hosts unter `bf.lan` (13 Einträge, Transition-IPs bis PVID-Fix).
|
||
- â ď¸ Auto-Suffix `.lan` (RouterOS-Einschränkung, kann nicht auf leer gesetzt werden) â TP5-Cleanup.
|
||
- â
**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 im `input`-Chain, `list_firewall_rules` 2026-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 unter `bf.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_rules` 2026-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 6 `dns 1.1.1.1` als 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). `torch` auf `vlan30`/`vlan50` gefiltert auf die Geräte-IP zeigt Ziel-IPs live (Versuni â AWS `eu-west-1` IoT 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 (siehe `docs/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/5353`
|
||
auf 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/1900` auf 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 alle `unavailable`. HA sitzt **nicht** auf
|
||
VLAN 20, sondern noch auf `10.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.105`
|
||
in `configuration.yaml` (Backup `.bak-sonos-20260703`). `advertise_addr` fixt die UPnP-Event-Callbacks trotz
|
||
HA-Multi-Homing (`.105`/`172.16.0.18`/docker). Core-Restart â alle 6 Online-Zonen `idle/playing` (Wohnzimmer-Push
|
||
verifiziert = Callbacks OK). Terrasse `.198` offline = kein Entity (kommt beim Einschalten). Kurzes Flapping direkt
|
||
nach Restart = Settling, danach stabil.
|
||
- â
**Nebeneffekt:** mit `bridge` im 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/`bridge` brauchte nichts (schon via `TP10-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).
|
||
- **Offen/später:** HAâVLAN 20 (IP-Migration nach Omada-PVID-Fix) â dann nur `advertise_addr` auf 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) **und** `peer dw` (`10.95.10.0/24`, CGNAT-Dial-in) mit frischem
|
||
Handshake + Traffic. **Public-Edge direkt** â ap1 hĂśrt UDP/51821 auf `vlan100` (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/24` renumbert, FB-WG single `10.95.10.1/24`,
|
||
Keepalive 25, Endpoint `bf4âŚ:51821`. End-to-End von macmini/Linz â Gelis 24/7-APs `10.95.10.246/.247` sauber
|
||
(echte LAN-IPs, **kein `10.255.255.x`**-NAT-Leak).
|
||
- **đĄ Root Cause (FM-PoC bewiesen):** FB masqueradet WG, wenn die Interface-`Address` eine **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, Key `P/bztâŚ`, MTU 1412, keine IF-IP). Endpoint = DDNS **`bf4.emsenhuber.net:51821`**
|
||
(Cloudflare, DNS-only â Public-IP). Apply gebĂźndelt in `routeros/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.net` auf 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 **ein** `vlan20`-Macvlan (10.40.20.0/24, gw .1, parent `ovs_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_external` muss weg fßr `vlan20`) + `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); `vw` 200 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, ipvlan `parent=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.126`** alle reachable auf VLAN20 (+ Container `.20.x` populiert; `iobroker .107`/`ccu .232`/`z2m .106`/`vw .127` jetzt 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 auf `bridge` läuft noch (VLAN1 aktiv).
|
||
- â
**pve-Host-Mgmt â VLAN20 (2026-07-13):** letzter verbliebener Host-Umzug. `vmbr0` bleibt VLAN1 `.41.100` (ohne Default-Route, interim), neues `vmbr0.20` (bereits vorbereitet, aber mit kaputter `address 10.40.20.0/24` vorgefunden) korrigiert auf `10.40.20.100/24` â `ifreload -a` live (ifupdown2, kein Reboot, LXC 400 durchgehend unbeeinflusst) â Default-GW auf `10.40.20.1` geflippt. 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.lan` zeigte noch auf `.41.173` statt `.20.173`), CF-Tunnel `bf-pve` Ingress (`pve`+`j44d6tua`-SSH-Hostname .41.100â.20.100, PUT via `CF_API_TOKEN`, Smoke 200/200), CLAUDE.md, `docs/ip-plan.md`. `~/.claude.json` war 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:3306` erreichbar â), 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.json` `mcpServers.pve-mcp` NEU 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:3306` down** (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 auf `gitea_default`/172.18. Fix = Redeploy mit Disk-File `docs/nas-vlan20/stacks/111-gitea.yml` als 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. Files `docs/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** â Token `claude@pam!claude` hat kein `VM.Config.Network`; UI-Edit, dann Reboot via API mit `VM.PowerMgmt`). Portainer wandert auf `https://10.40.20.126:9443`.
|
||
- đ **Gotcha: in-Container-Iface heiĂt jetzt `veth20`, NICHT `eth0`** (UI setzte Name analog net1=veth16) â Docker `vlan20`=ipvlan **`parent=veth20`** (nicht eth0 wie im Runbook). cloudflared(host)/portainer(bridge) unberĂźhrt.
|
||
- â
**CF-Connector `db713b30` jetzt in VLAN20** (Tunnel `bf.emsenhuber.net` healthy/8 conns) = **lĂśst TP11-Track-B/C** (#1033-Zielbild). Ingress `portainer` .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:9443` HTTP 200 (LXC 400 running, net0 `veth20 tag=20 gw/ns=.20.1`), omada-mcp `.20.176`âController `.20.175` v6.2.10.17 (HTTPS :8043 200), pve-mcp `.20.173` liefert Proxmox-Config, adguard `.20.16`/`.20.17` HTTP :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`, `sessionIdGenerator` gesetzt) â 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/list` liefert `pve_*`, **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.conf` noch auf totes `.41.254` â `docker pull` ghcr.io scheitert (`EAI_AGAIN` / 5s-Resolver-Timeout; Egress zu ghcr-IP `140.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 Ăźberschrieb `resolv.conf`; Fix = Schnittstelle âDNS manuell" `10.40.20.1` (Christoph) â NAS pullt wieder direkt. **Merkregel Synology:** GUI-DNS â was `dockerd` liest (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) â Portainer `POST /endpoints/14/docker/images/load` â Stack-Redeploy `pullImage:false`. Gotcha: laufende Container frieren den `127.0.0.11`-Upstream zum Erstellzeitpunkt ein (Recreate nĂśtig; fĂźr pve-mcp egal â Proxmox per IP `.41.100`). Memory `ref_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.py` auf core(43)/openclaw(92)/openclaw2(97)/oc20260307(119)/openspeedtest(74)/speedtest_tracker(80)/technikscheiss(42) â **`.new.yml` + `.orig.yml`** in `docs/nas-vlan20/stacks/` (gitignored). **Nicht deployt** (User: âim Bedarfsfall später", Container-Zukunft ungewiss). 42/43 waren `default_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.111` in 119); **Kollision** `43-core` will `.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 static` hatte noch `nas.bf.lanâ.41.10` und `docker.bf.lanâ.41.126` **stale** â korrigiert auf `.20.10`/`.20.126` (MikroMCP `manage_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äge `omada.bf.lan`/`omada-mcp.bf.lan` entfernt 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 (ob `omada`/`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-mcp` rotieren (`POST âŚ/access/service_tokens/{id}/rotate`) â `CF_ACCESS_CLIENT_ID`/`_SECRET` in `mcp/cloudflare/.env` (chmod600). Memory `ref-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, Produktivsetzung spätestens Montag 2026-07-20 (User-Entscheid 2026-07-16).** Sequenzierung ggĂź. Nautobot geklärt: **TP20+TP21 werden bis dahin fast-getrackt** (TP18/Komodo als Blocker entfernt, s. TP20) â Ziel ist, dass Nautobot **vor** der CRS326-Produktivsetzung steht und die Switches **direkt als Nautobot-verwaltete Geräte adoptiert** werden, statt erst von Hand konfiguriert und später importiert. sw1/sw2-VLAN99-Umzug (TP19.1) läuft parallel dazu on-demand, unabhängig davon.
|
||
- **đ§ 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.md` sind 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-pve `f7fdf3a6` / bf-mm `7a322261`), 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 (`vw` bypassâgeschĂźtzt via WARP, `hass`/`ha-mcp` 400/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`/`ccu` auf 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 bereits `allow:christoph`). â ď¸ **`vw` = aktuell `bypass` (Ăś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`. Memory `project_cf_tunnel_1033`.
|
||
- â
**Incident 2026-07-16 (User unterwegs, WARP âspinnt", keine BF-IPs mehr) ⸠Public-FQDN-Teil gefixt:** macmini-Connectoren (`cloudflared-bfnas`/`-bfpve`) flappten live unter QUIC/UDP (Docker-Desktop-Bridge-NAT) â `bf-nas`/`bf-pve` von 2 auf 1 Connector degradiert (HA faktisch weg, nicht down). Fix: beide auf `TUNNEL_TRANSPORT_PROTOCOL=http2` umgestellt (rollend, 0 Downtime), wieder voll HA. Konvention: macmini-Connectoren kĂźnftig immer `http2`. **ICMP-Befund (getrennt, strukturell):** TCP Ăźber die WARP-Route ging Ăźberall, ICMP nicht (fm 36 %/bf 100 %/dw 100 % Loss) â cloudflared ist QUIC-Proxy, kein WireGuard. **Kurz als âbf-pve-Route wegen USV" notiert (Commit `1c1a676`) â REVIDIERT** (BegrĂźndung invertiert: bf-pve-Connectoren laufen auf NAS+macmini, nicht pve). Details: `docs/cf-tunnel-mapping.md §13`. **â Richtungswechsel fĂźr Private Access = TP16.1.**
|
||
|
||
### TP16.1 â Private Access via native Cloudflare Mesh (WireGuard) auf ap1 ⸠đ Konzept+Runbook fertig (2026-07-16), **Recherche verifiziert + Runbook gehärtet (2026-07-17)**, Scharfschalten = eigene Session â `docs/tp16.1-warp-mesh-native-ap1.md`
|
||
- **Trennung:** Public FQDNs bleiben auf cloudflared-3-Tunnel-HA (TP16); **Private Access** (unterwegs â `10.40.0.0/16` per IP inkl. ICMP) wandert vom cloudflared-QUIC-Proxy auf einen **nativen WireGuard-Mesh-Node auf ap1**.
|
||
- **Warum ap1-nativ:** Cloudflare Mesh spricht WireGuard, RouterOS kann natives WireGuard (TP10-Hub *ist* einer) â Mesh-Node = WG-Peer zu CF-PoP, **kein Container/TUN/LXC/neue HW**. ErfĂźllt âap1 = einziger SPOF", keine macvlan-Blindheit, ICMP nativ. RouterOS-Container-Weg tot (kein `/dev/net/tun`-Passthrough auf JEDER Router-HW) â **hAP axÂł lĂśst das nicht** (zudem Wi-Fi 6, nicht 7) â HW-Kauf vom Tunnel-Fix entkoppelt (ggf. TP15).
|
||
- **Verworfen:** WG-Roadwarrior (User will keine Extra-App/Profil je Gerät), alle Helper-Host-ZT-Anbieter (SPOF-Verletzung).
|
||
- **Warum heute nur Konzept:** TCP-Pfad funktioniert (nur ICMP-Komfort fehlt), und die CF-Prerequisites sind **account-weit** (Unique-Device-IP, Split-Tunnel-Exclude, Device-Profile) â treffen Live-WARP-Geräte (1Ă kurzer Reconnect) â nicht unter Zeitdruck.
|
||
- **Nächste Session:** Plan-Probe `POST warp_connector` (Free-Plan-Gate; sonst LXC-Fallback) â account-weite Prereqs â `wgcf-connector`-TokenâWG-Config â 4 WG-Zeilen auf ap1 â Subnetz-Route + vnet-Route `5546dcb6âŚ` von bf-pve umhängen (Rollback trivial) â Verifikation (Ping verlustfrei). Team-Domain `emsenhuber.cloudflareaccess.com`. â ď¸ Governance âConfig nur via Nautobot" â ap1-Zeilen via GC oder genehmigte Ausnahme.
|
||
- â
**Recherche-Härtung 2026-07-17 (Primärquellen animmouse + offizielle CF-Docs + OpenAPI-Spec, alles verifiziert):** (1) Produkt heiĂt seit 2026-04-14 offiziell **Cloudflare Mesh** (API-Pfade bleiben `warp_connector`, im Spec bestätigt inkl. Token- und sogar HA-Endpoints); (2) ICMP-Proxy ist **bereits AN** (User-Korrektur: fm-Ping `10.101.0.0/24` beweist es â kein To-Do; mein âfehlt" war ein Fehlschluss aus dem API-Spec, das Flag ist Dashboard-only); (3) Split-Tunnel-Exclude auf **beiden** Device-Profilen (Default + Mesh); (4) **vnet-Gotcha** beim Route-Umzug (âvirtual networks only for cloudflared") â Weg A PATCH, Weg B DELETE+POST dokumentiert; (5) **v4-only-Entscheid** (Mesh-IPv6-site-to-site laut Guide broken, NAT66-Gefrickel nicht nĂśtig); (6) keepalive 1m statt 25s ok. Alles in `docs/tp16.1-warp-mesh-native-ap1.md` §2/§4 eingearbeitet â **Runbook ist jetzt ausfĂźhrungsreif fĂźr die Delegations-Session.**
|
||
- Abh.: TP16 â
(Public-Teil), TP10 â
(WG-Grundmuster auf ap1). SSoT: `docs/tp16.1-warp-mesh-native-ap1.md`, `docs/cf-tunnel-mapping.md §14`.
|
||
|
||
### 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 Ăźber `Shelly*-<mac>`-AP erreichbar, **kein physischer Reset**). Nach Verify alle 22 AP-Anker wieder `deanchor`t. Runner: `mcp/shelly/migrate.py` (`migrate`/`deanchor`/`auth`/`table`, Dry-Run default, stoppt bei erstem Fehler, reused `discover.py`).
|
||
- â
**HA-Cross-Check nach Batch:** einzige `unavailable` Shelly-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). Inventar `inventory/bf.csv` .41â.30 nachgezogen (22 Zeilen, SectionâIOT).
|
||
- â ď¸ **Coverage-Flag:** `s4 kueche_mikrowelle` verbindet 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_url` fĂźr **alle 22 Shellys bereits `http://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 auf `10.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` (User `admin`, realm-individueller `ha1` = sha256("admin:<device-id>:<pw>"), einheitliches Klartext-PW) via `mcp/shelly/migrate.py auth --go`. `SHELLY_DEVICE_PW` liegt in `mcp/shelly/.env` (gesetzt, len 13). Runner + Digest-Auth-Fallback in `_rpc` fertig.
|
||
- **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 SSID **`dirtyvader-iot`** (VLAN30, `w2-iot`, WPA2/WPA3-mixed, PSK `74c9L283$669`) umklemmen â DHCP `dhcp-v30`/pool-v30 (live). **Kein netzseitiger Move mĂśglich** (anderes WLAN) â per-Gerät WiFi-Reconfig.
|
||
- **User-Entscheide (2026-07-11):** (1) **volles `shelly-mcp`** bauen (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-API `WiFi.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`) â real **`d0: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-Master `wifi2` `running: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 `.env` gesetzt (noch nicht als MCP registriert, optional). (b) **Alle VLAN30-DHCP-Reservierungen liegen** (`.30.2xx`, Oktett erhalten, auĂerhalb Pool `.100â.200`); **s6-Reservierung `.30.213` MAC gefixt** (falsch `0C:72âŚ9E` â real `D0:CF:13:D8:18:FC`). (c) **IOT-SSID live verifiziert:** ap1 `w2-iot` `running: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.204` unbekannt, 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`, User `admin`, realm-individueller ha1 â Tool `set_auth` in `server.py` nachrĂźsten). **PW entschieden: eigenes Shelly-Admin-PW** (getrennt vom WLAN-PSK) â `SHELLY_DEVICE_PW` in `.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-v30` auf `.100-.250` erweitert (Reservierungen jetzt in-pool); `set_sta` auf `static=true` umgestellt; 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 auf `10.40.41.2xx`) per `WiFi.SetConfig`â`dirtyvader-iot` umklemmen (Batch, je Gerät `.30.x` verifizieren) â 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-plan` nachziehen.
|
||
- Abh.: SSID/VLAN30 (TP3/TP4 â
), DHCP-v30 â
. Verwandt: `project_vlan1_dhcp_incident` (cudy-Rest-Leak), TP5 (IOT-Firewall danach). Memory `project_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.)
|
||
- **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-main` auf â 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`) auf `10.40.10.246` umgehä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 bereits **`disabled=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) und **`pve`-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`) und `dhcp-v10` (`10.40.10.187`), keine `defconf`-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.backup` auf dem Router + lokaler Export `routeros/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 = `.41.246`/`.247` (Teardown-Ziele)~~ â cudy1 migriert auf `.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**, **MAC `e4:b0:63:e4:1a:b8`**, HA-device_id `7a21e8f3349e6660f8b35974fc989a7b`. **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:ec` läuft sauber auf `.30.206` â Verwechslung). **KEIN AP-Mode, nicht tot:** assoziiert am **Altnetz `elektrosmog.c`** (cudy â untagged VLAN1-L2), aber mit **bogus-IP `10.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.206` oder 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/24` auf der Bridge** â `10.95.10.206` per L2 erreichbar â **ein** `WiFi.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 (MAC `e4: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`.
|
||
- **Prereqs-Status (live nachgezogen 2026-07-16, s. Live-Sweep oben):**
|
||
1. â
**Christophs Endgeräte â VLAN10/20 erledigt:** MacBook-Air (`c0:c7:db:de:71:be`, Claude-Sandbox-Client) hat aktive Leases nur noch auf `dhcp-v10`/`dhcp-v20`, keine `defconf`-Lease mehr. iPhone `.41.186` nicht im aktuellen Sweep erneut geprĂźft (zuletzt off/asleep) â kurz vor Cutover gegenchecken.
|
||
2. â
**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).
|
||
3. âł **Media â VLAN40 weiterhin offen:** Apple TV 4K + Philips TV nicht in diesem Sweep verifiziert.
|
||
4. âł **Saisonale Shellys s1/s2/s3/s12 weiterhin offen** â nicht blockierend, kann Ăźbersprungen werden (Re-Onboarding-Aufwand akzeptiert).
|
||
5. âł **pve-Interim-IP `.41.100` weiterhin aktiv/reachable** â Host-seitiger Cleanup auf pve selbst noch offen (nicht Router-Config).
|
||
- **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.100` abräumen (B1.5), Interim-KrĂźcken bewerten (ap2 `frame-types=admit-only-vlan-tagged`, `st-main rrm/wnm`), Inventar/`ip-plan`/DNS `.41âZiel` final.
|
||
- 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 â
, sw2 â
, ap2 auf Nautobot vertagt, sw1 offen (Stand 2026-07-16)
|
||
- **Scope:** die einzigen Dinge, die TP19s Hauptteil bewusst in VLAN1 belässt â sw1 (`.41.11`), sw2, 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.1` läuft schon seit TP4) â nur der kosmetische DNS-Static-Nachtrag `ap1.bf.lan` `10.40.41.1`â`10.40.99.1` war offen, per MikroMCP erledigt (dry-runâapply, `manage_dns_entry`).
|
||
- â
**sw2-Teil erledigt (2026-07-16, Christoph selbst Ăźber die Klickanleitung):** sw2 jetzt auf **`10.40.99.12`** (statisch, planmäĂiger Zielwert aus `ip-plan.md`) â per Ping verifiziert. Zwischenzeitlich war das Gerät kurz auf einer *dynamischen* `10.40.99.200`-Lease aufgetaucht (unklare Ursache, s. Memory `project_tp20_tp21_fasttrack_20260716`), jetzt aber sauber auf der geplanten statischen Adresse. `CLAUDE.md`/`ip-plan.md` nachgezogen.
|
||
- đ **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 auf `10.40.41.2` bis 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-Teil: Klickanleitung fertig, AusfĂźhrung on-demand (User-Entscheid 2026-07-16).** `switch/ui-guides/02-vlan99-mgmt-cutover.md` liegt bereit â Christoph entscheidet spontan, ob er noch klickt oder direkt auf CRS326 wartet. Nicht blockierend, kein Diskussionsbedarf mehr.
|
||
- **Bereits vorbereitet:** `docs/ip-plan.md` Phase 2 hat schon einen Entwurf (ap2â`10.40.99.2`, 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) ⸠â
**Plattform live (2026-07-16)** â Nautobot-DB angelegt, vw-Migration (TP20.1) offen â Memory `project_mikrotik_commit_nautobot_gc`
|
||
- â
**Platform-Postgres live (2026-07-16):** LXC 105 auf pve, `platform-pg.bf.lan` / `10.40.20.20`, Ubuntu 24.04 (native PG16-Paket, kein PGDG-Repo nĂśtig â bewusste Abweichung von der sonstigen Debian/community-scripts-Konvention der Ăźbrigen pve-LXCs, aus PG16-VerfĂźgbarkeitsgrĂźnden). Cluster mit `--locale en_US.UTF-8 -e UTF8` neu initialisiert (Erstinstallation lief in `C`/`SQL_ASCII`, fĂźr Nautobot ungeeignet, korrigiert). `wal_level=replica` gesetzt; **`archive_mode` bewusst noch NICHT an** â ohne pgBackRest/Garage-S3 (TP18) zum Prunen wĂźrde archivierte WAL unbegrenzt wachsen und die kleine 8GB-Disk fĂźllen; wird nachgezogen sobald TP18 steht. Rolle+DB `nautobot` angelegt, `pg_hba.conf` erlaubt `scram-sha-256` aus `10.40.20.0/24`. End-to-End-Verbindungstest (Netzwerk, nicht nur localhost) erfolgreich. Creds in `postgres/.secrets` (gitignored, `chmod 600`).
|
||
- **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).
|
||
- â ď¸ **Abh.-Korrektur (User 2026-07-16): TP18 (Garage-S3) ist KEINE Vorbedingung mehr â âhat mit dem Netz nichts zu tun", transitiv aus der TP21-Kette entfernt.** pgBackRestâGarage-S3 (s.u.) wird **nachgezogen sobald Garage existiert**, blockiert aber nicht mehr den Start. `wal_level=replica`/`archive_mode` kĂśnnen mit einem Platzhalter/lokalen Archive-Ziel hochgezogen werden, produktives Off-Site-PITR kommt später.
|
||
- â ď¸ **Komodo-Abh. (s. TP2/Memory `project_komodo_tp_pending`) vorerst zurĂźckgestellt:** Komodo selbst existiert noch nicht als laufendes System â kann also nicht âdarĂźber" deployt werden. **Entscheidung (Claude, 2026-07-16, transparent statt stillschweigend): Postgres-LXC + Nautobot-Stack werden jetzt direkt gebaut (LXC/Docker-Compose), Komodo adoptiert sie später** â gleiches Muster wie bei den CRS326 (Hardware/Stack zuerst lauffähig, Management-Layer zieht nach). Sag Bescheid, falls das nicht gewĂźnscht ist.
|
||
- đ **Ressourcen-Check 2026-07-16 (live geprĂźft, SSH):**
|
||
- **pve** (10.40.20.100): 4 vCPU, **15 GB RAM total, ~12 GB belegt, nur ~2-3 GB frei, 3 GB bereits im Swap** â eng! GrĂśĂter Verbraucher: HAOS-VM (`haos`, vmid 100) mit ~8,2 GB aktiv von 10 GB Limit. Disk unkritisch (94 GB Root, 85 GB frei).
|
||
- **Mac mini** (10.40.20.167): 10 CPU, 24 GB RAM, **nur ~1,9 GB "wired" (nicht reklamierbar)** â deutlich mehr echter Headroom als pve trotz "23G used"-Anzeige (macOS-Cache-Artefakt). Docker läuft bereits dort (n8n, n8n-redis, cloudflaredĂ2, gitea-mcp, portainer_agent).
|
||
- NAS nicht geprĂźft (kein funktionierender SSH-Zugriff von hier aus mit den vorhandenen Keys/User) â fĂźr diese beiden Stacks laut TP20/TP21-Plan ohnehin nicht Zielhost.
|
||
- **â
Entschieden (2026-07-16): Postgres-LXC auf pve, Nautobot-App-Stack auf NAS** (nicht Mac mini) â NAS hat mehr Headroom (~12 GB verfĂźgbar) und hostet bereits **Gitea** (Nautobots Git-Backend fĂźr Golden-Config-Templates), kĂźrzere Wege als Mac mini. Deploy-Weg: **Portainer-Stack auf ep14**, analog dem bestehenden Muster (`docs/nas-vlan20/stacks/*.yml`), Basis = offizielles `nautobot-docker-compose` (github.com/nautobot/nautobot-docker-compose), nicht von Null gebaut. Wird als **separate Session** angestoĂen (parallel zum Postgres-LXC-Aufbau auf pve).
|
||
- **Nachtrag (2026-07-16, nach Aufräumen): pve hat sich entspannt** â nach Abschalten mehrerer mittelfristig eh stillzulegender Services (User) jetzt **6,7 GB frei, 0 Swap** (vorher 2-3 GB frei, 3 GB Swap). Postgres-LXC passt entspannt.
|
||
- **RAM-Upgrade-Idee (32GB-Stick) zurĂźckgestellt (User 2026-07-16):** Intel N100 (pve-CPU) ist offiziell auf max. 16 GB spezifiziert + Single-Channel; ein dokumentierter Fall mit demselben Corsair-Modul auf vergleichbarer N100-Hardware endete in Memtest86-Fehlern, stabil erst nach RĂźckbau auf 8GB. Empfehlung: 16GB als Decke fĂźr diese Kiste behandeln statt auf einen Settings-Fix zu hoffen. **User rechnet ohnehin mittelfristig mit einem HW-Tausch fĂźr pve** â gehĂśrt ggf. in TP15s HW-Refresh-Scope, noch nicht formal aufgenommen.
|
||
- **â
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 (âgehostet wird vorerst auf der bf-site", 2026-07-16 reconfirmed). 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` (Ziel vorerst lokal/Platzhalter, s.o.) â späterer Standby = `pg_basebackup`, **kein** Primary-Umbau/Restart. pgBackRestâGarage-S3 folgt nach TP18, nicht mehr Blocker.
|
||
- **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:** PG-Version final (16 vs 17); Rollen/DB-Anlage Nautobot; pgBackRest-Bucket in Garage folgt **nach** TP18 (nicht mehr Blocker, s.o.).
|
||
- â ď¸ **Komodo-Abh. (User 2026-07-16) vorerst zurĂźckgestellt, s.o.:** ursprĂźnglich als Blocker gedacht (TP20 + neue Softwarepakete Ăźber Komodo statt direkt/Portainer), aber Komodo existiert noch nicht lauffähig und hat keine eigene TP-Nummer (nur unter TP2/TP11 erwähnt) â **entkoppelt, um die Montag-Deadline zu halten.** Komodo-TP-Nummer weiterhin zu klären, aber nicht mehr auf dem kritischen Pfad fĂźr TP20-Start.
|
||
- Abh.: **keine harten Blocker mehr** (TP18 entfernt, Komodo entkoppelt). **Blockt weiterhin 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_URL` umstellen â 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) ⸠Ⳡ**Plattform live (2026-07-16)**, Golden-Config-App/Device-Adoption offen â 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, spielt aber laut TP15-Korrektur ohnehin keine Rolle mehr).
|
||
- đ **Wird zum alleinigen Config-Weg fĂźr Netzgeräte (Governance-Entscheid 2026-07-16, s. oben):** ab hier keine ad-hoc MikroMCP-Writes/Switch-UI-Klicks mehr auf Dauer â Nautobot managed den Fleet.
|
||
- â
**Nautobot-Stack live (2026-07-16), auf NAS statt Mac mini** (Ressourcen-Check hatte Mac mini vorgeschlagen, dann auf NAS umentschieden â mehr Headroom + Gitea-Co-Location, s. TP20-Log): Portainer-Stack `nautobot` (Id 203, ep14), 4 Container â `nautobot` (App/API, `10.40.20.30:8080`), `nautobot-worker` (Celery), `nautobot-scheduler` (Celery Beat), `nautobot-redis`. Bild `ghcr.io/nautobot/nautobot:3.1.7` (offizielles Image direkt, **nicht** das `nautobot-docker-compose`-Repo â das ist ein `invoke`/Poetry-getriebenes Dev-Tooling-Repo ohne eigenständige `docker-compose.yml`, fĂźr einen Portainer-String-Stack ungeeignet; bewusste Abweichung, dokumentiert statt stillschweigend). DB = Platform-Postgres (`10.40.20.20`, TP20). Compose-Datei `docs/nas-vlan20/stacks/210-nautobot.yml` (gitignored, wie alle NAS-Stack-Files).
|
||
- đ **Gotcha beim ersten Deploy:** alle 3 Nautobot-Container liefen initial gleichzeitig `migrate` (Standard-Entrypoint-Verhalten) â Race-Condition, `IntegrityError` auf `pg_type`. Fix: `nautobot`-Service kriegt einen `healthcheck` (`curl .../health/`), `nautobot-worker`/`nautobot-scheduler` starten erst bei `depends_on: nautobot: condition: service_healthy` â serialisiert die Migration sauber auf einen Container. DB dafĂźr einmal `DROP`+`CREATE` (sauberer Neustart, kein Datenverlust â war eh leer).
|
||
- â
**End-to-End verifiziert:** `/api/status/` mit Token 200, Nautobot-Version 3.1.7, alle 4 Container laufen. Superuser `admin` angelegt, Creds im Stack-File (gitignored) + `postgres/.secrets` (DB-Seite).
|
||
- â ď¸ **Bekannt offen, nicht blockierend:** kein HTTPS/Reverse-Proxy vor Nautobot (Django-Security-Warnings beim Start, erwartet fĂźr internen HTTP-only-Betrieb auf VLAN20 â analog anderen internen Diensten); Celery-Worker-Registrierung beim allerersten Start nicht sofort sichtbar (`celery-workers-running:0` initial), unkritisch, braucht kurz zum Einpendeln.
|
||
- **PoC-Pfad (angepasst an die Montag-Deadline):** ~~Nautobot-Stack hoch~~ â
â **ap1 + ap2 in einem Rutsch adoptieren** (ap2 bekommt dabei gleich seinen VLAN99-Mgmt-Umzug aus TP19.1, s.o. â nicht isoliert vorher) â sobald CRS326 verkabelt sind, **direkt als Nautobot-verwaltete Geräte adoptieren statt erst manuell konfigurieren** â Compliance/Drift + Templates/intended fĂźr VLAN-/Firewall-Standards danach.
|
||
- **Offen:** Golden-Config-App noch nicht installiert/konfiguriert (nur Nautobot-Core läuft bisher); Git-Backend-Anbindung an Gitea; ap1-Adoption via RouterOS-API; 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): TP20 (Platform-Postgres) â TP21 (Nautobot) â Ziel: fertig vor CRS326-Produktivsetzung, spätestens Montag 2026-07-20.** TP18 (Garage-S3) und die Komodo-Abhängigkeit wurden am selben Tag als Blocker entfernt/entkoppelt (s. TP20), um diese Deadline zu halten â beide werden später nachgezogen, nicht mehr vorher abgewartet. Danach: TP21 adoptiert ap1+ap2 (inkl. TP19.1-Rest) und die neu gelieferten CRS326-Switches direkt, dann erst 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-Built `docs/cf-tunnel-mapping.md §10`.
|
||
1. ~~**TP1 (GE8) â TP2 (Omada Controller).**~~ â
erledigt 2026-06-15.
|
||
2. ~~**TP4 (Router-Cutover L3-Infra + WAN-Edge).**~~ â
erledigt 2026-06-15 (L3) + 2026-07-01 (Edge-Cutover, FB physisch weg).
|
||
3. **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).
|
||
4. **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`).
|
||
5. ~~**TP10 (VPN)**~~ â
Kern durch (2026-06-27) + Edge-Cutover (2026-07-01) â DURCH. Offen nur: DDNS-Auto-Updater.
|
||
6. **Nachgelagert/Research-getrieben:** TP8 (Access), TP9 (HA), TP11 (Monitoring + CF-Tunnel-Track-B/C), TP12 (IPv6), TP13 (SpaĂ).
|
||
7. **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).
|