Files
bf-infra/docs/handoff-20260827-hubert-und-altlasten.md
Christoph Emsenhuber 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

166 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Handoff — 2026-08-27 — TP11b Backfill & neue Infra-Topologie
> **Vorgänger:** TP11b-Plan (`~/dev/blaueblueten-n8n/docs/teilprojekte.md`, Block "Daten & Automatisierung"),
> TP31 (`docs/teilprojekte.md` im bf-infra) — diese Notiz ist **kein neues TP**, sondern eine
> Session-übergreifende Beobachtung zur geänderten Infrastruktur + Wunschliste für künftige
> AI-Sessions (Hubert / künftige Modelle).
## TL;DR
- **`db/006_backfill_kind.sql` ist geschrieben** (TP11b, idempotent) — wurde **nicht** ausgeführt.
Der Governor wurde in dieser Iteration **nicht** aktiviert; der Python-Sync-Service
(`tools/sync_service.py` im Container `terpene-sync` auf LXC 400) bleibt der produktive Crawler.
Der Governor-Blueprints-Fix (`n8n/{detail,price,governor}.json`) ist als Vorbereitung da.
- **Infra-Topologie hat sich heute stark geändert**: `10.40.41.x` → `10.40.20.x` (VLAN20 = INFRA),
Cloudflare-Tunnel-Modell → **Caddy als zentraler Reverse-Proxy auf LXC 130 / `10.40.20.40`**,
Mikrotik-Switches routen direkt, **kein `cloudflared`-Tunnel mehr nötig**.
- **`n8n.emsenhuber.net` ist jetzt öffentlich via Caddy** (CF-Anycast → Caddy → n8n-Backend).
n8n-API mit `~/.secrets/credentials.env → N8N_API_KEY` funktioniert von meinem Mac aus.
- **`terpene.teilzeitladen.xyz` ist im neuen Caddy-Setup noch NICHT registriert** — der
Worker läuft weiter über den alten Hyperdrive-VPC-Pfad. DB-Backfill via Worker ist nicht möglich.
## Beobachtungen — was heute (2026-08-27) geändert wurde
### 1. Netz-Topologie: VLAN-Schema umgestellt
- **`10.40.41.x` ist tot.** Das alte `41.x`-Subnetz (ehem. „Server"-VLAN) gibt es nicht mehr.
Aktuell gültig: `10.40.20.0/24` = INFRA (LXC-Hosts, Docker, HA, NAS), `10.40.99.0/24` = MGMT
(MikroTik-Switches/APs), `10.40.10.0/24` = MAIN (Trusted Clients).
- **`10.40.20.40` ist jetzt `caddy-bf1`** (LXC 130 auf pve) — der zentrale Reverse-Proxy.
Bestätigt via `curl -I -H "Host: n8n.emsenhuber.net" http://10.40.20.40/` → 308 → HTTPS,
und via Cloudflare-Anycast-IP `188.114.96.10` → HTTP 200 (`via: 1.1 Caddy`).
### 2. Public-Apps laufen jetzt über Caddy statt Cloudflare-Tunnel
- **Was im Caddyfile steht** (`bf-infra/caddy/Caddyfile`):
`vw.emsenhuber.net`, `hass.emsenhuber.net`, `n8n.emsenhuber.net`, `gitea.emsenhuber.net`.
- **Was fehlt:** `terpene.teilzeitladen.xyz` (TP31 Schritt 5–6 ist noch offen).
- **Cloudflare-Tunnel `bf-public`** ist im CF-Backend angelegt (ID `48d3b0b6-…`, heute
05:32 UTC), **status: inactive** — kein Connector läuft. Die Connector-Config ist im
Repo bereits vorbereitet: `bf-infra/routeros/cloudflared-bf-public-config.yml` +
`bf-infra/routeros/cloudflared/{ap-bootstrap.rsc,credentials.json}`. Der Connector ist als
**RouterOS-Container auf ap1 + ap2** geplant (arm64, Mikrotik hAP ax²), Bootstrap-Skript
liegt vor. **Wichtig:** Der Tunnel ist **NICHT obsolet** — er ist Teil von TP31
Schritt 5/6 (Catch-all-Tunnel für die Subdomains, die nicht ins Caddyfile gehören).
Token in `~/.secrets/credentials.env` (`BF_PUBLIC_TUNNEL_TOKEN`).
### 3. DNS-Auflösung aus dem LAN
- **`terpene.teilzeitladen.xyz`** ist weder über Public-DNS (`@1.1.1.1`) noch über den
lokalen Resolver (`@10.40.20.36` = AGH `agh-bf1`) auflösbar — beide geben NXDOMAIN.
Der Worker bleibt nur via Hyperdrive-VPC erreichbar (nicht aus dem LAN).
- **`n8n.emsenhuber.net`** löst sauber via Public-DNS auf `188.114.96.10/.97.10` (CF-Anycast) auf
und antwortet mit dem Caddy-Backend. Aus dem LAN funktioniert es also **out-of-the-box** über
den CF-Edge-Pfad, ohne dass AdGuard-Rewrites nötig wären.
## DB-Backfill — was schief lief und warum
Der Backfill-SQL ist trivial, aber **aus meinem Mac (LAN-IP `10.40.10.82`) nicht ausführbar**, weil:
- **`pg_hba.conf` auf `10.40.20.20` (platform-pg) erlaubt nur `10.95.10.0/24`** (WireGuard-VPN).
Nicht `10.40.10.0/24`. Auch `terpene_ro` ist nicht freigeschaltet — der `terpene-pg`-MCP ist
zwar konfiguriert, scheitert aber am `pg_hba.conf`-Eintrag.
- **WireGuard-Interface** auf meinem Mac nicht aktiv (kein `wg0`, keine `utun`-Adressen in
`10.95.10.x`). Die RouterOS-Configs für WG-Hub sind da (`bf-network-r6/routeros/.secrets/wg-*.conf`),
aber kein Client-Config für den Mac.
- **Worker-Endpoint `admin/migrate`** wäre der richtige Pfad, aber `terpene.teilzeitladen.xyz`
ist im neuen Caddy nicht registriert → kein HTTP-Zugriff aus dem LAN.
- **n8n-Credential-Push** (`terpene_rw` als Postgres-Cred in n8n anlegen) wäre eine Alternative,
aber **du hast den gestoppt** („wg. mcp abwarten") — kein Schreibzugriff auf Produktivsysteme
ohne explizite Freigabe.
**Was bleibt übrig:** entweder WireGuard-Client auf dem Mac aktivieren + `pg_hba.conf`
um `10.40.10.82` erweitern (deine Aktion), **oder** den Worker in Caddy registrieren
(TP31 Schritt 5) und dann via `admin/migrate` arbeiten. **Beides ist deine Aktion, nicht
meine** — ich darf nicht eigenmächtig schreiben.
## Wunschliste — was künftige Sessions (Hubert / Nachfolger) brauchen
Das ist **meine** Perspektive auf das, was ich für produktives Arbeiten brauche. Die
**Umsetzung ist deine** (Infra-Antwort), nicht meine.
### A. Direkter DB-Zugriff aus dem LAN (für Ad-hoc-SQL)
- **Was ich brauche:** ein LAN-fähiges Postgres-Frontend — entweder
- `pg_hba.conf` um `10.40.10.0/24` (oder wenigstens `10.40.10.82`) erweitern (Trust/SSL),
- **oder** ein WireGuard-Client-Setup auf dem Mac, das in `10.95.10.0/24` routet.
- **Was ich damit anfange:** Counts ziehen, Backfill-SQL ausführen, Schema-Diffs ansehen,
EXPLAIN-Tests. Alles read-only oder mit expliziter User-Freigabe.
- **Priorität:** mittel — die meiste Arbeit geht über den Worker-Endpoint; nur fürs Backfillen
oder Schema-Debugging wäre es nützlich.
### B. Caddy-API oder Caddy-MCP (für Hot-Reload / Site-Registrierung)
- **Was ich brauche:** eine API, mit der ich **ohne SSH auf den LXC 130** einen
`Host`-Block ins Caddyfile patchen kann, sodass `terpene.teilzeitladen.xyz` aus dem LAN
erreichbar wird.
- **Heute:** `caddy-bf1` hat eine **Admin-API auf `:2019`** (`http://10.40.20.40:2019/config/`)
und die Files liegen in `/etc/caddy/Caddyfile`. **Was fehlt:** ein Auth-Layer
(heute localhost-only) und ein Workflow, der JSON-Config reinpatcht + `caddy reload` triggert.
- **Priorität:** mittel-hoch — sobald die Caddy-API von außen erreichbar + authed ist,
kann ich `terpene.teilzeitladen.xyz` (oder andere Sites) registrieren, ohne dich zu fragen.
### C. `terpene.teilzeitladen.xyz` in Caddy registrieren (TP31 Schritt 5/6)
- **Was das löst:** Worker-Backend ist aus dem LAN erreichbar; `admin/migrate` wird callbar;
Backfill-SQL kann ich via Service-Token `terpene-verify-v2` ausführen.
- **Was du dafür brauchst:** ein zusätzlicher `Host terpene.teilzeitladen.xyz`-Block in
`bf-infra/caddy/Caddyfile`, der nach `terpene-worker` (`10.40.20.X`) reverse-proxyt.
Worker-Backend-IP = ? (steht in `worker/wrangler.toml` und war mal `10.40.20.167` =
Mac mini — der ist seit der Mac-mini-Abschaltung möglicherweise weg). **Klären, was heute
das Backend ist.**
### D. Hermes SOUL.md als Inspiration (nicht zum Kopieren)
- Die `~/.hermes/SOUL.md` enthält gute Direktiven (targeted, efficient, direct,
admit uncertainty). Mein Verhalten in dieser Session war dadurch geleitet, dass ich
bei Unsicherheit (Credential-Push) gefragt habe statt geraten habe. Das ist gut.
- **Hermes ist nicht mein Maßstab** — ich bin Hubert / minimax-m3 / opencode-Session,
nicht Nous Hermes. Aber das Pattern **„lieber einmal fragen als dreimal raten"** sollte
für künftige Sessions explizit festgehalten werden. Vorschlag: ein **CLAUDE.md-Eintrag**
in `~/dev/bf-infra/` mit der Direktive „bei Aktionen mit Produktivsystem-Auswirkungen
(Credential-Create, Live-Deploy, DB-Write): erst fragen".
## Lessons Learned — was ich (Hubert) beim nächsten Mal anders machen würde
1. **Früher DNS testen.** Ich hätte in Iterationsminute 1 prüfen sollen, ob
`terpene.teilzeitladen.xyz` aus dem LAN auflösbar ist. Statt dessen habe ich den
`pg_hba`-Fehler über mehrere Schritte debuggt. Direkter Caddy-Bypass-Test wäre schneller
gewesen.
2. **Caddy als Erstes prüfen.** Da `caddy-bf1` der neue zentrale Reverse-Proxy ist und
`10.40.20.40` ARP-erreichbar war, hätte ich dort anfangen sollen statt bei Postgres. Ein
`curl http://10.40.20.40:2019/config/` (Admin-API, heute localhost-only) hätte mir
sofort die Site-Liste gezeigt.
3. **Mikrotik-MCP ist Gold wert für LAN-Topologie.** ARP-Tabelle auf `crs326-core` +
`vlan20` zeigt mir in einem Call, welche Hosts im Server-VLAN leben — schneller als
`host`-Lookups oder `nmap`. Sollte erste Anlaufstelle sein, wenn „wer ist wo im LAN"
gefragt ist.
4. **`BF_PUBLIC_TUNNEL_TOKEN` ist Teil von TP31 Schritt 5/6**, nicht obsolet. Der
Connector-Container auf den Mikrotik-APs ist die Strategie für die Subdomains, die
nicht direkt ins Caddyfile gehören. `bf-public` ist also „im Setup", nicht „tot".
Was aber stimmt: für die 4 Subdomains `vw/hass/n8n/gitea.emsenhuber.net` ist der
Tunnel obsolet — die laufen bereits über Caddy. Wenn der Connector deployed wird,
bekommt er nur die „Catch-all"-Route.
## Offene Punkte für deine nächste Session (nicht für mich)
- **WireGuard-Client auf Mac** aktivieren? Wenn ja: Config aus `bf-network-r6/routeros/.secrets/`
oder neu generieren?
- **`terpene.teilzeitladen.xyz` in Caddy registrieren?** Falls ja: welcher Backend-Host/IP?
(Worker ist seit Mac-mini-Wegfall vermutlich auf pve/LXC migriert.)
- **`bf-public` Cloudflare-Tunnel** — Connector-Container auf ap1+ap2 deployen?
`routeros/cloudflared/ap-bootstrap.rsc` ist die Vorlage. Nach Deployment:
Ingress so anpassen, dass die 4 Caddy-Subdomains (`vw/hass/n8n/gitea.emsenhuber.net`)
vom Tunnel-Catchall **ausgeschlossen** werden — sonst gibts Konflikte (Caddy und
Tunnel beanspruchen dieselben Hostnames).
- **`pg_hba.conf`** um LAN-IP erweitern? Vertrauensstufe (md5/scert/trust)?
## Cross-References
- `~/dev/blaueblueten-n8n/docs/teilprojekte.md` → TP11b (Backfill-SQL, Doku)
- `~/dev/blaueblueten-n8n/db/006_backfill_kind.sql` (neu, idempotent)
- `~/dev/bf-infra/docs/teilprojekte.md` → TP31 (Caddy-Setup, Schritt 5–6 offen)
- `~/dev/bf-infra/caddy/Caddyfile` (Caddyfile SSoT)
- `~/.secrets/credentials.env` (alle Credentials, inkl. `BF_PUBLIC_TUNNEL_TOKEN`,
`N8N_API_KEY`, `TERPENE_RW_PASSWORD`, `CF_DNS_API_TOKEN`, `CF_API_TOKEN`)
---
**Stand:** 2026-08-27, ~16:00 lokal · **Hubert** (opencode/minimax-m3, Session) · **Christoph**
(Session-Owner). Kein Commit im terpene-Repo (TP11b-Standby). Keine Schreibaktion auf
Produktivsysteme in dieser Session (pg_hba, Caddyfile, n8n-Credentials).