TP31: cf-sync.py Parser+Logik-Fix, CF-Leichen geloescht, grafana-Ingress-Backup

- cf-sync.py: Multi-Hostname-Caddy-Bloecke geparst (27 statt 5 Sites),
  Vergleich CF->Caddy statt CF->Origin (TP31-Zielbild), *.bf.*-intern gefiltert
- CF: 6 CNAME- und 1 Ingress-Leiche geloescht (grafana, gateway-dw, nautobot,
  phpmyadmin.bf, speedtest.bf, z2m25.bf)
- Backup vor grafana-Removal
This commit is contained in:
2026-08-29 19:35:53 +02:00
parent bd1ba5ed13
commit 39ba5da6b0
2 changed files with 35 additions and 6 deletions

View File

@@ -52,14 +52,16 @@ def caddy_sites():
sites, site = {}, None sites, site = {}, None
with open(os.path.join(HERE, "Caddyfile"), encoding="utf-8") as fh: with open(os.path.join(HERE, "Caddyfile"), encoding="utf-8") as fh:
for line in fh: for line in fh:
m = re.match(r"^([a-z0-9.-]+\.%s)\s*\{" % re.escape(ZONE), line) # Block-Header: ein oder mehrere Hostnamen (kommagetrennt) vor "{"
m = re.match(r"^([a-z0-9.-]+(?:\s*,\s*[a-z0-9.-]+)*\.%s)\s*\{" % re.escape(ZONE), line)
if m: if m:
site = m.group(1) site = m.group(1)
continue continue
if site: if site:
m2 = re.search(r"reverse_proxy\s+(\S+)", line) m2 = re.search(r"reverse_proxy\s+(\S+)", line)
if m2: if m2:
sites[site] = m2.group(1) for host in site.split(","):
sites[host.strip()] = m2.group(1)
site = None site = None
return sites return sites
@@ -94,16 +96,20 @@ def main():
drift = [] drift = []
# 1) Ingress gegen Caddyfile # 1) Ingress gegen Caddyfile.
# Zielbild (TP31): CF-Ingress zeigt auf Caddy (10.40.20.40), Caddy aufs Origin.
# Zeigt CF direkt auf ein Origin (nicht Caddy), ist das die alte Architektur = Drift.
for host, (tun, svc) in sorted(ingress.items()): for host, (tun, svc) in sorted(ingress.items()):
if svc.startswith("ssh://"): if svc.startswith("ssh://"):
continue continue
if host not in caddy: if host not in caddy:
drift.append(f"NUR-CF {host:<32} {tun}: {svc} (in Caddy nicht vorhanden)") drift.append(f"NUR-CF {host:<32} {tun}: {svc} (in Caddy nicht vorhanden)")
elif caddy[host] != svc: elif not svc.startswith(f"http://{CADDY_IP}"):
drift.append(f"ABWEICHEND {host:<32} CF={svc} Caddy={caddy[host]}") drift.append(f"ABWEICHEND {host:<32} CF={svc} (zeigt nicht auf Caddy {CADDY_IP})")
# Caddy-Sites ohne CF-Ingress: nur die suffixlosen Namen sind potenziell Drift.
# *.bf.*-Namen sind bewusst intern (Split-Horizon) und brauchen keinen Ingress.
for host, svc in sorted(caddy.items()): for host, svc in sorted(caddy.items()):
if host not in ingress: if host not in ingress and not host.endswith(".bf." + ZONE):
drift.append(f"NUR-CADDY {host:<32} {svc} (kein CF-Ingress — intern oder bewusst)") drift.append(f"NUR-CADDY {host:<32} {svc} (kein CF-Ingress — intern oder bewusst)")
# 2) CNAMEs, die auf einen Tunnel zeigen, aber keine Ingress-Regel mehr haben # 2) CNAMEs, die auf einen Tunnel zeigen, aber keine Ingress-Regel mehr haben

View File

@@ -0,0 +1,23 @@
{
"success": true,
"errors": [],
"messages": [],
"result": {
"tunnel_id": "220c9958-401b-4111-9451-f3db09bba2d5",
"version": 4,
"config": {
"ingress": [
{"service": "http://10.40.20.157:3000", "hostname": "gitea.emsenhuber.net"},
{"service": "http://10.40.20.109:3000", "hostname": "grafana.emsenhuber.net"},
{"service": "http://10.40.20.173:3000", "hostname": "pve-mcp.emsenhuber.net"},
{"service": "http://10.40.20.127", "hostname": "vw.emsenhuber.net"},
{"service": "http://10.40.20.10:8080", "hostname": "ds-bf.emsenhuber.net"},
{"service": "ssh://10.40.20.10:22", "hostname": "3k23uow7.emsenhuber.net"},
{"service": "http_status:404"}
],
"warp-routing": {"enabled": true}
},
"source": "cloudflare",
"created_at": "2026-08-24T08:28:18.806844Z"
}
}