105 lines
3.5 KiB
Bash
Executable File
105 lines
3.5 KiB
Bash
Executable File
#!/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 ==="
|