#!/usr/bin/env bash set -euo pipefail cd /opt/hx-ki/com2-stack F="docker-compose.yml" [ -f "$F" ] || { echo "FEHLT: $PWD/$F"; exit 1; } echo "=== COM2: PURGE GRAFANA (service + volume + refs) ===" # Orchester runter (sauber) docker compose down || true python3 - <<'PY' import re, pathlib p = pathlib.Path("/opt/hx-ki/com2-stack/docker-compose.yml") s = p.read_text() def drop_service_block(text: str, names): # Entfernt Service-Blöcke unter "services:" bei 2-space indentation for name in names: pat = rf'(?ms)^\s{{2}}{re.escape(name)}:\s*\n(?:^\s{{4}}.*\n|^\s{{6}}.*\n|^\s{{8}}.*\n|^\s*\n)*?(?=^\s{{2}}[A-Za-z0-9_.-]+:\s*$|\Z)' text = re.sub(pat, '', text) return text # 1) Service-Blöcke raus s = drop_service_block(s, ["grafana", "hxki-grafana"]) # 2) Volume-Definition grafana_data raus (unter volumes:) s = re.sub(r'(?ms)^\s{2}grafana_data:\s*\n(?:^\s{4}.*\n|^\s*\n)*?(?=^\s{2}[A-Za-z0-9_.-]+:\s*$|\Z)', '', s) # 3) Alle Referenzen/Mounts auf grafana_data raus (Listenform & mapping form) s = re.sub(r'(?m)^\s*-\s*grafana_data(?::[^\n]*)?\s*$', '', s) # "- grafana_data:..." s = re.sub(r'(?m)^\s*grafana_data:\s*\n(?:^\s+.*\n)*', '', s) # mapping "grafana_data:\n ..." # 4) Leere "volumes:" Sektion aufräumen (falls komplett leer) s = re.sub(r'(?ms)^\s*volumes:\s*\n(?=(\s*\n|\s*#.*\n)*\Z)', '', s) p.write_text(s) print("OK: Grafana (services/volume/refs) komplett entfernt.") PY echo "[VALIDATE]" docker compose config >/dev/null echo "OK: Compose ist valide." echo "[UP]" docker compose up -d --remove-orphans echo "=== STATUS ===" docker ps --format 'NAME={{.Names}} STATUS={{.Status}} PORTS={{.Ports}}' echo "=== HXKI-INTERNAL ===" docker network inspect hxki-internal --format '{{range $id,$c := .Containers}}{{println $c.Name}}{{end}}' | sort echo "=== ENDE ==="