#!/usr/bin/env bash set -euo pipefail DIR="/opt/hx-ki/com2-stack" ENVF="$DIR/.env" NET="hxki-internal" BK="/opt/hx-ki/backups/com2-db-align-$(date +%Y%m%d-%H%M%S)" mkdir -p "$BK" echo "=== COM2 · DB ALIGN TO ENV (ONE-SHOT, NO DATA LOSS) ===" echo "Env: $ENVF" echo "Backup: $BK" echo [ -f "$ENVF" ] || { echo "FAIL: FEHLT $ENVF"; exit 1; } if grep -qE 'CHANGE_ME|CHANGEME|changeme' "$ENVF"; then echo "FAIL: In $ENVF sind noch Platzhalter (CHANGE_ME...)."; exit 1 fi # .env laden (nur simple KEY=VALUE Zeilen) set -a . "$ENVF" set +a # Pflicht-Keys Postgres : "${PG_USER:?fehlend in .env}" : "${PG_PASSWORD:?fehlend in .env}" : "${PG_DB:?fehlend in .env}" # Pflicht-Keys MariaDB/Mautic (passen zu deinem Compose – ggf. in .env ergänzen) : "${MYSQL_ROOT_PASSWORD:?fehlend in .env}" : "${MAUTIC_DB_NAME:?fehlend in .env}" : "${MAUTIC_DB_USER:?fehlend in .env}" : "${MAUTIC_DB_PASSWORD:?fehlend in .env}" docker network inspect "$NET" >/dev/null 2>&1 || docker network create "$NET" >/dev/null cd "$DIR" echo "[1] DB-Container sauber runter (nur DBs)" docker compose rm -sf hxki-postgres hxki-mariadb >/dev/null 2>&1 || true echo "[2] Postgres hoch (nur DB)" docker compose up -d hxki-postgres echo "[3] Wait: Postgres ready (pg_isready)" for i in $(seq 1 60); do if docker exec -u postgres hxki-postgres pg_isready -q >/dev/null 2>&1; then echo "OK: Postgres ready." break fi sleep 1 if [ "$i" = "60" ]; then echo "FAIL: Postgres wird nicht ready."; exit 1 fi done echo "[4] Postgres: Role/DB auf .env angleichen (ohne pg_hba-Hacks)" # WICHTIG: als OS-User 'postgres' im Container -> lokaler Socket -> kein Passwort nötig docker exec -u postgres hxki-postgres psql -v ON_ERROR_STOP=1 -d postgres </dev/null 2>&1 || true # Reset-Container starten (gleicher Bind-Mount wie dein echtes Setup!) docker run -d --name hxki-mariadb-reset \ --network "$NET" \ -v /opt/hx-ki/mautic/db:/var/lib/mysql \ "$IMG" \ --skip-networking --skip-grant-tables >/dev/null echo "[6] Wait: MariaDB Reset ready" for i in $(seq 1 60); do if docker exec hxki-mariadb-reset sh -lc "mariadb -uroot -e 'SELECT 1' >/dev/null 2>&1"; then echo "OK: MariaDB reset ready." break fi sleep 1 if [ "$i" = "60" ]; then echo "FAIL: MariaDB reset wird nicht ready."; docker logs --tail=80 hxki-mariadb-reset || true; exit 1 fi done echo "[7] MariaDB: root-PW setzen + Mautic DB/User sicherstellen" docker exec hxki-mariadb-reset sh -lc "mariadb -uroot <<'SQL' FLUSH PRIVILEGES; -- Root Passwort (für localhost und %) ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}'; CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; -- Mautic DB + User CREATE DATABASE IF NOT EXISTS \`${MAUTIC_DB_NAME}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER IF NOT EXISTS '${MAUTIC_DB_USER}'@'%' IDENTIFIED BY '${MAUTIC_DB_PASSWORD}'; GRANT ALL PRIVILEGES ON \`${MAUTIC_DB_NAME}\`.* TO '${MAUTIC_DB_USER}'@'%'; FLUSH PRIVILEGES; SQL" echo "OK: MariaDB aligned." echo "[8] Reset-Container stoppen" docker rm -f hxki-mariadb-reset >/dev/null echo "[9] Echtes Orchester hoch (DBs + Apps)" docker compose up -d --remove-orphans echo echo "[A] Quick checks" echo "- Postgres Auth (mit .env User/PW):" docker exec -e PGPASSWORD="${PG_PASSWORD}" hxki-postgres sh -lc "psql -U '${PG_USER}' -d '${PG_DB}' -c 'select 1' >/dev/null" \ && echo "OK_PG_AUTH" || echo "FAIL_PG_AUTH" echo "- MariaDB Auth (Mautic User):" docker exec hxki-mariadb sh -lc "mariadb -u'${MAUTIC_DB_USER}' -p'${MAUTIC_DB_PASSWORD}' -e 'SELECT 1' '${MAUTIC_DB_NAME}' >/dev/null" \ && echo "OK_MY_AUTH" || echo "FAIL_MY_AUTH" echo "- n8n -> localhost:5678 im Container:" docker exec hxki-n8n sh -lc "wget -qO- http://127.0.0.1:5678/ >/dev/null && echo OK_N8N_LISTEN || echo FAIL_N8N_LISTEN" || true echo "- Caddy -> n8n/mautic/web intern:" docker exec hx-caddy sh -lc "wget -qO- http://hxki-n8n:5678/ >/dev/null && echo OK_CADDY_TO_N8N || echo FAIL_CADDY_TO_N8N" || true docker exec hx-caddy sh -lc "wget -qO- http://hxki-mautic/ >/dev/null && echo OK_CADDY_TO_MAUTIC || echo FAIL_CADDY_TO_MAUTIC" || true docker exec hx-caddy sh -lc "wget -qO- http://hxki-web/ >/dev/null && echo OK_CADDY_TO_WEB || echo FAIL_CADDY_TO_WEB" || true echo echo "=== DONE ===" echo "Backup dir: $BK"