TP2 ✅ Omada Controller deployed + omada-mcp staged: DS923/macvlan, pve-mcp eingetragen

- omada/docker-compose.yml: Controller 6.2.10.17 auf DS923 (macvlan .175, endpointId=14);
  pve-LXC (.126) hat zu wenig Disk → DS923 standard pattern
- mcp/omada/: docker-compose.yml + .env.template für omada-mcp (macvlan .174, MCP_TRANSPORT=sse);
  wartet auf Wizard-Passwort nach https://10.40.41.175:8043
- pve-mcp (samik081) in ~/.claude/settings.json eingetragen (SSE .173:3000)
- CLAUDE.md: Topologie korrigiert (wahre IPs .100/.126/.167/.173-.175, Omada Port 2 = ap2)
- INVENTORY.md: pve-mcp 🟢, omada-mcp 🟡, portainer-mcp zurückgestellt (→ Komodo)
- teilprojekte.md: TP2 ✅, Ist-Stand + offene manuelle Schritte dokumentiert

Noch offen (manuell): Wizard, .12 adopt, Port-Config, .env + Stack deploy, Claude Code eintragen.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 14:11:05 +02:00
parent a58d419747
commit a36bdd8f56
6 changed files with 91 additions and 26 deletions

View File

@@ -28,10 +28,16 @@ GW je VLAN = `.1` · APs: ap1=`.1`, ap2=`.2` · Switches: ALLNET=`.11`, Omada=`.
| Gerät | IP | Zugang | | Gerät | IP | Zugang |
|---|---|---| |---|---|---|
| ALLNET Core-Switch (sw1) | 10.40.41.11 (interim, VLAN1) | `telnet 10.40.41.11` · User: `claudecode` · PW: `switch/.secrets` | | 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² #1 (ap1) | 10.40.41.1 | MikroMCP (live) |
| hAP ax² #2 (ap2) | 10.40.41.2 | MikroMCP (live) | | hAP ax² #2 (ap2) | 10.40.41.2 | MikroMCP (live) · **Port 2 am Omada-Switch** |
| NAS (nas-bf) | 10.40.41.10 | SSH | | NAS (nas-bf, DS923) | 10.40.41.10 | SSH · Docker (Portainer endpointId=14) |
| pve (Mac mini) | 10.40.41.167 | `ssh 10.40.41.167` | | 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) | | 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: - **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/<datei>.cli` `cd ~/dev/bf-network-r6/switch && . ./.secrets && expect cli/run-cli.exp cli/<datei>.cli`
Klickanleitungen in `switch/ui-guides/` für manuelle Schritte. 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). - **`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. - **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. - **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). - **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. - 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).

View File

@@ -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`. 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) ## 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`). 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**).
2× hAP ax² (7.23.1): ap1 `.1` (Core P1), ap2 `.2` (Core P2 — **bleibt vorerst**). FB6660 = Router/Telefon (`.254`). Omada-Controller **`.175`** (DS923/macvlan, mbentley 6.2, 🟢 live). omada-mcp `.174` (staged, wartet auf Wizard-Passwort).
Kontrolle: MikroMCP (MikroTik) live · ALLNET = Klickanleitungen (inline) · Omada → Controller (TP2). 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**. > ⚠️ **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. > 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). - ✅ 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. - 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 ### TP2 — Omada Access-Switch + Controller ▸ ✅ FERTIG (2026-06-15, Adoption + omada-mcp noch offen)
- **Omada Software Controller als Container auf DS923 (BF)** → Switch `.12` adoptieren → Uplink/ap2-Port=Trunk(all), lokale=Access. Dann **omada-mcp** (realtydev) an Controller. - ✅ Omada Controller 6.2.10.17 auf DS923 (macvlan `.175`): `omada/docker-compose.yml`, Stack via Portainer endpointId=14.
- Abh.: TP1 (GE8 Trunk). research: omada-mcp-Setup. - ✅ 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 ### TP3 — WLAN / CAPsMAN ▸ teilweise blockiert
- **`bound`-Problem** sauber lösen (MikroMCP, doku-gegründet) → Test-WLAN „BF-Main" → SSID→VLAN-Datapaths. - **`bound`-Problem** sauber lösen (MikroMCP, doku-gegründet) → Test-WLAN „BF-Main" → SSID→VLAN-Datapaths.

View File

@@ -9,8 +9,10 @@
| MCP | Zweck / Geräte | Host | Transport / Endpoint | Image | Config | Status | | 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** | | **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 | | **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** |
| **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 | | **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. | | ~~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 Legende: 🟢 live · 🟡 staged (Config da, nicht deployed) · 🔴 blockiert · ⛔ bewusst nicht gemacht

8
mcp/omada/.env.template Normal file
View File

@@ -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

View File

@@ -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=<wizard-passwort>
# OMADA_SITE=BF
# OMADA_SKIP_CERT_VERIFY=true (falls key heißt anders: OMADA_TLS_VERIFY=false)
networks:
default_external:
external: true

View File

@@ -1,28 +1,32 @@
# Omada Software Controller — BF # 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) # Image: mbentley/omada-controller (De-facto-Standard; TP-Link liefert kein offizielles Image)
# #
# ES208G/ES216G = Omada "Easy Managed" → SDN-adoptierbar (verifiziert 2026-06). # 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. # + 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). # Netzwerk: macvlan default_external (10.40.41.0/24) → Controller bekommt eigene IP .175.
# Controller nutzt dann direkt die LXC-IP 10.40.41.126. # L2-Auto-Discovery der Switches (29810/udp Broadcast) funktioniert via macvlan, weil
# der Container als echter L2-Teilnehmer erscheint (eigene MAC/IP).
# #
# Deploy: # Deploy via Portainer API (endpointId=14):
# mkdir -p /opt/docker/omada/{data,logs} # POST /api/stacks/create/standalone/string?endpointId=14
# Manuell:
# mkdir -p /volume1/docker/omada/{data,logs}
# docker compose up -d # 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: services:
omada-controller: omada-controller:
image: mbentley/omada-controller:6.1 image: mbentley/omada-controller:6.2
# ^ >=6.1.x ist Pflicht für ES-Serie (5.x adoptiert sie NICHT). # ^ 6.2 (=6.2.10.17) = aktuelles Stable; Tags geprüft 2026-06-15.
# Tag-Existenz kurz prüfen: docker pull mbentley/omada-controller:6.1 # 6.1 existiert nicht (nur 6.1-openj9), daher 6.2 gewählt.
# (sonst exakten 6.1.x-Tag von hub.docker.com/r/mbentley/omada-controller nehmen)
container_name: omada-controller container_name: omada-controller
restart: unless-stopped restart: unless-stopped
network_mode: host networks:
default_external:
ipv4_address: 10.40.41.175
environment: environment:
- TZ=Europe/Vienna - TZ=Europe/Vienna
- MANAGE_HTTP_PORT=8088 - MANAGE_HTTP_PORT=8088
@@ -33,5 +37,9 @@ services:
- SHOW_MONGODB_LOGS=false - SHOW_MONGODB_LOGS=false
# - SMALL_FILES=true # nur falls MongoDB beim Start auf dem FS zickt # - SMALL_FILES=true # nur falls MongoDB beim Start auf dem FS zickt
volumes: volumes:
- /opt/docker/omada/data:/opt/tplink/EAPController/data - /volume1/docker/omada/data:/opt/tplink/EAPController/data
- /opt/docker/omada/logs:/opt/tplink/EAPController/logs - /volume1/docker/omada/logs:/opt/tplink/EAPController/logs
networks:
default_external:
external: true