- teilprojekte.md: neuer TP14 (Docker-Cutover NAS+pve) + Querverweise TP11 (Track-B/C) + Reihenfolge #3. - NAS ep14 ✅ auf vlan20-Macvlan; CF-Ingress v116; Root-Cause Config-Only-Macvlan-Falle dokumentiert. - Handoff docs/nas-vlan20/handoff/README.md: paste-fertige Anschlussstatements Session A–E (sequenzielle Sessions, keine parallelen Branches — geteilte Live-Infra). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
TP14 — Übergabestatements für neue Sessions
Steuerung: docs/teilprojekte.md → TP14. Runbook: docs/nas-vlan20/RUNBOOK.md.
Reihenfolge: A → B → C → (D jederzeit nach Token-Scope) → E zuletzt.
Entscheidung: sequenzielle Sessions, keine parallelen Branches (geteilte Live-Infra: 1× NAS,
1× pve-LXC, 1× CF, 1× ap1 → Branches isolieren nur Repo-Files, nicht Infra-State → Kollisionsrisiko).
Portainer-API https://10.40.41.126:9443 (nach TP14-Session-B → .20.126), Key mcp/portainer/.env.
Transform-Regeln + Scratch-Skripte: Runbook §„Transform-Regeln". Stack-Files (mit Secrets, gitignored):
docs/nas-vlan20/stacks/. Mapping-Regel durchgehend: letztes Oktett behalten, .41→.20.
Session A — NAS fertigstellen
Kontext: NAS(ep14) ist auf vlan20-Macvlan migriert (DSM .20.10). Container teils exited.
Aufgabe:
- Restcontainer starten/redeployen aus
docs/nas-vlan20/stacks/: oc-stack(112) (prometheus/ alertmanager/node-exporter), default(72) (hms-mqtt), nginx(101) (dashboard-web), oc-central(160), oc-charlie(158), oc-johnny2(150). - gitea(111) deployen →
.20.157; ⚠️GITEA__database__HOST.20.23verifizieren (Rewrite-Annahme). - drawio(107) mit
transform.pyauf vlan20 bringen (.20.139) → deployen. - pve-mcp NEU als Stack (vlan20-only): Spec
docs/nas-vlan20/inspect_pve-mcp.json— imageghcr.io/samik081/mcp-pve:latest,PVE_BASE_URL=https://10.40.41.100:8006,MCP_PORT=3000,MCP_HOST=0.0.0.0,MCP_TRANSPORT=http; Netzvlan20ipv4_address: 10.40.20.173. Danach~/.claude.jsonpve-mcp-URL.41.173→.20.173. - omada-controller Inform-Adresse (UI
https://10.40.20.175:8043) →10.40.20.175, sonst sw2 down. Verifikation:pt.py containersallerunning/.20.x; von.41-Host (gw ap1)curl/pingauf.20-IP; Tunnelcurl -m8 -w %{http_code} https://<host>.emsenhuber.net/→ 200/302.
Session B — pve-Docker-LXC (.126) → VLAN20 (⚠️ ipvlan, nicht macvlan!)
Kontext: pve-LXC(ep2) hängt auf .41, Netz default_external = ipvlan parent eth0:
omada-mcp .176, adguard_bf1 .16, adguard_fm2 .17. Portainer-Server + aktiver CF-Connector laufen
hier. ⚠️ Reihenfolge kritisch.
Aufgabe:
- ep2-Stacks (
adguard,omada-mcp) transformieren.41→.20(omada-mcpOMADA_URL.41.175→.20.175). - Portainer-Zugangspfad für den Move sichern (URL wandert auf
https://10.40.20.126:9443). - LXC in Proxmox auf VLAN20 taggen + IP
.126→.20.126. default_external(ipvlan) weg →vlan20(ipvlan) neu:-d ipvlan --subnet 10.40.20.0/24 --gateway 10.40.20.1 -o parent=eth0. Container erst entfernen (v=false), dann Netz, dann Stacks redeploy.mcp/portainer/.env+PORTAINER_URL+ CF-Ingress (portainer.20.126) nachziehen. Ergebnis: CF-Connector in VLAN20 = #1033-Zielbild (TP11-Track-B/C erledigt). Verifikation: Portainer unter neuer URL, ep2-Container.20.x, Tunnel healthy, pve-lokale Origins (pve-Host.41.100) noch erreichbar.
Session C — Dormante Stacks vlan20-tauglich + Referenz-Sweep
Aufgabe:
transform.pyauf dormante ep14-Stacks: core(43), openclaw(92), openclaw2(97), oc20260307(119), openspeedtest(74), speedtest_tracker(80), technikscheiss(42) →.new-Files (nicht zwingend deployen; 42/43 warendefault_internal→wird vlan20-only).- Referenz-Sweep
.41→.20für gewanderte Hosts: ap1 bf.lan-DNS (MikroMCPmanage_dns_entry, ap1-Mgmt via10.40.10.1— s. Memoryref_ap1_mgmt_access_vlan10), CLAUDE.md,~/.claude.json(omada-mcp.20.176, pve-mcp.20.173),docs/ip-plan.md, CF-Ingress-Rest. SSoTdocs/cf-tunnel-mapping.md.
Session D — CF-Access-Profil für Claude (nicht cutoff-kritisch)
Kontext: *.emsenhuber.net-Access-App hat Policy claude-mcp (service_token) bereits; Secret fehlt lokal.
CF-Token „claude code mcp" hat jetzt Access: Service Tokens: Write+Read (User bestätigt 2026-07-10).
Aufgabe: claude-mcp rotieren (POST /accounts/{acct}/access/service_tokens/{id}/rotate) → CF_ACCESS_CLIENT_ID/
CF_ACCESS_CLIENT_SECRET in mcp/cloudflare/.env (chmod600) → dokumentieren. Details: Memory ref-cf-access-claude-profile.
Session E — TP5-Firewall (ZULETZT)
Erst wenn ALLE Origins/Connectoren in VLAN20 (nach A+B+C). Least-Privilege je VLAN; Deny-by-default fertigziehen.
Kritische Gotchas (gelten für alle Sessions)
- Macvlan/ipvlan-Parent exklusiv → altes
default_externalMUSS weg, bevorvlan20anlegbar. - Host↔eigene-Macvlan-Isolation: ein Connector auf demselben Host erreicht dessen Macvlan-Container NICHT → Connector muss auf anderem Host in VLAN20 laufen (darum pve-LXC → VLAN20).
- Portainer lebt im pve-LXC → dessen Move ändert die Mgmt-URL; Zugang vorher sichern.
- Container-Removal unkritisch (Stack-Def + Ownership bleiben); Recreate via API macht admin-owned →
besser via Stack-Redeploy (bleibt User-owned).
v=false= Volumes bleiben. - Portainer-Macvlan-Assistent legt bei nur Schritt 1 ein Config-Only-Netz an (
Driver:null) → echtes Netz nur per API in einem Schritt anlegen.