Commit Graph

417 Commits

Author SHA1 Message Date
840d57bca3 TP31 Schritt 5: cloudflared-Runbook ap1/ap2 + CNAME-Flip
Vorbereitetes Runbook für TP31.5 (cloudflared-Container auf hAPs statt
TUN-Device-Workaround, da WARP-Connector auf ROS nicht möglich). Inhalt:

- Image-Build (RouterOS 7.x container, 70 MB Budget je AP)
- Pro AP: veth, interface-list-Mitgliedschaft, container-env
- CNAME-Flip von CF-Tunnel auf ap1/ap2 (DNS-Propagation, Rollback)
- Voraussetzungen: WAN-Healthcheck, Tunnel-Secret aus credentials.json
  (siehe routeros/cloudflared/.gitignore im Folge-Commit)

Status: vorbereitet, nicht ausgeführt. Stand 2026-08-27.
2026-08-28 19:08:51 +02:00
27863c1f2e shelly-mcp: Build-Materialien (Dockerfile + Anleitung)
Vorbereitung für Session B (Deploy auf DS923). Datei-Set reicht für
Image-Build ohne weitere Quellen aus dem Repo:

- Dockerfile: python:3.12-slim, mountbares /config ohne .env-COPY
- requirements.txt: mcp[cli]>=1.0, starlette>=0.36 (StreamableHTTP)
- BUILD.md: rsync → docker build → Portainer-Container-Deploy
- .gitignore: .env (Schema-Vorlage lokal) + __pycache__ ausklammern

Die Live-Instanz .env und der Container selbst werden in Session B
gebaut, nicht hier. Kein Secret in Git.
2026-08-28 19:08:43 +02:00
759491b512 MCP-Bestand korrigiert + Mac-mini-Performance-Restriktion
- gitea-mcp + n8n-mcp nachgetragen (waren real live, aber aus dem Inventar verschollen)
- pve-mcp: SSE-Doku -> StreamableHTTP-Realitaet
- shelly-mcp/portainer-mcp: bewusst KEIN MCP-Client (User-Direktive 2026-08-28)
- Mac mini = n8n-Host, NICHT zentraler MCP-Host (Performance-Restriktion)
- ~/.claude.json + opencode.jsonc: 9 MCPs identisch (vorher 7 vs. 11 Asymmetrie)
- docs/mcp-host-policy.md: SSoT fuer Host->FQDN/Stack-Mapping
- docs/handoff-20260828-mcp-bestand-und-performance.md: Folge-Sessions A/B/C

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-28 18:40:05 +02:00
claude-code
dc38d821c2 session-briefing-20260828.md: TL;DR + Lese-Reihenfolge für neue Sessions
Eine Seite, die eine frische Session in 30 Sekunden auf Stand bringt:
TL;DR, Lese-Reihenfolge (Handoff → Anker → TP35), sofort-tun-Liste,
Übergabe-Mechanik, Mid-Action-Checkpoint, Commit-Hinweis-Regel, Was-offen.

Löst das 'Bahnhof'-Problem, das Christoph beim Session-Neustart
beobachtet hat.
2026-08-28 17:33:23 +02:00
claude-code
5797364e4d drift-korrektur: Auth-Sanierung (Bearer) gehört in TP16.3, nicht als Vorab-Notiz
TP16.3 existiert seit 2026-08-17 (Quick-Index Z. 194, Body Z. 401,
Runbook tp16.3-nautobot-mesh-only-runbook.md) und deckt 'alle Tools
über Caddy oder CF + Caddy (extern)' + Auth-Sanierung bereits ab.

Mein Fehler: ich habe im Index nicht nachgeschaut und einen Vorab-Punkt
formuliert, der TP16.3 doppelt. Anwender hat das in dieser Session
explizit markiert ('das darf dir kein 2. mal passieren').

Fix:
- Session-Anker: Vorab-Notiz entfernt, ersetzt durch Verweis auf TP16.3.
- TP16.3-Body: technische Notiz 'n8n-mcp Accept-Header-Strike +
  Auth-Sanierung' eingepflegt (SSE-Header-Konsequenz für künftiges
  Caddy-Fronting, Reihenfolge TP16.3 → TP35 Schicht 2).

Lehre: vor jeder Aussage 'gibt's noch nicht' oder 'neuer TP nötig':
erst grep auf den Quick-Index in teilprojekte.md.
2026-08-28 17:18:16 +02:00
claude-code
a2465b8586 session-anker: Auth-Sanierung (Bearer) als Vorab-Notiz für Cloudflare-Tunnel-Punkt
n8n-mcp-Accept-Header-Strike wird mit dem noch kommenden CF-Tunnel-Punkt
gelöst, nicht heute. Bearer-Authentifizierung soll einmal sauber per
Caddy/CF-Access zentralisiert werden — TP35-Schicht-2 Endform hängt davon.

Inhalt: nur Doku, keine Migration, kein neuer TP, keine Config-Änderung.
2026-08-28 17:14:16 +02:00
claude-code
8ad355e059 session-anker: n8n-mcp failed = Accept-Header-Strike (406), nicht Token-Fehler
Diagnose: n8n-mcp verlangt 'Accept: application/json, text/event-stream'
(StreamableHTTP-Modus). opencode mcp list schickt nur 'application/json',
kriegt 406, wertet als failed. Echter Tool-Aufruf nutzt richtigen Header,
deshalb Sidebar grün. Bearer-Token + Server sind gesund (200 OK mit
richtigem Accept-Header, serverInfo: n8n-documentation-mcp 2.57.1).

Konsequenz: 'failed' in mcp list ist nicht 'kaputt' sondern 'Probing-Header
zu strikt'. Sidebar-Status bleibt Wahrheit.
2026-08-28 17:11:47 +02:00
claude-code
d711625d29 session-anker: MCP-Status-Check Cold-Start-Race notiert (n8n-mcp verified) 2026-08-28 17:07:10 +02:00
claude-code
389b146a91 tp35 angelegt + session-anker: MCP-Schichtung global/projekt/user
TP35 = Konzept + Schichtung, nicht die Umsetzung. Ausarbeitung
in eigener Session pro Projekt mit eigenem Handover-Post.

Scope (6 Schichten):
1. MCP-Schichtung global/projekt/user
2. Credentials-Schichtung (alle Secrets in ~/.secrets/exports.zsh)
3. 3-Schicht-CLAUDE.md (öffentlich/gitignored/global)
4. Announcement-Mechanismus (Hybrid)
5. Backup-Guard (3 Tage aktiv, 5 Commits oder 1000 LOC diff)
6. /projektstatus-Skill global (als Erstes)

Begleitend: docs/session-20260828-decisions.md = Mini-Anker mit
F1-F5-Begründungen + 3 Korrekturen unterwegs (Ollama 2 Hosts,
uwe-job-bewerbung doch dabei, Backup-Guard = aktive Tage).

Backups: 12/12 gzip-valid in ~/dev/.pre-opencode-migration-backups/20260828-150335/
2026-08-28 17:04:33 +02:00
claude-code
799e3efaee handoff: pre-opencode-migration, backups done, plan open, mid-action correction received 2026-08-28 15:18:06 +02:00
7e81ce6a36 handoff: 2026-08-28 — MCP-Cleanup, shelly-mcp-Tote, nächste Schritte
- Neue Handoff-Datei für den konkreten nächsten Schritt (im Gegensatz zur
  Inventur-Handoff, die den Master-Plan zeigt).
- Dokumentiert: cannaleo/terpene-pg entfernt, n8n-mcp repariert,
  shelly-mcp-Tote entdeckt, CLAUDE.md-Erweiterung.
- Liste der offenen Aktionen für die nächste Session: bf-network-r6
  archivieren, terpene-Caddyfile-Block, STATUS.md Z.47 korrigieren,
  n8n-mcp auch in ~/.claude.json, gitea-mcp-Init-Problem.
2026-08-28 14:40:08 +02:00
046f103a89 claude.md + handoff: shelly-mcp-Tote erkannt, MCP-Lifecycle-Regeln
- shelly-mcp läuft auf keinem Host (kein Mac-Prozess, kein Container auf
  NAS/pve). INVENTORY-Handoff hatte den Stand nicht aktualisiert.
  Config jetzt enabled=false, neuer Punkt im Ist-Stand-Block.
- 3 neue Lessons-for-Sessions-Regeln: MCP-Änderungen aktiv melden,
  Host vor Edit verifizieren, tote MCPs ins Projekt-Repo.
- 'Was du sofort wissen musst' um shelly-mcp-Tote ergänzt.
2026-08-28 14:24:31 +02:00
d30267920a Merge remote-tracking branch 'bf-network-r6/main'
# Conflicts:
#	CLAUDE.md
#	README.md
#	caddy/Caddyfile
#	docs/teilprojekte.md
#	mcp/INVENTORY.md
#	nautobot/mikrotik_routeros.j2
2026-08-27 22:02:40 +02:00
b4419e2d3d mcp/INVENTORY.md: VLAN-Schema 10.40.<vlan>.<oktet>, Omada RETIRED markiert
- Netzwerk-Schema-Hinweis: 10.40.41.x ist tot, alle Hosts auf neues Schema.
- MikroMCP/pve-mcp/komodo-mcp/portainer-mcp: .41.x → .20.x korrigiert.
- omada-mcp + omada-controller: ⛔ RETIRED 2026-08-27 (Omada-Stack raus).
- 'Claude Code' → 'opencode' (Tool-Wechsel, s. Inventur-Handoff).
- 'später'/'Router-Cutover' Phrasen an aktuelle Realität angepasst.
2026-08-27 21:44:08 +02:00
c2b075eaf1 claude.md: Pflichtlektüre + Master-Struktur gekürzt, Lessons for Sessions ergänzt
- Header (Z.1–23): Inventur-Hinweise rein, Master-Struktur (bf-infra/bf-network-r6/
  bf-golden-config/blaueblueten-n8n) als eigener Block, terpene-Stand.
- Pflichtlektüre-Reihenfolge explizit (1. teilprojekte.md Quick-Index, 2. handoff,
  3. cf-tunnel-mapping/archiv bei Bedarf, 4. Inventur-Handoff).
- 'Lessons for Sessions' als neuer Abschnitt am Ende: 4 Verhaltensregeln
  (Bestandsaufnahme vor Plan, große Fragenrunde, Master-Frage früh,
  Drift vor Lösungen) + Checkliste vor Edit-Vorschlägen.
2026-08-27 21:36:46 +02:00
218b79188b inventur + tp34: Architektur-Vorschlag Caddyfile-via-Nautobot/GC
- Handoff-Datei docs/handoff-20260827-inventur-und-architektur.md mit Drift-Befund
  (10 Punkte), Asymmetrie (bf-infra lokal-only / bf-golden-config Gitea-only),
  Inventar-Entscheidung, Architektur-Skizze (Nautobot-Datenmodell +
  GC-Workflow), Übergangsplan, Selbstkritik.
- TP34 in docs/teilprojekte.md als Stub mit Verweis auf Handoff-Architektur-
  Abschnitt. Quick-Index-Eintrag (Zeile 207).
- Erster Anwendungsfall: terpene.teilzeitladen.xyz (Mac-mini-Backend
  10.40.20.167:8890, Caddy-Block kommt als Quick-Win).
2026-08-27 21:35:53 +02:00
8d2b4a71e4 aufräumen: Inventar-Pipeline stillgelegt, Root-handoff ins docs/, README präzisiert
- inventory/*: build.py/XLSX-Pipeline seit 2025-06 stale, Inventar erneuert sich
  nicht seit Core-Cutover; MikroMCP/CF/Portainer liefern Live-Daten.
- handoff.md → docs/handoff-20260827-hubert-und-altlasten.md (Konventionsbruch
  aus der aktuellen Session korrigiert)
- README.md: komplettes Rewrite mit Master-Struktur-Tabelle (bf-infra aktiv,
  bf-network-r6 Archiv, bf-golden-config Bot), Übergangspfad, Status-Block
2026-08-27 21:34:58 +02:00
1d307721ad TP23 Stufe 2 + TP31 Schritt 4: AdGuard split-horizon mit .bf.-Suffix, Caddyfile .bf.-FQDNs
- AGH 110/111: conditional upstream [/bf.emsenhuber.net/]10.40.20.1
- 47 Rewrites: 16 Service->Caddy (inkl. .bf.), 10 Hosts mit .bf., suffixlose parallel
- Caddyfile: interne Sites mit .bf.-Alias (public vw/hass/n8n/gitea ohne)
- DHCP: alle 7 VLANs zeigen auf .36/.37 (domain=emsenhuber.net)
- Firewall-Regeln auf .36/.37 bereits scharf
- nas.emsenhuber.net endgueltig entfernt (war schon in 1d569fa)
- Ist-Stand-Block + Status-Tabelle nachgezogen
2026-08-26 21:22:39 +02:00
6234e61c4e transaktionen: agh-bf1-AdGuardHome als Soll-Zustand fuer TP23 Stufe 2
Die Datei war bereits im Working Tree, aber ohne klaren Zweck -- jetzt
umbenannt auf .snapshot.yaml und mit Marker-Kommentar versehen, der sagt:
- das ist KEINE Transaktions-Akte (kein .json)
- das ist auch KEIN Vor-Zustand zum heutigen nas.emsenhuber.net-Edit
- das ist die AGH-Komplett-Config mit bereits angewandtem Standortsuffix
  (*.bf.emsenhuber.net), die beim Bau des AGH-Paars (110/111) in der
  naechsten Session als Soll-Zustand gilt.

upstream_dns ist auf /bf.emsenhuber.net/ bedingt (Suffix-Form), 26 von
30 Rewrites haben .bf.-Suffix, 4 Public (vw/hass/n8n/gitea) bleiben ohne
Suffix.
2026-08-26 21:01:01 +02:00
8a3601d95e handoff: 2026-08-26 — TP31 Schritt 4 fortsetzen + Suffix-Sweep
Baut auf handoff-20260825 auf (AdGuard-Paar + Split-Horizon) und ergaenzt
den Auftrag um den heute eingefuehrten Standortsuffix-Sweep: alle BF-Hosts
in AGH heissen kuenftig <host>.bf.emsenhuber.net statt ohne Suffix.

nas.emsenhuber.net ist seit 1d569fa weg (Commit direkt vorher).
2026-08-26 20:58:51 +02:00
1d569fa0f5 TP31: nas.emsenhuber.net entfernt, Standortsuffix als Regel
`nas.emsenhuber.net` war nur als AGH-Rewrite auf 10.40.20.10 vorhanden,
zeigte aber nirgends hin: kein CF-CNAME, kein Caddyfile-Eintrag (der
hatte von Anfang an ds-bf.emsenhuber.net fuer Synology DSM).

Mit dem TP23-Stufe-2-Cutover wandert die DNS-Aufloesung in ein
AdGuard-Paar und der Rewrite-Satz wird neu aufgebaut. Die Regel
ist ab jetzt: Hosts, die es an mehreren Standorten gibt, heissen
immer `<host>.<site>.emsenhuber.net` — kein gemeinsamer Name
ohne Suffix.

Andere namensgleiche Hosts (macmini/mfc/tv/docker/platform-pg/
core/ap1/ap2/branch) bleiben vorerst ohne Suffix in AGH und werden
einzeln in der TP23-Stufe-2-Session bewertet.
2026-08-26 20:57:21 +02:00
535a3bd7b9 TP23 Stufe 2: AGH-Paar als DNS-Resolver + DHCP auf emsenhuber.net
- adguard/AdGuardHome.yaml: AGH-Wizard-Setup (27 Rewrites ohne .bf, DoH zum CF-Gateway, conditional emsenhuber.net).
- nautobot/mikrotik_routeros.j2: DHCP dns-server=10.40.20.36,.37, domain=emsenhuber.net.
- docs/transaktionen/TP23-agh-firewall.commands.rsc: TP5-E2 LAN->AGH dns auf .16/.17 ersetzt durch .36/.37.
- docs/transaktionen/TP23-agh-dhcp-cutover.commands.rsc: DHCP-Cutover (dns-server + domain in einem Deploy).

Compliance 104/104, 0 Drifts. Core bleibt als Rückfallebene unangetastet.

[KEIN go fuer den Rest: Persistenz (CLAUDE.md/memory), Host.Naming (.host.emsenhuber.net),
add-dns-entries-Suffix, conditional-Upstream, lease-time-Transaktion, TP31-defer — alles im Plan,
Wartet auf separates go des Users.]
2026-08-26 20:26:41 +02:00
04abb5a620 opencode: /handoff als JSON-Command (statt .opencode/commands/) 2026-08-26 17:58:37 +02:00
c031f2be64 handoff: 2026-08-26 — AdGuard DNS-Cutover fortsetzen (TP23/TP31) 2026-08-26 17:51:07 +02:00
aa1cc0505d /handoff: Custom Command für Session-Übergabe (generate + resume) 2026-08-26 16:57:54 +02:00
9b60bcc43a opencode: Permission + Quick-Index + TP-Management-Regel
- opencode.jsonc: permission=allow + mikromcp/pve-mcp/home-assistant/cloudflare MCPs
- docs/teilprojekte.md: Quick-Index-Tabelle (22 Zeilen) für 1-Read-Statusbaum
- CLAUDE.md: TP-Management-Regel (vorschlagen -> abstimmen -> anlegen)
2026-08-26 13:39:41 +02:00
5ee0716dda Initial import from bf-network-r6.opencode — opencode migration 2026-08-26 12:44:21 +02:00
de5429de43 Vier gestoppte Gaeste abgeraeumt: 103, 109, 115, 201
User-Entscheid. minarca, node-red, hms-mqtt-publisher und openproject
zerstoert, 28 PBS-Snapshots geloescht, 0 Fehler. Gegenprobe direkt am
Datastore: keine Spur von ct/103|109|115|201 mehr.

Ergebnis: auf pve laeuft jetzt jeder existierende Gast -- 11 LXC + 2 VMs,
kein einziger stopped. Der Datastore enthaelt nur noch aktuelle Gaeste.

Merkregel mitgeschrieben: die Snapshot-Liste VOR dem pct destroy
einsammeln. pvesm list --vmid liefert danach 0, obwohl die Backups noch
liegen -- der Filter braucht die Gast-Config. Genau deshalb lief der
104er-Loeschversuch vorhin ins Leere.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 00:36:21 +02:00
33edd73b68 Handoff nachgezogen: ct/104-Snapshots sind ebenfalls weg
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 00:32:43 +02:00
eea9bbe3f8 ct/104-Snapshots weg; Doku nachgezogen
User-Entscheid: auch die Grafana-Backups loeschen. Gegenprobe direkt am
Datastore (ct/104 = 0), nicht ueber 'pvesm list --vmid' -- dessen Filter
ist nach dem destroy nicht mehr aussagekraeftig.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 00:32:19 +02:00
888f334e05 TP31: tote VLAN1-Adresse aus HAs Trusted-Proxy-Liste entfernt
Christoph hat 10.40.41.10/32 (alte VLAN1-NAS) entfernt und den Stand als
stable bestaetigt - kein pending offen. Vertraut wird jetzt nur noch, was
tatsaechlich proxyt: 10.40.20.40 (Caddy) plus die drei cloudflared-Origins,
die mit Schritt 6 wegfallen. Abnahme: hass/vw/gitea/n8n je 200 ueber Caddy.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 00:27:34 +02:00
663f6987f8 TP31: hass-400 geloest - HA ignoriert den http-Block in der YAML
Ursache war nicht der fehlende Eintrag, sondern der falsche Ort: HA hat die
http-Konfiguration nach .storage/http migriert ("yaml_migration_done": true,
created_at 2026-08-05). Der YAML-Block wird seither kommentarlos ignoriert -
auch ein absichtlich ungueltiger Schluessel darin erzeugt keinen Fehler.

Die Logzeile fuehrt aktiv in die Irre: "untrusted proxy 10.40.20.40" faellt
laut Quelltext nur bei aktivem use_x_forwarded_for - beide Werte kamen aber
aus .storage, wo .20.10/.126/.167 (die cloudflared-Origins) standen und
Caddy fehlte.

Fix ueber den vorgesehenen Weg: http/config/configure (setzt pending, startet
HA neu) und binnen 5 Minuten http/config/promote. stable enthaelt jetzt
10.40.20.40/32, pending ist leer, hass/vw/gitea/n8n liefern 200 ueber Caddy.

Der wirkungslose Block in configuration.yaml ist durch einen Hinweis ersetzt.
Offen und bewusst vertagt: 10.40.41.10/32 (tote VLAN1-NAS) steht weiter in
der Trusted-Liste.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 00:21:43 +02:00
6139d8e15e TP31: SoT-Frage beantwortet + cf-sync.py; Uebergabe nach User-Korrekturen
SoT: CF und Caddy werden NICHT synchron gehalten - die Doppelpflege faellt
mit Schritt 5/6 weg. Heute stehen 19 Ingress-Regeln und 16 Caddy-Sites
nebeneinander und stimmen fachlich ueberein; im Zielbild haelt CF nur noch
eine Catch-all auf 10.40.20.40. Danach: Caddyfile = Name->Origin,
CF = welcher Name ist oeffentlich (4), AGH = Name->IP intern.
Nebeneffekt: die 12 internen Namen brauchen keinen oeffentlichen DNS mehr.

caddy/cf-sync.py (read-only, Exit 1 bei Drift) findet im ersten Lauf sieben
Abweichungen, alle auf CF-Seite: grafana noch im Ingress, nautobot und
gateway-dw als CNAME ohne Ingress (Quelle der 302), drei *.bf-CNAMEs auf den
zerstoerten NPM, dazu die Wildcard-Access-App, die alles maskiert.

Uebergabe korrigiert nach User-Einwand und Gegenmessung:
- Rewrites sind veraltet, nicht wertlos - Hosts leben auf VLAN20 weiter,
  also Ziele umbiegen statt Namen loeschen.
- Die Redundanz existiert doch, reziprok ueber die Standorte: FM antwortet
  auf 10.101.0.16/.17 (DS415+) - und beide liefern fuer nas.bf die tote
  VLAN1-Adresse. Ein Rewrite-Satz nur im neuen BF-Paar erzeugt
  standortabhaengig verschiedene Antworten.
- Vorratsregel auf .16 wird gestrichen statt erweitert (User-Entscheid).
- Cave: emsenhuber.net ist die Domain, bf.lan nur der DHCP-Suffix.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 00:06:14 +02:00
5b043f1032 Uebergabe Schritt 4 neu gefasst: drei Funde kippen den alten Plan
Die erste Fassung entstand vor der Caddy-Abnahme. Live erhoben, dagegen:

- adguard_bf1 (.20.16) ist ein Archiv, keine Vorlage: 24 Rewrites, davon 8
  ins tote VLAN1, 9 auf den heute zerstoerten nginx-proxy-manager (LXC 128)
  und 2 FritzBox-Reste. Uebernommen werden Upstreams/Filter, die Rewrites
  entstehen neu aus caddy/Caddyfile.
- .20.17 ist nicht "bf2", sondern adguard_fm2 (FM-Standort) und antwortet
  fuer gitea mit 10.40.41.123. BF hat heute EINEN AGH.
- Die TP5-Vorratsregeln erlauben LAN->DNS hart auf .20.16. Nach dem
  DHCP-Flip wird DNS ein forward-Fluss ueber VLAN-Grenzen; ohne erweiterte
  Regeln verlieren IOT/MEDIA/UNTRUSTED/GUEST/MGMT die Aufloesung, waehrend
  VLAN20 weiterlaeuft und den Fehler tarnt.

Dazu neu: lease-time=1d macht Flip und Rollback traege (erst zur
Erneuerung wirksam), expliziter Rollback-Abschnitt, .36/.37 als frei
geprueft, und der Core bleibt bewusst Rueckfallebene.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 23:25:34 +02:00
fef2582174 TP31: Caddy abgenommen (16/16), hass-400 praezisiert statt geraten
Schritt 3 ist durch: Token liegt, deploy.sh gelaufen, Dienst active+enabled.
Abnahme ueber den Host-Header von einem zweiten Host (pve): 11x 200,
nautobot 302, Antwortzeiten 0,02-0,11 s.

Zwei Funde, die man sonst falsch ablegt:
- pve-mcp 400 / ha-mcp 403 / gitea-mcp 404 sind KEINE Proxy-Fehler - die
  Gegenprobe direkt am Origin liefert dieselben Codes. Es sind die Antworten
  der MCP-Server auf ein nacktes GET /.
- hass bleibt 400, aber die Logzeile sagt "untrusted proxy 10.40.20.40" und
  nicht "not set-up for reverse proxies": use_x_forwarded_for greift also,
  nur die Liste zieht nicht. Zwei volle Neustarts, Config-Check valid.
  Naechster Schritt notiert; die atime taugt unter relatime nicht als Beweis.

Ist-Stand-Block mitgezogen (Projektregel).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 22:46:54 +02:00
b77deed46c Uebergabe fuer den AGH-DNS-Cutover als eigene Session
Der Split-Horizon-Entscheid (AdGuard statt Core) macht aus 'ein paar
Eintraegen' eine Verschiebung der DNS-Aufloesung des ganzen Standorts in
einen Container -- heute liefert der DHCP in allen sieben VLANs den Core.
Das gehoert nicht ans Ende einer langen Sitzung (Lehre aus TP28).

Handoff enthaelt: Ausgangslage (Caddy produktiv, 16 Sites/17 Zertifikate),
den Auftrag in fuenf Schritten inkl. der IP-Kollision .30 (Nautobot) und
der Vorgabe, AGH als Paar 110/111 zu bauen statt als DNS-SPOF, sowie die
Staffelung VLAN fuer VLAN mit VLAN30 zuletzt.

Vier Fallen mitgegeben, alle in dieser Session bezahlt: Statuscode vom
oeffentlichen FQDN beweist nichts (grafana), pvesm free scheitert an
geschuetzten Snapshots stillschweigend, Startreihenfolge haengt nicht an
der VMID, und Core-Config braucht Golden Config.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 20:48:48 +02:00
2fd300f6da TP31: Caddy laeuft (17/17 Zertifikate); grafana als tot entlarvt
Caddy in LXC 130 ist produktiv: 17 von 17 Zertifikaten per DNS-01 von
Let's Encrypt, Dienst active+enabled, Proxy gegen Host-Header verifiziert
(nautobot 302, gitea 200, pve 200, portainer 200). deploy.sh laeuft
End-to-End; Token per Fingerprint gegengeprueft -- eigenes Zone:DNS:Edit,
nicht das account-weite.

🔴 Fund beim Durchtesten: grafana war seit Langem tot und Cloudflare
Access hat es maskiert. LXC 104 stopped, konfigurativ noch auf VLAN1
(10.40.41.109), waehrend die Ingress-Zeile auf 10.40.20.109 zeigte -- eine
Adresse die es fuer Grafana nie gab. Der FQDN lieferte trotzdem 302, weil
das der Access-Login war. Exakt die Falle aus TP16.3 Paragraph 8, diesmal
in freier Wildbahn: ein toter Dienst sieht hinter Access monatelang
gesund aus.
=> Caddy-Zeile raus (16 Sites), LXC 104 zerstoert, aus dem Backup-Job.
Die 14 PBS-Snapshots bleiben bewusst stehen -- einzige Kopie etwaiger
Dashboards.

hass liefert 400: bekannter trusted_proxies-Punkt aus TP16, gehoert vor
die CNAME-Umstellung.

Split-Horizon entschieden (User): in AdGuard zusammen mit TP23 Stufe 2.
Dokumentiert, was das bedeutet -- heute liefert der DHCP in allen sieben
VLANs den Core als DNS; AGH bekommt niemand. Der Schritt verschiebt die
Aufloesung des ganzen Hauses in einen Container, deshalb als Paar
110/111 bauen. Die geloeschten Altlasten hiessen nicht zufaellig
adguard-bf1/-bf2.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 20:45:01 +02:00
e0feedeca3 TP7.1: zweite Ursache dokumentiert - die App suchte gar nicht
Nach der Relay-Reparatur lag weiter nichts an. tcpdump auf der VLAN40-Leitung:
jedes SSDP-Paket des MacBooks kam von Chrome (ST dial-multiscreen,
USER-AGENT Chromium), kein einziges von Sonos. Ursache war das
macOS-Local-Network-Gate - es stand auf "an" und griff nicht. Schalter
aus/ein + App-Neustart hat es gerichtet (User-bestaetigt).

Damit faellt auch die tragende Zahl des Vormittags-Handoffs: die "291 Suchen
der App in 12 Minuten" waren Chrome plus eigene Proben.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 18:48:36 +02:00
e416b795e8 TP7.1 nachgebessert: --ssdpUnicastAddr raus, SSDP-Hinweg repariert
Die macOS-Sonos-App fand ihre Player nicht. Ursache war nicht die Firewall
(MEDIA->MAIN ist offen) und nicht der vermutete Race um den globalen
"last SSDP search source"-Slot, sondern die Flagge --ssdpUnicastAddr selbst:

  multicast-relay.py Z. 630 schreibt die Quelle JEDES SSDP-Pakets an
  239.255.255.250:1900 auf <addr>:1901 um (auch NOTIFY), Z. 691 verwirft
  das Paket dann beim Senden auf eth1, weil 10.40.10.21 nicht im VLAN40-Netz
  liegt. Der Hinweg lief damit nie.

Messung vorher: 0 Pakete via eth1 gegen 308 via eth0 in 20 min, 0x
"Received SSDP Unicast" im gesamten Journal seit 2026-08-18. Nachher:
M-SEARCH quellerhaltend in VLAN40, HTTP/1.1 200 OK von 10.40.40.193/.195
an beiden MacBook-Beinen, Drop-Log in:vlan40 out:vlan10 = 0.

- mcast-relay/multicast-relay.service: reparierte Unit jetzt im Repo
  (ausgerollt auf LXC 108, Backup /root/multicast-relay.service.bak-20260825)
- CLAUDE.md: Gotcha korrigiert, Richtungsbilanz als Erstmessung, Hinweis auf
  die SO_REUSEPORT-Falle auf Port 1900 und das dual-homed MacBook (.183/.82)
- docs/teilprojekte.md: Ist-Stand nachgezogen, TP33 (Fernzugriff) als Stub
- docs/teilprojekte-archiv.md: TP7.1-Aussage "--ssdpUnicastAddr ist noetig"
  widerrufen

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 18:28:53 +02:00
810d4c4ed6 TP31: PBS-Altlasten restlos entfernt, Fortschritt dokumentiert
Die sieben verbliebenen Snapshots waren in PBS als protected markiert.
Auf User-Freigabe entschuetzt (pvesh set .../content/<volid> --protected 0)
und geloescht. Gegenprobe: 0 Snapshots zu allen sechs geloeschten IDs,
72 von 72 weg. VMID 130 gehoert damit ausschliesslich caddy-bf1.

Merkregel mit aufgenommen: pvesm free scheitert an geschuetzten
Snapshots mit 'cannot remove protected snapshot' -- und zwar
stillschweigend, wenn man den Fehler nicht ausliest. Wer nur die
Erfolgszaehler liest, haelt ein halb erledigtes Aufraeumen fuer fertig.
Genau so waeren hier sieben Snapshots stehen geblieben.

TP31-Abschnitt auf den Ist-Stand gezogen: Schritte 1 und 2 erledigt,
Schritt 3 wartet nur noch auf das Zone:DNS:Edit-Token.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 08:38:26 +02:00
a99dd06fdd TP31: LXC 130 caddy-bf1 gebaut, Caddyfile im Repo, Altlasten geloescht
Aufgeraeumt (User-Freigabe): LXC 120/121/128/129/130/131 zerstoert --
alle stopped, onboot=0, alle konfigurativ noch auf totem VLAN1
(10.40.41.116/.117, GW .41.254). pct destroy --purge hat 120 und 128
zugleich aus dem Backup-Job entfernt. 65 von 72 PBS-Snapshots geloescht;
sieben sind PROTECTED und stehen noch -- bewusst nicht ueberschrieben.

Neu nach TP32-Systematik:
- LXC 130 caddy-bf1, VLAN20 tag=20, 10.40.20.40/24, GW/DNS .20.1,
  onboot=1, startup order=10 (Core), Debian 13, 4 GB / 512 MB
- Caddy v2.11.4 mit dns.providers.cloudflare (Custom-Build)
- caddy/Caddyfile im Repo, 17 Sites: 4 oeffentlich (vw/hass/n8n/gitea),
  13 intern inkl. der vier MCP-Endpunkte und drei HTTPS-Backends
- caddy/deploy.sh liest CF_DNS_API_TOKEN aus ~/.secrets und schreibt es
  in die Container-Env -- nie auf stdout, nie in einer Kommandozeile
- 130 in denselben Backup-Job aufgenommen

Caddy laeuft noch NICHT: das eng geschnittene Zone:DNS:Edit-Token fehlt.
Ein Token anzulegen und im Klartext zu handhaben ist nichts, was ich
selbst tue -- der Weg ist ~/.secrets plus deploy.sh.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 01:11:08 +02:00
c9a413858b TP31 + TP32 angelegt; Startreihenfolge auf pve repariert
TP31 -- Caddy als Reverse Proxy fuer innen UND aussen, cloudflared von
sechs Containern auf einen. Anlass war Christophs Einwand, er habe den
Core unter der Praemisse gekauft, dass auch die Public-Apps darueber
laufen. Aktenlage geprueft: eine Zusage gibt es nicht, aber TP16.1
begruendet die Auswahl mit seinem Prinzip 'Router = einziger SPOF' --
und niemand hat je geprueft, ob der oeffentliche Strang ohne sechs
Container auskommt. Keine Taeuschung, eine ungepruefte Annahme.

- dst-nat-Variante geprueft und verworfen (ginge, Free-Tarif reicht),
  weil Christophs Tunnel-Variante drei Risiken spart: keine angreifbare
  Origin-IP, keine CF-IP-Allowlist, kein DDNS als Voraussetzung
- cloudflared auf ap1/ap2: live gemessen arm64, 95 MB Flash frei,
  690 MB RAM frei. Der Core kann es nie (arm 32-bit, 2,9 MB frei)
- Kriterium fuer Infrastruktur-Container: was sich selten aendert und
  wenig schreibt. Caddy nein (Config aendert staendig), AGH nein
  (Query-Log frisst NAND)

TP32 -- VMID-Systematik (Hunderter = Klasse, gemeinsamer Raum fuer VMs
und LXCs) + letztes Oktett je /24, uebertragbar auf andere Standorte.
🔴 Dabei gefunden und SOFORT REPARIERT: die Startreihenfolge war falsch.
Proxmox startet erst Gaeste mit explizitem startup order=, dann den Rest
nach VMID -- drei Gaeste hatten einen, die DBs nicht. Home Assistant
startete damit vor MariaDB, MQTT und z2m25. Jetzt fuenf Stufen
(Core/Daten/Platform/Broker/Apps). Erkenntnis: VMID = Klassifikation,
startup order = Abhaengigkeit -- die Umnummerierung muss den Startlauf
gar nicht reparieren.

Doku-Korrekturen aus den Messungen:
- CLAUDE.md: 'Container NICHT auf dem Router' war nie nachgemessen
- tp16.1: 'Connector als Container ❌' galt dem TUN-Bedarf des
  WARP-Connectors; cloudflared braucht kein TUN
- cf-tunnel-mapping Paragraph 16: die macvlan-Blindheit war mit einem
  Shim behebbar -- der Workaround war groesser als der Fix

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 01:03:54 +02:00
ec8051508e TP16.3: nautobot aus dem CF-Ingress geschnitten, Probe laeuft
Runbook ausgefuehrt. Vorbedingungen alle erfuellt, Testclient hing im
Hotspot-Netz 172.20.10.13 mit aktivem WARP -- also nicht im BF-LAN, der
einzige Aufbau der fuer Vorbedingung 2 etwas beweist.

Schnitt: nautobot.emsenhuber.net aus bf-nas (8 -> 7 Regeln), Catch-all
bleibt letzte. Rollback-Sicherung in docs/cf-backup/. Gegenprobe durch
Zuruecklesen der Config, nicht am Statuscode.

Abnahme vollstaendig, inkl. des uebersehenen Punktes: Golden Config lief
durch (Backup -> Intended -> Compliance, 104/104, 0 Drifts). Die uebrigen
fuenf bf-nas-Hostnames unveraendert.

Befund, der die Abnahmetabelle des Runbooks korrigiert: der oeffentliche
FQDN taugt nicht als Test. Er liefert vor UND nach dem Schnitt 302, weil
der von Cloudflare Access kommt, nicht vom Origin -- Access greift vor
dem Tunnel (JWT: auth_status NONE bei is_warp true). Damit auch eine
ehrlichere Erwartung: nautobot war nie ohne Access-Login oeffentlich
erreichbar, der Schnitt entfernt die zweite Tuer, nicht die erste.

Paragraph 7 des Runbooks ist ueberholt -- die HA-Degradierung ist am
selben Tag repariert, der Fall steht auf dem verbliebenen Argument.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 10:33:43 +02:00
10b3f22e6e CLAUDE.md: Passphrasen-Leak ueber list_wifi_interfaces als Gotcha
Steht bisher nur in TP30/TP25, also nur beim Oeffnen von
teilprojekte.md sichtbar. Gehoert neben die sshpass-p-Warnung im
Tooling-Abschnitt, weil es dieselbe Klasse ist (Credential geraet
ueber ein Nebenprodukt in ein Transkript) und CLAUDE.md jede Session
gelesen wird.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 10:21:26 +02:00
5f38cc8b72 TP25 Fund F aufgeloest: geraeteseitig, kein Netzfehler
Kollektor am Manager (15-s-Takt, 29 Samples, 28 Clients). Von den drei
Kandidaten fallen zwei, und beide ohne Wartezeit:

- (b) DHCP-lease-time: tot. dhcp-v30 faehrt lease-time=1d, Renew bei
  12h -- kann 5:05 nicht erzeugen. Eine Abfrage, keine Messung.
- (a) periodischer VAP-Re-Apply: tot. Auf genau dem VAP, der angeblich
  alle 5:05 abwirft, standen drei Clients bei 16h51m Uptime, 25 von 28
  ueber 6h. Dafuer braucht es die vier Zyklen nicht -- ein einziges
  Sample mit 16h51m widerlegt einen 5-Minuten-Takt.
- (c) Geraet selbst: bleibt, ist aber nicht pruefbar.

Denn die zwei Fund-F-MACs sind schlicht weg: ARP status=failed, keine
Lease, nicht in der Registration-Table, HA kennt sie nicht. Merkregel
wie beim P750W -- erst pruefen ob das Geraet ueberhaupt da ist, bevor
ein periodisches Trennen als Funk-/Configfehler untersucht wird.

Nebenbefund: einziger Client mit Uptime-Ruecksetzer war der DTU
(54:F2:9F:12:51:F0) auf ap1, 43min Sitzung, bei -52 dBm. Nicht Fund F,
aber echt -- derselbe ESP-Ein-Radio-Mechanismus wie in der Transaktion
TP17.1-dtu-pin-ap2. Gehoert zur Neubewertung des Pins.

Rohdaten: docs/messdaten/tp25-fundf-20260824.log

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 09:42:36 +02:00
f8ffc0d9ea TP16 abgeschlossen: vier tote Tunnel geloescht; TP25 Kanalplan fuer AP3
- Vier Alt-Tunnel (openclaw/coolify/johnny2/TeilzeitCharlie) per CF-API
  geloescht, User-Entscheid. Gegenprobe: 5 Tunnel, bf-* je 2 Connectoren.
  Letzte VLAN1-Origins damit auch aus der CF-Config weg (Rest von TP19)
- TP25: Kanalplan fuer den dritten AP gerechnet, DFS genehmigt.
  ETSI-Budget als Tabelle (Band A/B/C, 40-MHz-Bloecke duerfen keine
  Bandgrenze queren). Empfehlung: neuer cAP ax auf 5180/Ce non-DFS,
  ap1/ap2 nach Band B (5260/5300), 5220/Ce als Ausweichspur frei.
  Band B statt C wegen CAC 60s statt 600s und gleichem 23-dBm-Deckel
- Zwei Fallen benannt: hart gepinnte Frequenz macht DFS zum SPOF
  (Channel-Objekt braucht eine Liste), und die erreichte tx-power in
  Band B messen BEVOR umgezogen wird -- das ist Fund B nochmal
- Platzierung: Messung widerspricht dem Aufstellen an bisheriger Stelle
  (17/21 Abschnitte haben 0% Verlust). Vorschlag: cAP ax an den guten
  Platz, verdraengter hAP in den Drei-Zimmer-Schatten

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 07:34:04 +02:00
da199be925 TP16 HA repariert; TP25 5-GHz-Scan + Empfehlung; TP17.2-Stub weg
TP16 -- Ursache war NICHT das erwartete QUIC-Flap: die beiden
macmini-Connectoren standen auf Exited(0), beide finishedAt auf
derselben Sekunde 2026-07-21T13:00:53, bei korrektem
restart=unless-stopped und http2. Also ein docker stop / compose down.
Fix = docker start. Abnahme: alle drei bf-Tunnel je 2 Connectoren /
8 conns, 36 Anfragen ueber 6 FQDNs beider Tunnel mit 530er=0.
- Datierung korrigiert: degradiert seit 07-21, nicht seit 08-16
  (der 08-16 war der Tag der Entdeckung) -- vier Wochen unbemerkt
- Nachweisluecke festgehalten: 1 von 2 Connectoren meldet healthy,
  nur die Connector-ANZAHL zeigt die Degradation -> Check nach TP11
- openclaw-Warnung korrigiert: welcher Tunnel einen Hostname bedient,
  entscheidet das DNS; kein CNAME zeigt auf die vier toten Tunnel,
  n8n zeigt korrekt auf bf-mm. Loeschen bleibt richtig als Hygiene
- Doku-Drift: bf-nas ist live 220c9958, nicht 70d6a4cf
- cf-tunnel-mapping.md Paragraph 15 als As-Built

TP25 -- 5-GHz-Umfeldscan am Manager: je EIN Fremdnetz pro AP, -86 bzw
-89 dBm. Band leer, Bloecke ueberlappungsfrei => beide ueblichen Gruende
fuer 20 MHz treffen nicht zu. Empfehlung: 20/40 behalten; der echte
Ausloeser ist die AP-Zahl (Band A = genau 2x40 MHz, mit zwei APs voll),
dann lautet die Wahl 20 MHz flottenweit gegen DFS akzeptieren.

TP30 -- neues Leak-Ereignis dokumentiert: list_wifi_interfaces gibt alle
Passphrasen im Klartext aus, damit sind fuenf WLAN-PSKs exponiert.
Als Falle aufgenommen. TP17.2-Stub entfernt (Verweise erklaeren den
Merge, ein Wegweiser ist nicht mehr noetig).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 07:22:44 +02:00
93c32a2ad7 TP17.2 in TP30 aufgeloest; TP30 ist das Sammelbecken fuer Credentials
User-Entscheid: TP30 sammelt jedes Credential, das neu gesetzt werden
muss -- nicht nur Rotationen. Das Shelly-Geraetepasswort (TP17.2) ist
eine Erstvergabe und gehoert damit dorthin; ausserdem teilt es sich mit
der PSK-Rotation den Geraete-Durchgang (ein Reboot statt zwei).

- TP17.2-Volltext nach TP30 verschoben (Posten #3), Stub bleibt als
  Wegweiser, damit die Nummer nicht ins Leere zeigt
- TP30-Titel/Scope geweitet: "neu setzen & rotieren", mit expliziter
  Trennung Erstvergabe vs. Rotation (Prioritaet unterschiedlich,
  Arbeitsaufwand identisch)
- Detailabschnitte symmetrisch als "Posten #1" / "Posten #3" benannt
- Querverweise nachgezogen: Naechster-Schritt-Block, Split-Regel,
  TP17.3-Abgrenzung, Archiv-Kopfzeile TP17

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 07:08:13 +02:00
baf97e2d85 TP30 angelegt: Credential-Rotation als Sammel-TP, gebuendelt gegen Projektende
Vier Rotationsposten (MikroTik-admin, IoT-PSK, Shelly-Geraetepasswort,
CF-Access-Token) lagen als verstreute Follow-up-Zeilen herum. Der teure
Teil jeder Rotation sind die Konsumenten (HA-Re-Auth x4, Nautobot-Stack-
Redeploy), nicht das Setzen -- einzeln gemacht zahlt man den mehrfach.
Deshalb ein Sammel-TP mit Ausloesekriterium statt Termin.

- 100 Zeilen Radius-/Etappe-1-Detail aus den Follow-ups nach TP30 verschoben
  (nicht dupliziert), Follow-ups tragen jetzt einen Zeiger
- Etappe 1 (Service-Accounts ha/nautobot) ist durch; admin ist NICHT rotiert
- Stale: "nach TP17.1 sind es weniger Geraete" -- TP17.1 ist verworfen,
  die Geraete bleiben WLAN-Clients, die Rechnung gilt unveraendert
- Handoff 08-24 + Naechster-Schritt-Block als ueberholt markiert

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 06:26:22 +02:00
0e0de74cb2 Uebergabe fuer die naechste Session
Einstieg ist die Passwort-Rotation Etappe 2: Nautobot und die vier
HA-mikrotik-Integrationen auf die gestern angelegten Service-Accounts
umhaengen, dann erst admin rotieren. Die Vorarbeit steht komplett, und
das admin-Passwort ist zweimal in ein Transkript geraten -- derselbe
Wert, da alle vier Geraete ihn teilen.

Festgehalten sind ausserdem die beiden Messungen, die vorherige Annahmen
widerlegen (eco_mode hebt die Sendeleistung nicht an; restart_required
auf 14 Geraeten war ein Fehlalarm), der Grund fuer das Verwerfen von
TP17.1, und die Fallen, die man sonst neu erhebt -- darunter die
abweichende s-Nummerierung zwischen HA und Repo, der stale VLAN1-Sweep
in migrate.py und die Regel, nach jedem Shelly-Firmwarewechsel den AP zu
pruefen.

teilprojekte.md zeigt im Ist-Stand jetzt auf diese Uebergabe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 04:58:21 +02:00