Nautobot: ap1 stand als einziges Geraet noch auf SoftwareVersion 7.24 (ap2, ap3, core, branch waren bereits richtig) -> auf 7.24.1 gesetzt. Danach Backup/Intended/Compliance. Folge fuers Runbook: aus zwei container.npk wird EINE. Die Zwei-Dateien-Regel vom 08-30 war rein versionsbedingt, nicht modellbedingt - cAP ax und hAP ax^2 teilen sich die arm64-Pakete. §0, §2.1, §3.1 und Falle 1 umgeschrieben. Die Regel dahinter bleibt: npk muss exakt zur ROS-Version passen, sonst ist das Paket nach dem Reboot inaktiv - ohne Fehlermeldung. Neue Compliance-Drift, NICHT von dieser Session und bewusst offen gelassen: crs326-core / wifi-security - sec-main hat am Geraet ft-over-ds=no, Soll ist yes (ft=yes ist korrekt). Kam mit dem Upgrade. 134/135 compliant. Braucht eine Entscheidung (Geraet korrigieren oder neuen Wert zum Soll erklaeren) plus Re-Provisionierung der CAPs; ein Re-Baseline ohne Entscheid wuerde die Drift-Erkennung wertlos machen. Handover docs/handoff-20260831-tp16.3-vorort-session.md fuer die Folgesession (§2/§3: npk, device-mode, Container). Enthaelt u.a. den Hinweis, dass ein fehlschlagendes /tool fetch vom AP auf Caddy KEIN Fehler ist, sondern die SNI-Abweisung - und dass der TLS-Alert sogar beweist, dass die Freigabe traegt. Offen notiert, nicht angelegt: TP-Vorschlag "dedizierter untagged-VLAN99-Port je Switch" (Out-of-Band-Mgmt) - Auslöser war, dass crs326-branch beim Core-Neustart nicht erreichbar war. Wartet auf Christophs Okay. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
7.5 KiB
Handover — TP16.3 §2/§3: Container-Bootstrap auf ap1 / ap2 / ap3
Erstellt 2026-08-31. Zielsession: §2 + §3 des Runbooks
tp16.3-bf-public-ap-connector-runbook.md— alsocontainer.npk,device-mode, Container. Vor Ort, weil jeder AP eine physische Bestätigung braucht. Nicht Teil dieser Session: der CNAME-Flip (§5) und der Abbau (§6).
1. Was vor dir schon erledigt ist — nicht nochmal machen
| Punkt | Stand | Nachweis |
|---|---|---|
| §1 Blocker A — Redirect-Schleife | ✅ 08-31 | bf-public-Ingress → https://10.40.20.40:443, originServerName je Regel, zurückgelesen |
§1 Blocker B — Firewall vlan99→vlan20:443 |
✅ 08-31 | via Nautobot GC (Plan Completed), Position vor TP5: log-only geprüft, funktional gegen Caddy nachgewiesen |
§1 Blocker C — ROUTER_AP3_PASS |
✅ 08-31 | in ~/.secrets/credentials.env, REST-Auth ap3 = 200 |
| Rollback-Snapshots | ✅ 08-30 | docs/cf-backup/*-20260830-vor-tp16.3-schnitt.json |
| ROS-Upgrade auf 7.24.1 | ✅ 08-31 (User) | alle fünf Geräte, RouterBOOT mitgezogen |
⇒ Die Session startet bei §2. Wer §1 nochmal anfasst, arbeitet doppelt.
2. Die eine Änderung gegenüber dem Runbook-Stand vom 08-30
🎉 Aus zwei container.npk ist eine geworden. Christoph hat am 08-31 alle fünf MikroTik auf
7.24.1 gehoben. Damit gilt:
container-7.24.1-arm64.npk → ap1, ap2 UND ap3
Die frühere Zwei-Dateien-Regel war rein versionsbedingt, nicht modellbedingt — cAP ax und
hAP ax² teilen sich die arm64-Pakete. Das Runbook ist entsprechend umgeschrieben (§0, §2.1, §3.1,
Falle 1).
⚠️ Die Regel dahinter bleibt: container.npk muss exakt zur ROS-Version passen. Vor dem Upload
/system resource print lesen. Falsche Datei ⇒ Paket ist nach dem Reboot inaktiv, ohne Fehlermeldung.
3. Ablauf in einem Satz
Je AP, einzeln und vollständig, Reihenfolge ap3 → ap2 → ap1:
.npk hoch → Reboot (SSH, nicht MikroMCP) → /system package print prüfen →
device-mode update container=yes → physisch bestätigen → veth + masquerade →
.tar hoch → /container add file= → starten → .tar löschen → Log prüfen.
Details, Befehle und Abnahmekriterien: Runbook §2 und §3. Hier nur die Punkte, die man erfahrungsgemäß falsch macht:
- 🔴 Reboot geht NICHT über MikroMCP (ROS kennt den
delay-Parameter nicht,run_commandist für/system reboot*gesperrt) →SSHPASS="$PW" sshpass -e ssh admin@<ip> "/system reboot". Niemalssshpass -p— das schreibt das Passwort inps. - 🔴
~/.secrets/credentials.envin zsh sourcen schlägt still fehl (rohe WireGuard-Zeilen ab ~Z. 69). Variablen bleiben leer, und der Fehler sieht aus wie ein ungültiger Token. Immerbash -c. - 🔴 Kein PoE an den CRS326 (beide haben gar kein PoE-Menü) ⇒ kein Remote-Power-Cycle. Die Bestätigung ist wirklich physisch: Stecker ziehen/stecken (Weg A, eindeutig) oder Reset-Knopf am laufenden Gerät kurz drücken (Weg B). Weg B nie während des Bootens — das wäre ein Werksreset.
- 🔴 Ein Container pro AP. Nach dem Import bleiben ~39 MB. Kein Caddy, kein AGH dazu.
- ⚠️ Jeder AP rebootet zweimal → WLAN dieses APs ist je ~1–2 min weg. Die CAPs holen ihre Config per L2-Discovery vom Core. Nicht ungeduldig nachprovisionieren.
- ⚠️ WLAN-Abnahme ist eine frische DHCP-Lease je SSID, nicht die Registration-Table.
Erwartetes Ergebnis am Ende: bf-public meldet healthy mit Connectoren (Richtung 12 = 3 APs × 4
CF-Edge). 🔴 healthy heißt nur „Connector redet mit Cloudflare", nicht „Origin antwortet" — der
Beweis für die Strecke bis Caddy ist §5.1, und der gehört in die Folgesession.
4. Was du unterwegs sehen wirst und nicht als Fehler behandeln darfst
/tool fetch von einem AP auf https://10.40.20.40 schlägt mit einem TLS-Alert fehl.
Das ist korrekt und erwartet: Caddy weist Handshakes ohne passenden SNI ab (gemessen: ohne SNI
000, mit korrektem SNI 200). Der Alert beweist sogar, dass das Paket ankommt — ein TLS-Alert
kann nur vom Server kommen, die Firewall-Freigabe trägt also. cloudflared schickt den richtigen SNI
über originServerName. Nicht „reparieren".
5. Offene Punkte, die NICHT in diese Session gehören
- 🔴 Compliance-Drift
crs326-core/wifi-security(134/135).sec-mainhat am Gerätft-over-ds=no, Sollyes(ft=yesist korrekt). Kam mit dem 7.24.1-Upgrade. Braucht eine Entscheidung — Gerät korrigieren oder neuen Wert zum Soll erklären — plus Re-Provisionierung der CAPs. ⚠️ Kein Re-Baseline ohne Entscheid, das macht die Drift-Erkennung wertlos. - 🆕 TP-Vorschlag (Christoph 2026-08-31, noch nicht angelegt): dedizierter untagged-VLAN99-Port
auf beiden Switches. Auslöser ist eine reale Beobachtung: beim Core-Neustart war
crs326-branchnicht mehr erreichbar, weil das Management über den Core läuft. Ein Out-of-Band-Zugang je Switch (ein Port, untagged VLAN99, Laptop direkt) macht den Branch unabhängig vom Core. Bewusst nicht eigenmächtig angelegt (TP-Management-Konvention: vorschlagen, abstimmen, dann anlegen). ⇒ Nummer vergeben und Abschnitt schreiben, sobald Christoph zustimmt. 💡 Berührt TP16.3 direkt: die Vor-Ort-Session rebootet dreimal Geräte, deren Mgmt am Core hängt. - 🟡
mcp/mikromcp/config/routers.yamlhältrosVersion: "7.24"für alle fünf — jetzt7.24.1. ⚠️ Die Datei liegt aufmain, nicht auf diesem Branch (der Worktree hat eine ältere Kopie ohne ap3). Der Fix gehört aufmain, nicht hierher — sonst gibt es einen Konflikt. - CNAME-Flip (§5) und Abbau (§6) — eigene Session, §6 frühestens 7 Tage nach dem Flip.
6. Zugänge und Werkzeuge
| Was | Wie |
|---|---|
| APs | MikroMCP ap1/ap2/ap3 (Reads), SSH admin@10.40.99.11/.12/.13, Creds ROUTER_AP{1,2,3}_PASS in ~/.secrets |
| Reboot | bash -c 'set -a; . ~/.secrets/credentials.env; set +a; SSHPASS="$ROUTER_AP3_PASS" sshpass -e ssh admin@10.40.99.13 "/system reboot"' |
| Config-Änderungen an MikroTik | ausschließlich Nautobot GC (nautobot/gc-manual-plan.py), Token aus docs/nas-vlan20/stacks/210-nautobot.yml (gitignored, nur im Haupt-Checkout) |
| Cloudflare | CF_API_TOKEN / CF_ACCOUNT_ID in ~/.secrets, Zone 1b5bc02fdf61b6b989afde543f3f4134 |
| Caddy | caddy-bf1, LXC 130 auf pve, 10.40.20.40; Logs ssh root@10.40.20.100 'pct exec 130 -- journalctl -u caddy -n 50' |
⚠️ device-mode- und Container-Schritte sind KEINE Golden-Config-Sache — sie sind Bootstrapping am
Gerät (wie die genehmigte Ausnahme #2 beim CRS326-Bring-up). Die GC-Pflicht gilt für
/ip firewall, /interface & Co. Wenn die Session eine Firewall- oder Interface-Zeile braucht:
über gc-manual-plan.py, nicht per Direkt-Write.
7. Abnahme dieser Session
/system package printzeigt auf allen drei APscontainerin 7.24.1, nicht disabled/system device-mode printzeigtcontainer: yesauf allen dreien/container printzeigt je AP einen Containerrunning.tarje AP gelöscht (Flash zurück)bf-publicmeldethealthymit Connectoren > 0- WLAN je AP zurück — frische DHCP-Lease pro SSID, nicht Registration-Table
- Compliance nicht schlechter als 134/135 (die
wifi-security-Drift aus Punkt 5.1 bleibt bestehen)