Files
hx-ki.com2/COM2_DB_VOLUME_REPAIR_ONE_SHOT.sh
2026-03-06 15:22:40 +00:00

105 lines
3.5 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
set -euo pipefail
DIR="/opt/hx-ki/com2-stack"
ENVF="$DIR/.env"
echo "=== COM2 · DB VOLUME REPAIR (one-shot, deterministisch) ==="
[ -f "$ENVF" ] || { echo "FEHLT: $ENVF"; exit 1; }
# .env laden
set -a
# shellcheck disable=SC1090
source "$ENVF"
set +a
# Hard stop bei Platzhaltern
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
# Erwartete Variablen (min.)
: "${PG_USER:?PG_USER fehlt}"
: "${PG_PASSWORD:?PG_PASSWORD fehlt}"
: "${PG_DB:?PG_DB fehlt}"
: "${MAUTIC_DB:?MAUTIC_DB fehlt}"
: "${MAUTIC_DB_USER:?MAUTIC_DB_USER fehlt}"
: "${MAUTIC_DB_PASSWORD:?MAUTIC_DB_PASSWORD fehlt}"
: "${MARIADB_ROOT_PASSWORD:?MARIADB_ROOT_PASSWORD fehlt}"
echo "[1] POSTGRES fix im bestehenden Volume (User/Pass/DB)"
# In der offiziellen postgres-image ist "local" i.d.R. trust -> psql ohne Passwort im Container möglich.
# Wir connecten als der initiale Admin-User (POSTGRES_USER im Container), der bei dir "hxki" ist.
if ! docker exec -i hxki-postgres sh -lc "psql -U '${PG_USER}' -d postgres -tAc \"SELECT 1\" >/dev/null" 2>/dev/null; then
echo "FAIL: Kann Postgres im Container nicht per local-socket als ${PG_USER} erreichen."
echo " Ursache: entweder Container nicht running oder local auth ist nicht trust."
exit 1
fi
# Passwort angleichen + DB sicherstellen
docker exec -i hxki-postgres sh -lc "
psql -U '${PG_USER}' -d postgres -v ON_ERROR_STOP=1 <<SQL
DO \$\$
BEGIN
-- User sicherstellen
IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname='${PG_USER}') THEN
CREATE ROLE ${PG_USER} LOGIN;
END IF;
END
\$\$;
ALTER ROLE ${PG_USER} WITH PASSWORD '${PG_PASSWORD}';
DO \$\$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_database WHERE datname='${PG_DB}') THEN
CREATE DATABASE ${PG_DB} OWNER ${PG_USER};
END IF;
END
\$\$;
SQL
" >/dev/null
echo "OK: Postgres User/Pass/DB synchronisiert (Volume bleibt intakt)"
echo
echo "[2] MARIADB fix im bestehenden Volume (root erreichbar? user/db/grants)"
# Versuch 1: root via unix_socket (ohne Passwort) klappt bei manchen Setups
if docker exec -i hxki-mariadb sh -lc "mysql -uroot -e 'SELECT 1' >/dev/null" 2>/dev/null; then
MYSQL_AUTH="mysql -uroot"
else
# Versuch 2: root mit Passwort aus .env
MYSQL_AUTH="mysql -uroot -p'${MARIADB_ROOT_PASSWORD}'"
if ! docker exec -i hxki-mariadb sh -lc "${MYSQL_AUTH} -e 'SELECT 1' >/dev/null" 2>/dev/null; then
echo "FAIL: MariaDB root login schlägt fehl (weder socket noch Passwort)."
echo " Das heißt: Volume hat ein anderes root-PW als in .env."
echo " Ferrari-like Optionen: (A) altes root-PW wiederfinden ODER (B) Volume kontrolliert neu initialisieren."
exit 1
fi
fi
# DB + User + Grants für Mautic
docker exec -i hxki-mariadb sh -lc "
${MYSQL_AUTH} <<SQL
CREATE DATABASE IF NOT EXISTS \`${MAUTIC_DB}\` 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}\`.* TO '${MAUTIC_DB_USER}'@'%';
FLUSH PRIVILEGES;
SQL
" >/dev/null
echo "OK: MariaDB mautic DB/User/Grants synchronisiert (Volume bleibt intakt)"
echo
echo "[3] Services neu starten (damit sie die jetzt korrekten Credentials nutzen)"
cd "$DIR"
docker compose restart hxki-postgres hxki-mariadb hxki-n8n hxki-mautic >/dev/null || true
echo
echo "[4] Hard Checks (nur Fakten)"
echo "--- n8n should stop DB-auth loop ---"
docker logs --tail=25 hxki-n8n || true
echo "--- mautic should stop DB-auth loop ---"
docker logs --tail=25 hxki-mautic || true
echo "=== ENDE ==="