#!/usr/bin/env bash set -euo pipefail DIR="/opt/hx-ki/com2-stack" ENVF="$DIR/.env" NET="hxki-internal" BKDIR="/opt/hx-ki/backups/com2-db-$(date +%Y%m%d-%H%M%S)" cd "$DIR" mkdir -p "$BKDIR" echo "=== COM2 DB CAUSE FIX (one-shot, deterministisch) ===" echo "Compose: $DIR/docker-compose.yml" echo "ENV: $ENVF" echo "Backup: $BKDIR" [ -f "$DIR/docker-compose.yml" ] || { echo "FEHLT: $DIR/docker-compose.yml"; exit 1; } [ -f "$ENVF" ] || { echo "FEHLT: $ENVF"; exit 1; } # Kein Placeholders if grep -qE 'CHANGE_ME|CHANGEME|changeme' "$ENVF"; then echo "FAIL: In $ENVF sind noch Platzhalter (CHANGE_ME...). Erst echte Passwörter setzen." exit 1 fi # Netzwerk external muss existieren (keine YAML-Frickelei, nur Host-Fakt) docker network inspect "$NET" >/dev/null 2>&1 || docker network create "$NET" >/dev/null echo "[1] Orchester runter" docker compose down --remove-orphans || true # Helper: Named Volume ermitteln (Destination muss Standard sein) get_named_volume_for_dest() { local c="$1" dest="$2" docker inspect "$c" --format '{{range .Mounts}}{{if and (eq .Type "volume") (eq .Destination "'"$dest"'")}}{{println .Name}}{{end}}{{end}}' } backup_volume() { local vol="$1" name="$2" echo " -> Backup volume $vol -> $BKDIR/${name}.tar.gz" docker run --rm -v "${vol}:/v:ro" -v "${BKDIR}:/b" alpine \ sh -lc "cd /v && tar -czf /b/${name}.tar.gz ." } PGC="hxki-postgres" MDBC="hxki-mariadb" echo "[2] Container check" docker inspect "$PGC" >/dev/null 2>&1 || { echo "FAIL: Container fehlt: $PGC"; exit 1; } docker inspect "$MDBC" >/dev/null 2>&1 || { echo "FAIL: Container fehlt: $MDBC"; exit 1; } echo "[3] Volumes ermitteln" PGVOL="$(get_named_volume_for_dest "$PGC" "/var/lib/postgresql/data" || true)" MDBVOL="$(get_named_volume_for_dest "$MDBC" "/var/lib/mysql" || true)" echo " Postgres volume: ${PGVOL:-}" echo " MariaDB volume: ${MDBVOL:-}" [ -n "${PGVOL:-}" ] || { echo "FAIL: Postgres nutzt kein Named Volume auf /var/lib/postgresql/data"; exit 1; } [ -n "${MDBVOL:-}" ] || { echo "FAIL: MariaDB nutzt kein Named Volume auf /var/lib/mysql"; exit 1; } echo "[4] Backup DB-Volumes (Beweis/Absicherung)" backup_volume "$PGVOL" "postgres_${PGVOL}" backup_volume "$MDBVOL" "mariadb_${MDBVOL}" echo "[5] Volume-Reset (Ursache fixen: Secrets-Drift eliminieren)" docker volume rm "$PGVOL" "$MDBVOL" echo "[6] Orchester hoch (DBs initialisieren NEU aus .env)" docker compose up -d --remove-orphans echo echo "[7] Hard checks (nur Fakten)" docker ps --format 'NAME={{.Names}} STATUS={{.Status}} PORTS={{.Ports}}' | egrep 'hxki-postgres|hxki-mariadb|hxki-n8n|hxki-mautic|hxki-web|hx-caddy' || true echo echo "[8] DB Init-Fakten (Logs kurz)" echo "--- postgres ---" docker logs --tail=40 hxki-postgres || true echo "--- mariadb ---" docker logs --tail=40 hxki-mariadb || true echo echo "[9] App-Fakten (Logs kurz)" echo "--- n8n ---" docker logs --tail=60 hxki-n8n || true echo "--- mautic ---" docker logs --tail=60 hxki-mautic || true echo "=== ENDE ===" echo "Backups: $BKDIR"