#!/usr/bin/env bash set -euo pipefail DIR="/opt/hx-ki/com2-stack" F="$DIR/docker-compose.yml" NET="hxki-internal" TS="$(date +%Y%m%d-%H%M%S)" BK="$DIR/backup-$TS" mkdir -p "$BK" echo "=== COM2 REPAIR ONE-SHOT ===" echo "Autorität: $F" [ -f "$F" ] || { echo "FEHLT: $F"; exit 1; } cp -a "$F" "$BK/docker-compose.yml.pre" # 0) hxki-internal muss als external existieren docker network inspect "$NET" >/dev/null 2>&1 || docker network create "$NET" >/dev/null # 1) Service hxki-web wiederherstellen aus letztem Backup das hxki-web enthält LATEST_WEB_SRC="$(ls -1t "$DIR"/backup-*/docker-compose.yml.orig 2>/dev/null | head -n1 || true)" if ! grep -qE '^\s{2}hxki-web:\s*$' "$F"; then echo "[1] hxki-web fehlt -> versuche Restore aus Backup" if [ -z "${LATEST_WEB_SRC:-}" ] || ! grep -qE '^\s{2}hxki-web:\s*$' "$LATEST_WEB_SRC"; then echo "FAIL: Kein Backup mit hxki-web gefunden. Lege eine Quelle bereit (z.B. altes Compose)." echo " Erwartet: $DIR/backup-*/docker-compose.yml.orig mit ' hxki-web:' drin." exit 1 fi python3 - < ergänze fehlende mappings def has(line): return re.search(r'(?m)^\s{6}-\s*' + re.escape(line) + r'\s*$', sb) add = [l for l in ports_lines if not has(l)] if add: sb2 = re.sub(r'(?m)^(\s{4}ports:\s*\n)', r'\1' + ''.join([f' - "{l}"\n' for l in add]), sb, count=1) else: sb2 = sb else: # kein ports block -> vor networks oder am ende einfügen ins = " ports:\n" + ''.join([f' - "{l}"\n' for l in ports_lines]) if re.search(r'(?m)^\s{4}networks:\s*', sb): sb2 = re.sub(r'(?m)^(\s{4}networks:\s*)', ins + r'\1', sb, count=1) else: sb2 = sb.rstrip() + "\n" + ins return pat, sb, sb2 ports = ["80:80","443:443","443:443/udp","2019:2019"] pat, old, new = ensure_ports_for("hx-caddy", ports) if old != new: s2 = re.sub(pat, new, s, count=1) p.write_text(s2) print("OK: hx-caddy ports nach außen gesetzt/ergänzt.") else: print("OK: hx-caddy ports waren schon da.") PY # 3) n8n muss im Container auf 0.0.0.0 lauschen (damit Caddy reinkommt) python3 - </dev/null echo "OK: Compose valide." # 5) Orchester neu starten cd "$DIR" docker compose down --remove-orphans || true docker compose up -d --remove-orphans # 6) n8n Listen-Check im Container echo "[T] n8n lauscht?" for i in {1..60}; do if docker exec hxki-n8n sh -lc "ss -lnt | grep -q ':5678'"; then echo "OK: n8n lauscht auf 5678." break fi sleep 1 done # 7) Caddy -> n8n intern echo "[T] Caddy -> n8n?" docker exec -it hx-caddy sh -lc 'wget -qO- http://hxki-n8n:5678/ >/dev/null && echo OK_CADDY_TO_N8N || echo FAIL_CADDY_TO_N8N' # 8) Status docker ps --format 'NAME={{.Names}} STATUS={{.Status}} PORTS={{.Ports}}' echo "=== ENDE COM2 REPAIR ONE-SHOT ==="