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

132 lines
5.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
DIR="/opt/hx-ki/com2-stack"
ENVF="$DIR/.env"
COMPOSE="$DIR/docker-compose.yml"
MA="hxki-mautic"
MY="hxki-mariadb"
echo "=== COM2 · MAUTIC INSTALL ONE-SHOT (no guessing) ==="
echo "Compose: $COMPOSE"
echo "Env: $ENVF"
echo
[ -f "$COMPOSE" ] || { echo "FAIL: missing $COMPOSE"; exit 1; }
[ -f "$ENVF" ] || { echo "FAIL: missing $ENVF"; exit 1; }
docker inspect "$MA" >/dev/null 2>&1 || { echo "FAIL: missing container $MA"; exit 1; }
docker inspect "$MY" >/dev/null 2>&1 || { echo "FAIL: missing container $MY"; exit 1; }
# --- [1] Ground truth DB params from mautic container env -------------------
DB_HOST="$(docker inspect "$MA" --format '{{range .Config.Env}}{{println .}}{{end}}' | awk -F= '/^MAUTIC_DB_HOST=/{print $2}' | tail -n1)"
DB_USER="$(docker inspect "$MA" --format '{{range .Config.Env}}{{println .}}{{end}}' | awk -F= '/^MAUTIC_DB_USER=/{print $2}' | tail -n1)"
DB_PASS="$(docker inspect "$MA" --format '{{range .Config.Env}}{{println .}}{{end}}' | awk -F= '/^MAUTIC_DB_PASSWORD=/{print $2}' | tail -n1)"
DB_NAME="$(docker inspect "$MA" --format '{{range .Config.Env}}{{println .}}{{end}}' | awk -F= '/^MAUTIC_DB_NAME=/{print $2}' | tail -n1)"
[ -n "${DB_HOST:-}" ] || { echo "FAIL: MAUTIC_DB_HOST missing in container env"; exit 1; }
[ -n "${DB_USER:-}" ] || { echo "FAIL: MAUTIC_DB_USER missing in container env"; exit 1; }
[ -n "${DB_PASS:-}" ] || { echo "FAIL: MAUTIC_DB_PASSWORD missing in container env"; exit 1; }
[ -n "${DB_NAME:-}" ] || { echo "FAIL: MAUTIC_DB_NAME missing in container env"; exit 1; }
echo "[1] DB (ground truth): host=$DB_HOST db=$DB_NAME user=$DB_USER pass=***"
# --- [2] MariaDB root password from MariaDB container env (no guessing) -----
ROOTPW="$(docker inspect "$MY" --format '{{range .Config.Env}}{{println .}}{{end}}' \
| awk -F= '/^(MARIADB_ROOT_PASSWORD|MYSQL_ROOT_PASSWORD)=/{print $2}' | tail -n1 || true)"
[ -n "${ROOTPW:-}" ] || { echo "FAIL: MariaDB root PW not found in container env"; exit 1; }
echo "[2] MariaDB root PW present (not shown)"
# Wait until MariaDB accepts root connections
echo "[2a] Wait MariaDB ready (max 60s)"
for i in {1..60}; do
if docker exec -i "$MY" sh -lc "mariadb -uroot -p\"$ROOTPW\" -e 'SELECT 1' >/dev/null 2>&1"; then
echo " OK: MariaDB ready"
break
fi
sleep 1
[ "$i" -eq 60 ] && { echo "FAIL: MariaDB not ready"; docker logs --tail=120 "$MY" || true; exit 1; }
done
# Ensure DB + user + grants match the *existing* state (no data loss)
echo "[2b] Align DB user/grants to existing DB (no data loss)"
docker exec -i "$MY" sh -lc "mariadb -uroot -p\"$ROOTPW\" <<SQL
CREATE DATABASE IF NOT EXISTS \\\`$DB_NAME\\\`;
CREATE USER IF NOT EXISTS '$DB_USER'@'%' IDENTIFIED BY '$DB_PASS';
ALTER USER '$DB_USER'@'%' IDENTIFIED BY '$DB_PASS';
GRANT ALL PRIVILEGES ON \\\`$DB_NAME\\\`.* TO '$DB_USER'@'%';
FLUSH PRIVILEGES;
SQL"
echo " OK: grants aligned"
# --- [3] Ensure MAUTIC_ADMIN_* exists in .env (generate once, then persist) ---
echo "[3] Ensure MAUTIC_ADMIN_* in $ENVF (no guessing: generate+persist if missing)"
# Load env
set -a
# shellcheck disable=SC1090
. "$ENVF" || true
set +a
gen_pw() { tr -dc 'A-Za-z0-9!@#%^_-.' </dev/urandom | head -c 24; echo; }
if [ -z "${MAUTIC_ADMIN_USERNAME:-}" ]; then
MAUTIC_ADMIN_USERNAME="admin"
fi
if [ -z "${MAUTIC_ADMIN_PASSWORD:-}" ]; then
MAUTIC_ADMIN_PASSWORD="$(gen_pw)"
fi
if [ -z "${MAUTIC_ADMIN_EMAIL:-}" ]; then
MAUTIC_ADMIN_EMAIL="admin@hxki.local"
fi
# Persist into .env (idempotent)
grep -q '^MAUTIC_ADMIN_USERNAME=' "$ENVF" && sed -i "s/^MAUTIC_ADMIN_USERNAME=.*/MAUTIC_ADMIN_USERNAME=$MAUTIC_ADMIN_USERNAME/" "$ENVF" || echo "MAUTIC_ADMIN_USERNAME=$MAUTIC_ADMIN_USERNAME" >> "$ENVF"
grep -q '^MAUTIC_ADMIN_PASSWORD=' "$ENVF" && sed -i "s/^MAUTIC_ADMIN_PASSWORD=.*/MAUTIC_ADMIN_PASSWORD=$MAUTIC_ADMIN_PASSWORD/" "$ENVF" || echo "MAUTIC_ADMIN_PASSWORD=$MAUTIC_ADMIN_PASSWORD" >> "$ENVF"
grep -q '^MAUTIC_ADMIN_EMAIL=' "$ENVF" && sed -i "s/^MAUTIC_ADMIN_EMAIL=.*/MAUTIC_ADMIN_EMAIL=$MAUTIC_ADMIN_EMAIL/" "$ENVF" || echo "MAUTIC_ADMIN_EMAIL=$MAUTIC_ADMIN_EMAIL" >> "$ENVF"
echo " OK: MAUTIC_ADMIN_USERNAME=$MAUTIC_ADMIN_USERNAME"
echo " OK: MAUTIC_ADMIN_EMAIL=$MAUTIC_ADMIN_EMAIL"
echo " OK: MAUTIC_ADMIN_PASSWORD=*** (written to .env)"
# --- [4] Recreate mautic so it receives new env ----------------------------
echo "[4] Recreate $MA to inject admin env"
cd "$DIR"
docker compose up -d --force-recreate "$MA" >/dev/null
# --- [5] Install if not installed -----------------------------------------
echo "[5] Install check"
if docker exec "$MA" test -f app/config/local.php; then
echo "OK: already installed (local.php exists)"
else
echo "Not installed yet -> trying CLI install (only if available)"
# Find console path
CONSOLE=""
if docker exec "$MA" test -x /var/www/html/bin/console; then CONSOLE="/var/www/html/bin/console"; fi
if [ -z "$CONSOLE" ] && docker exec "$MA" test -x /var/www/html/app/console; then CONSOLE="/var/www/html/app/console"; fi
[ -n "$CONSOLE" ] || { echo "FAIL: cannot find Mautic console (bin/console or app/console)"; exit 1; }
# Verify command exists
if ! docker exec "$MA" sh -lc "php $CONSOLE list 2>/dev/null | grep -q 'mautic:install'"; then
echo "FAIL: mautic:install command not available in this image -> cannot do scripted install without guessing image internals."
exit 1
fi
# Run install with explicit params (no guessing)
docker exec "$MA" sh -lc "php $CONSOLE mautic:install --force \
--db_host='$DB_HOST' --db_name='$DB_NAME' --db_user='$DB_USER' --db_password='$DB_PASS' \
--admin_username='$MAUTIC_ADMIN_USERNAME' --admin_password='$MAUTIC_ADMIN_PASSWORD' --admin_email='$MAUTIC_ADMIN_EMAIL'"
echo "OK: install command executed"
fi
echo
echo "=== DONE ==="
echo "Admin user: $MAUTIC_ADMIN_USERNAME"
echo "Admin email: $MAUTIC_ADMIN_EMAIL"
echo "Admin pass: (steht in $ENVF)"