- Repo-Stand ergaenzt: alles liegt auf main (e474e5e), von dort starten.
- Live-Stand vor der Uebergabe gegengeprueft (12 Connectoren, drei
Container running, Caddy mit SNI 200 / ohne SNI 000) und im Kopf
vermerkt, damit die Folgesession weiss, wie alt die Zahlen sind.
- TP30 als von Christoph vertagt markiert, mit dem Hinweis, dass der
Superuser-Token bis dahin kompromittiert bleibt.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
8.4 KiB
Übergabeprompt — TP16.3 §5: CNAME-Flip auf bf-public
Zum Einfügen in eine frische Session. Erstellt 2026-08-31, direkt nach §2/§3. Live-Stand am 2026-08-31 gegengeprüft: 12 Connectoren, drei Container
running, Caddy mit SNI 200 / ohne SNI 000. Alles unterhalb der Linie ist der Prompt.
TP16.3 / TP31 Schritt 5 — §5 CNAME-Flip (Repo ~/dev/bf-infra).
Aufgabe: §5 des Runbooks docs/tp16.3-bf-public-ap-connector-runbook.md ausführen — die vier
öffentlichen Namen von den Alttunneln auf bf-public umhängen. §6 (Abbau) gehört NICHT dazu,
frühestens 7 Tage nach dem Flip.
PFLICHTLEKTÜRE ZUERST, in dieser Reihenfolge
docs/handoff-20260831-tp16.3-paragraph2-3-durch.md— Ergebnis und Funde der Vorsessiondocs/tp16.3-bf-public-ap-connector-runbook.md§5 (und §7 Rollback)docs/teilprojekte.md(Quick-Index + Ist-Stand + TP16.3-Abschnitt)
REPO-STAND
Alles liegt auf main (e474e5e, Gitea admin/bf-infra) — Haupt-Checkout, Remote und der
Arbeitsbranch der Vorsession sind identisch. Von main aus starten, nichts mehr mergen.
Die Vorsession lief im Worktree claude/stoic-khayyam-09b644; der ist erledigt.
AUSGANGSLAGE — nicht nochmal machen
bf-publicist healthy mit 12 Connectoren (ap1/ap2/ap3, je eincloudflared 2026.6.1, Containerrunning,start-on-boot=yes). Tunnel-ID48d3b0b6-7233-4781-a76a-1de4a5e957ce.- Ingress steht auf
https://10.40.20.40:443mitoriginServerNameje Regel (Blocker A behoben). - Firewall-Freigabe
vlan99 → vlan20:443aufcrs326-coreliegt und ist verifiziert (Blocker B). - Caddy antwortet mit korrektem SNI 200, ohne SNI 000 — gemessen, das ist gesundes Verhalten.
- Rollback-Material:
docs/cf-backup/— Ingress-Configs, CNAMEs inklusive Record-IDs, und für drei Tunnel zusätzlich der ältere Stand als*-vor-hostname-schnitt.json.
🔴 ZUERST ENTSCHEIDEN, BEVOR EIN NAME GEFLIPPT WIRD
Compliance steht auf 128/135. Sechs extra-Drifts, zwei je AP: ip-address
(172.17.0.1/24 interface=veth-cf) und ip-firewall-nat (masquerade, Kommentar
TP31: cloudflared egress). Sie sind inhaltlich richtig — ohne sie läuft kein Container —, aber
sie stehen nicht im Soll, weil Runbook §3.4 Direkt-Writes vorschreibt für Features, die unter
Golden-Config-Kontrolle stehen.
Der saubere Weg ist, sie ins Soll zu heben (AP-Template bzw. ConfigContext ap-common).
🔑 Bewusst KEINE Transaktion: gc-transaktion.py ist für befristete Versuche da (so wie
TP25-fund-e-ft-over-ds). Das veth/masquerade soll dauerhaft gelten — Dauerzustand gehört
ins Template, nicht in eine Transaktion mit Ablaufdatum.
🔴 Kein Re-Baseline (macht die Drift-Erkennung wertlos), kein Rückbau (killt die Tunnel).
⚠️ Dabei mitentscheiden, ob /interface veth überhaupt erfasst sein soll — dafür existiert heute
keine ComplianceRule, deshalb erzeugt veth auch keine Drift.
Mit ungeklärter Drift in den Produktivpfad zu gehen ist die eine Sache, die diese Session nicht tun sollte. Christoph entscheidet, nicht die Session.
🔴 Die siebte Drift ist KEINE Drift im Sinne eines Versehens: crs326-core / wifi-security
(ft-over-ds=no) ist TP25 Fund E, Hebel 1 — am 2026-08-31 um 08:09 bewusst gesetzt und als
offene Transaktion TP25-fund-e-ft-over-ds geführt (Scope wifi-security, Ablauf 2026-09-03).
Sie gehört einer anderen, laufenden Session; grün machen würde deren Versuch unsichtbar machen.
⚠️ Merkregel: vor jeder Drift-Bewertung python3 nautobot/gc-transaktion.py status lesen.
Drift aus einem laufenden Versuch sieht identisch aus wie ein Versehen — genau dafür gibt es das
Werkzeug. (Diese Zeile behauptete zuerst, die Drift käme vom 7.24.1-Upgrade. Falsch: der Core wurde
erst um 14:36 gehoben, sechseinhalb Stunden nach dem Hebel.)*
REIHENFOLGE
Erst test-tp163 (§5.1), dann n8n → gitea → hass → vw — steigende Kritikalität, vw
zuletzt. Nach jedem Namen die Abnahme aus §5.3, erst dann der nächste.
WICHTIGSTE FALLEN
- 🔴
healthybeweist nichts über das Origin. Der Tunnelstatus sagt nur, dass der Connector mit Cloudflare redet. Die Wildcard-Access-App*.emsenhuber.netliefert für jeden Namen ein sauberes 302 — ein toter Dienst sieht so monatelang gesund aus (dergrafana-Fall). Der einzige Streckenbeweis ist §5.1 gegen einen Testnamen. - 🔴 WARP muss AUS sein. Mit aktivem WARP läuft der Test über den Mesh und beweist den öffentlichen Weg nicht — dieselbe Fehldiagnose-Klasse wie der ICMP-Fall 2026-08-13. Testen von außerhalb des LAN, über Mobilfunk.
- 🔴
vw= Bitwarden läuft auf Access-Bypass. Vor dem Flip prüfen, dass die Bypass-Policy fürvw.emsenhuber.netsteht — sonst sperrt der Flip alle Bitwarden-Clients aus. - 🔴
gitea: Access gilt nur der Web-UI, Git-/API-Pfade laufen daran vorbei. Push von außen vor und nach dem Flip testen, nicht nur die UI. - 🔴
hass: die Companion-App kann kein Access-Login. Nach dem Flip die App auf dem Handy über Mobilfunk prüfen, nicht nur den Browser. - ⚠️
ERR_TOO_MANY_REDIRECTSnach einem Flip = Blocker A ist zurück (Ingress auf:80statt:443, oderoriginServerNamefehlt). Sofort zurückflippen, nicht debuggen während der Name tot ist. - ⚠️
~/.secrets/credentials.envlässt sich in zsh nicht sourcen (rohe WireGuard-Zeilen ab ~Zeile 69) — Variablen bleiben still leer, das sieht aus wie ein ungültiger Token. Immerbash -c. - 🔴 Maskierung: Muster auf den Schlüsselnamen ankern, nie auf ein Trennzeichen.
grep -n "TOKEN" datei | sed 's/:.*TOKEN/…/'maskiert nicht —grep -nstellt<zeile>:voran, und das matcht das Muster. So sind in der Vorsession zwei Nautobot-Tokens ins Transkript geraten. Sicher ist nursed -E 's/(TOKEN|PASSWORD|SECRET|KEY|PASS)=.*/\1=<redacted>/'.
GOVERNANCE
- Config-Änderungen an MikroTik-Geräten ausschließlich über Nautobot Golden Config
(
nautobot/gc-manual-plan.py), nicht per Direkt-Write. Nautobot:http://10.40.20.30:8080(Port 8080, nicht 80 — der Runbook-Stand nannte lange nur den Host), Token indocs/nas-vlan20/stacks/210-nautobot.yml(gitignored, nur im Haupt-Checkout). - Cloudflare-Änderungen sind outward-facing: DNS-Flip und Ingress-Edits vor der Ausführung mit Christoph bestätigen, einer nach dem anderen.
- MCP-Lifecycle aktiv melden, falls sich daran etwas ändert.
OFFENE PUNKTE, DIE NICHT IN DIESE SESSION GEHÖREN
- Rotation zweier Nautobot-Tokens (
NAUTOBOT_SUPERUSER_API_TOKEN,NAUTOBOT_GITEA_TOKEN) — in der Vorsession ins Transkript geraten, als verbrannt zu behandeln. Gehört zu TP30. ✅ Von Christoph am 2026-08-31 ausdrücklich vertagt („kommt später dran") — nicht von selbst anfangen, aber auch nicht vergessen: bis zur Rotation ist der Nautobot-Superuser-Token kompromittiert. crs326-core/wifi-security/ft-over-ds— offene TransaktionTP25-fund-e-ft-over-dseiner laufenden TP25-Session. Nicht anfassen, nicht grün machen, Ablauf 2026-09-03.mcp/mikromcp/config/routers.yamlmeldetrosVersion: "7.24"für alle fünf, live ist7.24.1— kosmetisch, gehört aufmain.- §6 Abbau (sechs Container, drei Alttunnel) — frühestens 7 Tage nach dem Flip.
🚫
terpene-cloudflared(LXC 400) undfm.emsenhuber.netbleiben, sie stehen imdocker psdirekt neben den zu löschenden. Namen lesen, nicht Zeilen zählen.
ABNAHME DIESER SESSION
- Entscheidung zu den sechs Drifts getroffen und umgesetzt (Compliance erklärt oder bereinigt)
test-tp163von außerhalb des LAN ohne WARP: Access-Login, keine Redirect-Schleife- Testname und Testregel danach wieder entfernt
- Alle vier Namen geflippt, je einzeln mit 15 min Beobachtung, kein 530/1033
gitea-Push von außen funktioniert nach dem Fliphass-Companion-App über Mobilfunk funktioniert nach dem FlipvwBitwarden-Clients funktionieren nach dem Flip- Caddy-Log zeigt die Requests (
ssh root@10.40.20.100 'pct exec 130 -- journalctl -u caddy -n 20')
ARBEITSWEISE
Bestandsaufnahme vor Plan. Eine große Fragenrunde statt vieler kleiner. Bei Abweichungen zwischen
Doku und Live-Stand: Drift melden, nicht stillschweigend korrigieren. Vor jedem Flip den
Rollback-Weg (§7, Record-IDs in docs/cf-backup/cnames-tunnel-*.json) parat haben.