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:
19
CLAUDE.md
19
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/<datei>.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).
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
8
mcp/omada/.env.template
Normal file
8
mcp/omada/.env.template
Normal 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
|
||||
31
mcp/omada/docker-compose.yml
Normal file
31
mcp/omada/docker-compose.yml
Normal 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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user