From 2069c17406d6b3742dc8dc9f7aa67a4d84c4fc87 Mon Sep 17 00:00:00 2001 From: Christoph Emsenhuber Date: Tue, 14 Jul 2026 18:14:21 +0200 Subject: [PATCH] =?UTF-8?q?docs=20=F0=9F=A7=AD=20TP15=20neu=20ausgerichtet?= =?UTF-8?q?=20+=20TP20/TP21:=20MikroTik-Ecosystem-Commit,=20Platform-Postg?= =?UTF-8?q?res,=20Nautobot=20Golden=20Config?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Grundsatzentscheid 2026-07-14 (Christoph): - Ecosystem-Split nach Layer: MikroTik = Kabel+Routing (CAKE=Ziel #1), Omada = nur WLAN. - TP15: 2x CSS326-24G-2S+RM im Zulauf (SwOS-only → nicht in MikroMCP/Nautobot; kein PoE → EAP via Injektor; CRS-Swap-Flag offen). WLAN→Omada-EAP, Router→RB5009. A/B/C/D-Varianten = Archiv. - TP20 Platform-DB: 2-Tier (Postgres precious = Nautobot+Vaultwarden; MariaDB Tier-2 = HA-Recorder). Single-site-first, replication-ready (WAL/pgBackRest→Garage-S3). Vaultwarden migriert MariaDB→PG. - TP21 Nautobot Golden Config als config-as-code Control-Plane über RouterOS (ergänzt MikroMCP), Git-Backend→Gitea, DB→TP20. Co-Authored-By: Claude Opus 4.8 --- docs/hw-refresh-requirements.md | 3 +++ docs/teilprojekte.md | 43 ++++++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/docs/hw-refresh-requirements.md b/docs/hw-refresh-requirements.md index 00c3437..a87c363 100644 --- a/docs/hw-refresh-requirements.md +++ b/docs/hw-refresh-requirements.md @@ -3,6 +3,9 @@ > **Stand:** 2026-07-10 · **Status:** Entwurf · **Nächstes:** TP15 in teilprojekte.md > **Ziel:** ALLNET-Core + 2 Branch-Switches ablösen, Energieeffizienz + zentrales Management + DC-USV-Konzept +> **⚠️ ENTSCHEIDUNGEN 2026-07-14 (überschreiben Teile dieses Recherche-Docs):** +> Ecosystem-Commit **MikroTik** (Kabel+Routing) / **Omada nur WLAN**. **2× CSS326-24G-2S+RM im Zulauf** als Switches (⚠️ **SwOS-only** → nicht in MikroMCP/Nautobot; **kein PoE** → EAPs via Injektor). WLAN → **Omada-EAP** (nicht hAP be³). Router → **RB5009** (mittelfristig). Die **A/B/C/D-Switch-Varianten unten sind damit Archiv**; DC-USV/Energie-Abschnitte bleiben gültig. **SSoT = TP15/TP20/TP21 in `teilprojekte.md`** + Memory `project_mikrotik_commit_nautobot_gc`. + --- ## 1. Ist-Stromverbrauch (Baseline) diff --git a/docs/teilprojekte.md b/docs/teilprojekte.md index 7418300..4d44e9a 100644 --- a/docs/teilprojekte.md +++ b/docs/teilprojekte.md @@ -321,18 +321,17 @@ FT kaschierte das bisher als „Roaming" statt „schwache Abdeckung". ### 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: Core-Switch + OG-Verteiler ▸ 🔜 PLANUNG — `docs/hw-refresh-requirements.md` -- **Ziel:** ALLNET-Core (sw1, 5,8W) + 2 Branch-Switches (je 1,5W) ablösen durch energieeffizientere, zentral managebare Lösung mit PoE + DC-USV. -- **Architektur:** Unten (Diele) = lüfterloser Core-Switch mit PoE, PoE-powered von oben (gepuffert). Oben (Arbeitszimmer) = Switch mit PoE + DC-USV (48V-Bus, LiFePO4). -- **Anbieter-Recherche:** MikroTik (RouterOS) ⭐, TP-Link Omada, Ubiquiti UniFi, Netgear, Aruba Instant On, Zyxel, Cisco. **Favorit: MikroTik** (RouterOS, Config-as-Code, MikroMCP). -- **Kandidaten unten:** CRS318-16P-2S+OUT (16 PoE, lüfterlos, ~16W, ~€286) ⭐ oder CRS326-24G-2S+RM (24 Ports, lüfterlos, ~10W, ~€200) + PoE-Injektor. -- **Kandidaten oben:** CRS328-24P-4S+RM (24 PoE, 4× SFP+, ~25W, ~€400) ⭐ oder CRS418-8P-8G-2S+5axQ2axQ-RM (16 Port, 8 PoE, WiFi 6, ~19W, ~€403). -- **WiFi:** hAP be³ Media (WiFi 7, 5× 2,5G, ~€179) als separater AP ⭐ vs. CRS418 (WiFi 6 integriert). -- **DC-USV:** MeanWell LRS-150-48 + DDR-120-48 + LiFePO4 20Ah (~€190) — 48V-Bus, ~2,5h Laufzeit bei 100W. -- **Energiebilanz:** Neue Lösung ~35–60W (je nach Variante) vs. IST ~15W (nur Switching). Jahreskosten +€50–105. -- **Offene Entscheidungen:** Variante (A/B/C/D), Mac mini auf USV?, PVE-Standort, WiFi-Strategie. -- **Nächster Schritt:** Entscheidungen treffen, dann Konfiguration + Bestellung. -- Abh.: TP14 (IP-Migration VLAN1→VLAN20 sollte abgeschlossen sein, damit Ziel-IPs feststehen). +### TP15 — HW-Refresh: Switching + WLAN-Ecosystem + DC-USV ▸ 🟡 ENTSCHIEDEN, Beschaffung läuft (2026-07-14) — `docs/hw-refresh-requirements.md`, Memory `project_mikrotik_commit_nautobot_gc` +- **🧭 Grundsatzentscheid (2026-07-14): Ecosystem-Split nach Layer.** **MikroTik = config-gemanagter Kern** (Routing/L3/CAKE + alle Switches), **Omada = ausschließlich WLAN**. Begründung: Projektziel #1 **CAKE** nur RouterOS/OpenWrt/OPNsense (Omada-Gateway kann kein CAKE); WLAN = Schmerzpunkt → Omada-EAP; Switching = MikroTik. Grenze **„MikroTik = Kabel+Routing, Omada = Funk"** deckt sich mit den 2 bestehenden Control-Planes (MikroMCP + Omada-Controller). Verworfene Vollvarianten (Omada-only, MikroTik-only) samt Begründung + Ansible/Nautobot-Recherche → Memory. +- **🛒 Switches: 2× CSS326-24G-2S+RM im Zulauf (2026-07-14).** 24×1G + 2×SFP+, lüfterlos, DC-input (USV-tauglich). Lösen ALLNET-Core (sw1) + Omada-ES208G (sw2 raus aus Switching-Rolle) + Cudy ab. + - ⚠️ **CSS = SwOS-only, KEIN RouterOS** → **außerhalb** MikroMCP/Nautobot-Golden-Config; VLANs statisch per SwOS-Web-UI. Die Config-as-Code-Grenze liegt damit am RouterOS-**Router**, nicht an den Switches. ⚠️ **kein PoE** → Omada-EAPs + Sonoff via **PoE-Injektoren**. + - 🚩 **Offener Flag (Switches „im Zulauf", noch änderbar):** wer die Switches *im* Golden-Config-Modell will → **CRS326-24G-2S+RM** (RouterOS, +~€50/St.) statt CSS. Sonst CSS = bewusste, billigere SwOS-L2-Insel (für statische VLANs robust). +- **📶 WLAN → Omada EAPs** (ersetzt hAP-Funk + CAPsMAN): löst CAP-ARP/Broadcast-Quirks (P750W-Fall), reifes 802.11k/v/r-Roaming, VLAN→SSID im bereits laufenden Controller. hAP ax² werden Reserve. (Ersetzt die alte hAP-be³-Linie dieses Docs.) +- **🧭 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; CSS326 DC-input passt. +- **Offen:** PoE-Injektor-Auswahl (EAP-Wattage); RB5009-Beschaffung; EAP-Modell (WiFi6 EAP6xx vs WiFi7 EAP7xx); Standort-Zuordnung der 2 Switches (Diele/OG) nach TP19-VLAN1-Retirement. +- **Hinweis:** die A/B/C/D-Switch-Varianten in `hw-refresh-requirements.md` sind durch die CSS326-Beschaffung überholt (Doc = Recherche-Archiv + USV/Energie-Referenz). +- Abh.: TP14 ✅ (IP-Migration). Verzahnt: **TP20** (Platform-DB), **TP21** (Nautobot GC). ### 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.** @@ -408,6 +407,25 @@ FT kaschierte das bisher als „Roaming" statt „schwache Abdeckung". - **Teardown-Sequenz (nach Prereqs):** VLAN1-Client-Sweep = leer (nur Mgmt bleibt) → cudy1/cudy2 stromlos/Reset/ausbauen → ap1 `defconf`/pool-v1-Client-DHCP zurückziehen (VLAN1-Mgmt-Reachability für sw1/sw2/ap2 erhalten) → Interim-Krücken aufräumen (ap2 `frame-types=admit-only-vlan-tagged` = auto-weg mit VLAN1; `st-main rrm/wnm` Roaming-Provisorium neu bewerten) → 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), **VLAN99-MGMT-Cutover** (Folge-TP, entkoppelt), TP5 (Deny-by-default danach sauberer). SSoT hier + Runbook. +### TP20 — Platform-Datenbank (Postgres Precious-Tier + MariaDB Tier-2) ▸ 🔜 KONZEPT (2026-07-14) — Memory `project_mikrotik_commit_nautobot_gc` +- **Auslöser:** Mehrere Dienste brauchen zentrale DB (Nautobot-SoT [TP21], Vaultwarden, HA-Recorder). Grundsatzentscheid statt Nautobot-Insellösung — „wir skalieren schneller als wir schauen können" (User). +- **✅ 2-Tier (User 2026-07-14):** + - **Tier-1 „Platform-Postgres" (precious):** EIN Postgres-Cluster, getrennte DBs für **Nautobot + Vaultwarden**. **PG 16** (Nautobot-Matrix-safe; **Nautobot unterstützt kein MariaDB**, nur PG/MySQL-8 → Postgres ist gesetzt, nicht optional). + - **Tier-2 (Bestand):** **HA-Recorder + Vaultwarden laufen aktuell auf MariaDB.** HA **bleibt** MariaDB (Write-Churn, andere Zuverlässigkeitsklasse, single-site). **Vaultwarden migriert MariaDB→Postgres** (in Tier-1 hochgezogen). Engine-Split fällt sauber entlang der Tier-Grenze. *(Alternative, dokumentiert-aber-verworfen: vw auf MariaDB lassen + MariaDB-Repl — verworfen zugunsten EINER Replikations-/Backup-Mechanik im Precious-Tier.)* +- **✅ Single-Site-first (User 2026-07-14):** jetzt nur BF-Primary. Nimmt das **2-Site-Quorum/Split-Brain**-Problem (bräuchte 3. Witness) vom Tisch. **ABER replication-ready ab Tag 1:** `wal_level=replica`, `archive_mode=on`, **pgBackRest (WAL+Base) → Garage-S3 (TP18)** = PITR sofort (DR auch ohne Standby) + späterer Standby = `pg_basebackup`, **kein** Primary-Umbau/Restart. +- **Substrat:** Postgres in **LXC auf pve** (DB-Klasse, nicht Docker). +- **Phase 2 (später):** Cross-Site-Standby für Vaultwarden — `db-platform-standby`-LXC am 2. Standort, Streaming-Replication über WG (TP10), manuelles Promote-Runbook. Patroni + Witness nur falls Auto-Failover gewünscht. +- **Offene Sub-Steps:** Vaultwarden MariaDB→PG-Migration (`vw` .20.127); pgBackRest-Bucket in Garage (Abh. TP18-Startpfad ①); PG-Version final (16 vs 17). +- Abh.: **TP18** (Garage-S3 für Backups — mind. BF-Node ①), **TP10** (WG-Transport für Phase-2). **Blockt TP21.** + +### TP21 — Nautobot Golden Config (config-as-code Control-Plane) ▸ 🔜 KONZEPT (2026-07-14) — Memory `project_mikrotik_commit_nautobot_gc` +- **Ziel:** modellierter Control-Plane über den MikroTik-**RouterOS**-Kern: GUI-SoT + **Config-Compliance/Drift** + intended-config + Push. **Ergänzt** MikroMCP (interaktiv/Debug), **ersetzt es nicht** (deklarativ/DR/Compliance). Aus User-Recherche 2026-07-14: MikroTik in Golden Config **erstklassig** (`mikrotik_routeros` + `_api`, Nornir/NAPALM, backup+deploy). +- **Scope-Grenze (wichtig):** RouterOS in-model (ap1 heute / RB5009 künftig). **CSS326-Switches = SwOS = NICHT in Golden Config** (s. TP15-Flag); **Omada-WLAN = eigener Controller**. Golden Config deckt also den **RouterOS-Router**, nicht den ganzen Fabric. *(Wenn Switches in-model sollen → CRS statt CSS, TP15-Flag.)* +- **Stack:** `nautobot-docker-compose` (Django/gunicorn + Redis + Celery worker/beat) auf Docker-Host; **DB extern → Platform-Postgres (TP20)**; Redis lokal/ephemer; **Git-Backend (backups/intended/templates) → bestehendes Gitea** (`project_gitea_backup_state`). +- **PoC-Pfad:** Nautobot-Stack hoch → ap1 via RouterOS-API adoptieren → Backup + Compliance/Drift an *einem* Gerät zeigen → dann Templates/intended für VLAN-/Firewall-Standards. +- **Offen:** Nautobot- + GC-App-Version; ob OpenWrt je in-model muss (custom Nornir-Dispatcher — nur relevant falls Router doch OpenWrt+cake-autorate statt RB5009). +- Abh.: **TP20** (Postgres muss stehen), Gitea ✅, RouterOS-Router (ap1 heute / RB5009 TP15). + ### TP-R — Router-Capabilities-Sweep ▸ FERTIG (`docs/research/routeros-capabilities.md`) - **Leitsatz: nativ vor Container, NAS vor Router** (128MB-Flash-Limit). - **Sofort nativ (~0 RAM):** RoMON · Netwatch · Scheduler + Auto-Backup/Mail · SNMP→externes Monitoring · **mDNS-Repeater** · spectral-scan · **CAPsMAN + 802.11r/k/v (Fast-Roaming statt Mesh)** · Back-to-Home/WireGuard. @@ -429,3 +447,4 @@ FT kaschierte das bisher als „Roaming" statt „schwache Abdeckung". ⏳ **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× CSS326 im Zulauf) ∥ **TP20 (Platform-Postgres, single-site replication-ready)** → **TP21 (Nautobot Golden Config)**. TP20 hängt an **TP18 ①** (Garage-Bucket für pgBackRest).