diff --git a/CLAUDE.md b/CLAUDE.md index 13af14b..760f5ec 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -28,10 +28,16 @@ GW je VLAN = `.1` · APs: ap1=`.1`, ap2=`.2` · Switches: ALLNET=`.11`, Omada=`. | Gerät | IP | Zugang | |---|---|---| | ALLNET Core-Switch (sw1) | 10.40.41.11 (interim, VLAN1) | `telnet 10.40.41.11` · User: `claudecode` · PW: `switch/.secrets` | +| Omada Access-Switch (sw2) | 10.40.41.12 | Web-UI HTTPS · Creds `omada/.secrets` · **Adoption pending** | | hAP ax² #1 (ap1) | 10.40.41.1 | MikroMCP (live) | -| hAP ax² #2 (ap2) | 10.40.41.2 | MikroMCP (live) | -| NAS (nas-bf) | 10.40.41.10 | SSH | -| pve (Mac mini) | 10.40.41.167 | `ssh 10.40.41.167` | +| hAP ax² #2 (ap2) | 10.40.41.2 | MikroMCP (live) · **Port 2 am Omada-Switch** | +| NAS (nas-bf, DS923) | 10.40.41.10 | SSH · Docker (Portainer endpointId=14) | +| Omada-Controller | 10.40.41.175 | `https://10.40.41.175:8043` (macvlan auf DS923) | +| omada-mcp | 10.40.41.174 | SSE `http://10.40.41.174:3000/sse` (staged, nach Wizard) | +| pve-mcp | 10.40.41.173 | SSE `http://10.40.41.173:3000/sse` · MCP in Claude Code ✓ | +| Proxmox (pve) | 10.40.41.100 | kein SSH-Key konfiguriert | +| Docker-LXC (auf pve) | 10.40.41.126 | Portainer CE 2.40.0 (`https://10.40.41.126:9443`) | +| Mac mini | 10.40.41.167 | `ssh macmini` | | FritzBox 6660 | 10.40.41.254 | Web-UI (Telefon bleibt dort) | --- @@ -42,7 +48,10 @@ GW je VLAN = `.1` · APs: ap1=`.1`, ap2=`.2` · Switches: ALLNET=`.11`, Omada=`. - **ALLNET-Switch:** kein MCP — nur Telnet-CLI (IOS-artig, FW 2.2.1). Runner: `cd ~/dev/bf-network-r6/switch && . ./.secrets && expect cli/run-cli.exp cli/.cli` Klickanleitungen in `switch/ui-guides/` für manuelle Schritte. -- **Omada-Switch:** noch standalone, kein Controller; Creds in `omada/.secrets`. +- **Omada-Switch:** Controller `https://10.40.41.175:8043` (TP2 ✅). Adoption + Port-Config: manuell im Browser. + omada-mcp nach Wizard: `mcp/omada/docker-compose.yml` deployen (endpointId=14), Claude Code eintragen. +- **Docker-Management:** Portainer API `https://10.40.41.126:9443`, Key in `mcp/portainer/.env`. + Ablösung durch Komodo (native MCP) geplant. --- @@ -51,5 +60,7 @@ GW je VLAN = `.1` · APs: ap1=`.1`, ap2=`.2` · Switches: ALLNET=`.11`, Omada=`. - **`save` nicht vergessen** nach ALLNET-Änderungen (sonst nach Reboot weg). - **hAP ax² hat 128 MB Flash, kein USB** → Container NICHT auf dem Router; Container laufen auf NAS/pve. - **ALLNET VLAN-DB final (TP1 ✅):** 40=MEDIA, 50=UNTRUSTED; GE1/GE2/GE8 alle als Trunk mit 10/20/30/40/50/90/99/100. +- **Omada-Switch Port 2 = ap2** (Trunk all VLANs), Uplink-Port → ALLNET GE8 (Trunk all), Restports = Access. - **Mesh = NEIN** (beide APs haben wired Trunk-Uplink → Loop-Risiko). - mgmt-VLAN-Wechsel am Switch = Lockout-Risiko: VLAN muss existieren + Port muss es tragen, in einem Schritt. +- **Omada ES208G = Easy Managed** → Controller-adoptierbar (ab 6.1.x), nur Basis-VLAN/QoS im Controller (kein ACL/Policy-Routing). diff --git a/docs/teilprojekte.md b/docs/teilprojekte.md index d8aad9b..594a6f0 100644 --- a/docs/teilprojekte.md +++ b/docs/teilprojekte.md @@ -18,9 +18,10 @@ 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` (Standalone, Creds `omada/.secrets`). -2× hAP ax² (7.23.1): ap1 `.1` (Core P1), ap2 `.2` (Core P2 — **bleibt vorerst**). FB6660 = Router/Telefon (`.254`). -Kontrolle: MikroMCP (MikroTik) live · ALLNET = Klickanleitungen (inline) · Omada → Controller (TP2). +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` (Standalone→**adopted erwartet, TP2 ✅ 2026-06-15**). +Omada-Controller **`.175`** (DS923/macvlan, mbentley 6.2, 🟢 live). omada-mcp `.174` (staged, wartet auf Wizard-Passwort). +2× hAP ax² (7.23.1): ap1 `.1` (ALLNET P1), ap2 `.2` (Omada P2 — Trunk). FB6660 = Router/Telefon (`.254`). +Kontrolle: MikroMCP (MikroTik) live · ALLNET = Klickanleitungen (inline) · Omada → Controller + omada-mcp (nach Wizard). > ⚠️ **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. @@ -35,9 +36,13 @@ Kontrolle: MikroMCP (MikroTik) live · ALLNET = Klickanleitungen (inline) · Oma - ✅ 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 ▸ als Nächstes -- **Omada Software Controller als Container auf DS923 (BF)** → Switch `.12` adoptieren → Uplink/ap2-Port=Trunk(all), lokale=Access. Dann **omada-mcp** (realtydev) an Controller. -- Abh.: TP1 (GE8 Trunk). research: omada-mcp-Setup. +### TP2 — Omada Access-Switch + Controller ▸ ✅ FERTIG (2026-06-15, Adoption + omada-mcp noch offen) +- ✅ Omada Controller 6.2.10.17 auf DS923 (macvlan `.175`): `omada/docker-compose.yml`, Stack via Portainer endpointId=14. +- ✅ pve-mcp (samik081) in Claude Code eingetragen (`~/.claude/settings.json`, SSE `.173:3000`). +- ✅ omada-mcp staged: `mcp/omada/` (compose + .env.template), macvlan `.174`. **Noch offen:** Wizard https://10.40.41.175:8043 → Admin-Account + Site „BF" → `.12` adopt → `.env` befüllen → Stack deployen + Claude Code eintragen. +- ✅ Port-Plan: Omada-Switch Port 2 = ap2 (Trunk all), Uplink-Port (→ ALLNET GE8) = Trunk all, Restports = Access interim VLAN10. +- ✅ Portainer-Ablösung: **Komodo** empfohlen (einzige Option mit nativem MCP `mcp-server-komodo`). Eigener Task. +- Abh. erfüllt: TP1 (GE8 Trunk ✅). ### TP3 — WLAN / CAPsMAN ▸ teilweise blockiert - **`bound`-Problem** sauber lösen (MikroMCP, doku-gegründet) → Test-WLAN „BF-Main" → SSID→VLAN-Datapaths. diff --git a/mcp/INVENTORY.md b/mcp/INVENTORY.md index 14110aa..4790172 100644 --- a/mcp/INVENTORY.md +++ b/mcp/INVENTORY.md @@ -9,8 +9,10 @@ | MCP | Zweck / Geräte | Host | Transport / Endpoint | Image | Config | Status | |---|---|---|---|---|---|---| | **MikroMCP** (AliKarami) | MikroTik hAP ax² ap1/ap2 (RouterOS 7) — WLAN/CAPsMAN, später Router-Cutover | **jetzt: lokal (dieser Mac)** / Ziel: Mac mini `.167` Docker | jetzt **stdio** (`npx mikromcp serve`) / Ziel HTTP `:3000` | `ghcr.io/alikarami/mikromcp:latest` (HTTP) bzw. npm `mikromcp` (stdio) | `mcp/mikromcp/` + Claude-Code user-config | 🟢 **live (stdio), doctor 12/12, in Claude Code ✓Connected** | -| **omada-mcp** (realtydev) | TP-Link Omada Controller → ES208G (+ künftige Omada-Geräte) | tbd (Controller = pve-LXC `10.40.41.126`) | HTTP (stream) | `jmtvms/tplink-omada-mcp` (Fork prüfen) | `mcp/omada/` (tbd) | 🔴 wartet auf Controller+Adoption | -| **portainer-mcp** (offiziell) | Docker-Überblick **5 Hosts** (pve/ds923/odroid/macmini/ds415) via Portainer | Portainer-Server **läuft** auf `.126:9443` **v2.40.0** | stdio (uvx) o. Docker-HTTP, **read-only** | `portainer/portainer-mcp` / `mcp-portainer` | `mcp/portainer/` (Token in .env ✓) | 🟠 **blockiert: Portainer 2.40 hat keinen passenden MCP (nur 2.41/2.42)** → Portainer bumpen; + lokal kein uvx/docker | +| **pve-mcp** (samik081) | Proxmox VE API (Host `.100`) | DS923 (`.10`), macvlan-IP **`.173`** | SSE `http://10.40.41.173:3000/sse` | `ghcr.io/samik081/mcp-pve:latest` | — (Stack via Portainer) | 🟢 **live, in Claude Code eingetragen** | +| **omada-mcp** (realtydev/jmtvms) | TP-Link Omada Controller → ES208G (+ künftige Omada-Geräte) | DS923 (`.10`), macvlan-IP **`.174`** | SSE `http://10.40.41.174:3000/sse` (`MCP_TRANSPORT=sse`) | `jmtvms/tplink-omada-mcp:latest` | `mcp/omada/` ✓ | 🟡 **staged — wartet auf Wizard + Adoption (.12)** | +| **omada-controller** | Omada Software Controller (keine MCP) | DS923 (`.10`), macvlan-IP **`.175`** | HTTPS `https://10.40.41.175:8043` | `mbentley/omada-controller:6.2` | `omada/docker-compose.yml` | 🟢 **live (Up, health: starting→healthy erwartet)** | +| **portainer-mcp** (offiziell) | Docker-Überblick **5 Hosts** via Portainer | Portainer läuft auf `.126:9443` v2.40.0 | stdio (uvx) o. Docker-HTTP | `portainer/portainer-mcp` | `mcp/portainer/` (Token .env ✓) | 🟠 **zurückgestellt — Portainer ablösung durch Komodo geplant** | | ~~ALLNET-MCP~~ | ALLNET ALL-SG8316M Core-Switch | — | — | — | — | ⛔ **bewusst NICHT** (Telnet/1-VTY/15-min-Lock auf Core = zu fragil). User-Entscheid: erst beschriebener Weg, sonst Omada-Core-Tausch. | Legende: 🟢 live · 🟡 staged (Config da, nicht deployed) · 🔴 blockiert · ⛔ bewusst nicht gemacht diff --git a/mcp/omada/.env.template b/mcp/omada/.env.template new file mode 100644 index 0000000..2212525 --- /dev/null +++ b/mcp/omada/.env.template @@ -0,0 +1,8 @@ +# omada-mcp Secrets — .env (gitignored). Dieses File = Template, .env = echte Werte. +MCP_TRANSPORT=sse +PORT=3000 +OMADA_URL=https://10.40.41.175:8043 +OMADA_USERNAME=admin +OMADA_PASSWORD=REPLACE_AFTER_WIZARD +OMADA_SITE=BF +OMADA_SKIP_CERT_VERIFY=true diff --git a/mcp/omada/docker-compose.yml b/mcp/omada/docker-compose.yml new file mode 100644 index 0000000..c2c29a5 --- /dev/null +++ b/mcp/omada/docker-compose.yml @@ -0,0 +1,31 @@ +# omada-mcp — TP-Link Omada Controller MCP Server +# Host: nas-bf (DS923, 10.40.41.10), Portainer endpointId=14 +# Image: jmtvms/tplink-omada-mcp (stdio by default, SSE via MCP_TRANSPORT=sse) +# IP: 10.40.41.174 (macvlan default_external) — .173=pve-mcp, .175=omada-controller +# +# Deploy NACH Omada-Controller-Wizard (https://10.40.41.175:8043): +# 1. Creds in .env eintragen +# 2. Via Portainer API: POST /api/stacks/create/standalone/string?endpointId=14 +# 3. Claude Code: ~/.claude/settings.json → "omada-mcp": {"url": "http://10.40.41.174:3000/sse"} + +services: + omada-mcp: + image: jmtvms/tplink-omada-mcp:latest + container_name: omada-mcp + restart: unless-stopped + networks: + default_external: + ipv4_address: 10.40.41.174 + env_file: .env + # Env-Vars (in .env setzen, nie hier hardcoden): + # MCP_TRANSPORT=sse + # PORT=3000 + # OMADA_URL=https://10.40.41.175:8043 + # OMADA_USERNAME=admin + # OMADA_PASSWORD= + # OMADA_SITE=BF + # OMADA_SKIP_CERT_VERIFY=true (falls key heißt anders: OMADA_TLS_VERIFY=false) + +networks: + default_external: + external: true diff --git a/omada/docker-compose.yml b/omada/docker-compose.yml index f838cfa..3334a5d 100644 --- a/omada/docker-compose.yml +++ b/omada/docker-compose.yml @@ -1,28 +1,32 @@ # Omada Software Controller — BF -# Ziel-Host: pve docker-LXC (10.40.41.126), Engine 28.x +# Deploy-Host: nas-bf (DS923, 10.40.41.10), Portainer endpointId=14 # Image: mbentley/omada-controller (De-facto-Standard; TP-Link liefert kein offizielles Image) # # ES208G/ES216G = Omada "Easy Managed" → SDN-adoptierbar (verifiziert 2026-06). -# ABER: ES-Serie braucht Controller >= 6.1.x (SDN-Support kam erst mit 6.1.x-FW) +# ES-Serie braucht Controller >= 6.1.x (SDN-Support kam erst mit 6.1.x-FW) # + aktuelle Switch-Firmware. Tier "Easy Managed" = nur Basis-VLAN/QoS im Controller. # -# network_mode: host = nötig für L2-Auto-Discovery der Switches (29810/udp Broadcast). -# Controller nutzt dann direkt die LXC-IP 10.40.41.126. +# Netzwerk: macvlan default_external (10.40.41.0/24) → Controller bekommt eigene IP .175. +# L2-Auto-Discovery der Switches (29810/udp Broadcast) funktioniert via macvlan, weil +# der Container als echter L2-Teilnehmer erscheint (eigene MAC/IP). # -# Deploy: -# mkdir -p /opt/docker/omada/{data,logs} +# Deploy via Portainer API (endpointId=14): +# POST /api/stacks/create/standalone/string?endpointId=14 +# Manuell: +# mkdir -p /volume1/docker/omada/{data,logs} # docker compose up -d -# UI: https://10.40.41.126:8043 (Erst-Setup-Wizard) +# UI: https://10.40.41.175:8043 (Erst-Setup-Wizard) services: omada-controller: - image: mbentley/omada-controller:6.1 - # ^ >=6.1.x ist Pflicht für ES-Serie (5.x adoptiert sie NICHT). - # Tag-Existenz kurz prüfen: docker pull mbentley/omada-controller:6.1 - # (sonst exakten 6.1.x-Tag von hub.docker.com/r/mbentley/omada-controller nehmen) + image: mbentley/omada-controller:6.2 + # ^ 6.2 (=6.2.10.17) = aktuelles Stable; Tags geprüft 2026-06-15. + # 6.1 existiert nicht (nur 6.1-openj9), daher 6.2 gewählt. container_name: omada-controller restart: unless-stopped - network_mode: host + networks: + default_external: + ipv4_address: 10.40.41.175 environment: - TZ=Europe/Vienna - MANAGE_HTTP_PORT=8088 @@ -33,5 +37,9 @@ services: - SHOW_MONGODB_LOGS=false # - SMALL_FILES=true # nur falls MongoDB beim Start auf dem FS zickt volumes: - - /opt/docker/omada/data:/opt/tplink/EAPController/data - - /opt/docker/omada/logs:/opt/tplink/EAPController/logs + - /volume1/docker/omada/data:/opt/tplink/EAPController/data + - /volume1/docker/omada/logs:/opt/tplink/EAPController/logs + +networks: + default_external: + external: true