#!/usr/bin/env bash set -euo pipefail BASE="/opt/hx-ki/com-stack/docker-compose.yml" OUTDIR="/opt/hx-ki/com2-stack" OUT="$OUTDIR/docker-compose.yml" TS="$(date +%Y%m%d-%H%M%S)" echo "=== COM2 REBUILD (Autorität wird: $OUT) ===" # 0) Basis muss existieren (dein aktueller „Wahrheits-Compose“) [ -f "$BASE" ] || { echo "FEHLT: $BASE"; exit 1; } mkdir -p "$OUTDIR" echo "[1] Backup vom aktuellen com-stack Compose" cp -a "$BASE" "${BASE}.bak.${TS}" echo "[2] Erzeuge kanonische YAML aus Basis-Compose" TMP_CANON="/tmp/com2.base.${TS}.yml" docker compose -f "$BASE" config > "$TMP_CANON" echo "[3] Entferne Service: grafana (falls vorhanden)" TMP_NOGRAF="/tmp/com2.nograf.${TS}.yml" awk ' BEGIN{skip=0} /^ grafana:$/ {skip=1; next} skip==1 && /^ [A-Za-z0-9_.-]+:$/ {skip=0} skip==0 {print} ' "$TMP_CANON" > "$TMP_NOGRAF" echo "[4] Suche vorhandene Mautic-Compose-Datei auf dem Server" MAUTIC_FILE="$(grep -RIl --exclude-dir='.git' --include='*.yml' --include='*.yaml' -E '^[[:space:]]*mautic:' /opt/hx-ki 2>/dev/null | head -n1 || true)" if [ -z "${MAUTIC_FILE:-}" ]; then echo "WARN: Keine vorhandene 'mautic:' Definition unter /opt/hx-ki gefunden." echo " -> COM2-Compose wird OHNE Mautic geschrieben (weil du 0% Vermutung willst)." cp -a "$TMP_NOGRAF" "$OUT" else echo "OK: Mautic-Definition gefunden in: $MAUTIC_FILE" TMP_MAUTIC_CANON="/tmp/com2.mautic.${TS}.yml" docker compose -f "$MAUTIC_FILE" config > "$TMP_MAUTIC_CANON" echo "[5] Extrahiere nur den Mautic-Service-Block (deterministisch)" TMP_MAUTIC_BLOCK="/tmp/com2.mautic.block.${TS}.yml" awk ' BEGIN{inservices=0; grab=0} /^services:$/ {inservices=1; next} inservices==1 && /^ mautic:$/ {grab=1; print " mautic:"; next} grab==1 && /^ [A-Za-z0-9_.-]+:$/ {grab=0} grab==1 {print} ' "$TMP_MAUTIC_CANON" > "$TMP_MAUTIC_BLOCK" if ! grep -q '^ mautic:$' "$TMP_MAUTIC_BLOCK"; then echo "WARN: Konnte mautic-Block nicht extrahieren -> schreibe ohne Mautic (0% Vermutung)." cp -a "$TMP_NOGRAF" "$OUT" else echo "[6] Füge Mautic in COM2-Compose ein (unter services:)" # Insert mautic block right after 'services:' line awk -v block="$TMP_MAUTIC_BLOCK" ' BEGIN{inserted=0} /^services:$/ { print if (inserted==0) { while ((getline line < block) > 0) print line close(block) inserted=1 } next } {print} ' "$TMP_NOGRAF" > "$OUT" fi fi echo "[7] Host-Caddy stoppen (damit Docker-Caddy Port 80/443 bekommt), falls aktiv" if systemctl is-active --quiet caddy 2>/dev/null; then systemctl stop caddy fi echo "[8] hxki-internal sicherstellen" if ! docker network ls --format '{{.Name}}' | grep -q '^hxki-internal$'; then docker network create hxki-internal >/dev/null fi echo "[9] COM2 Orchester starten NUR aus $OUT" cd "$OUTDIR" docker compose down --remove-orphans || true docker compose up -d --remove-orphans echo echo "=== COM2 STATUS (nur Fakten) ===" docker ps --format 'NAME={{.Names}} STATUS={{.Status}} PORTS={{.Ports}}' echo echo "hxki-internal Mitglieder:" docker network inspect hxki-internal --format '{{range $id,$c := .Containers}}{{println $c.Name}}{{end}}' | sort echo "=== ENDE ==="