scMedia/docker/scripts/init-db.sh
2026-01-16 22:53:04 +01:00

101 lines
3.0 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
HOST="${DB_HOST:-db}"
PORT="${DB_PORT:-3306}"
NAME="${DB_NAME:-scmedia}"
USER="${DB_USER:-scmedia}"
PASS="${DB_PASS:-changeme}"
ROOT_PASS="${DB_ROOT_PASS:-${MARIADB_ROOT_PASSWORD:-}}"
MODE=""
ENV_PATH=""
while [ "${#}" -gt 0 ]; do
case "$1" in
--destroy)
MODE="--destroy"
shift
;;
--env)
ENV_PATH="${2:-}"
shift 2
;;
*)
shift
;;
esac
done
if [ -n "${ENV_PATH}" ]; then
if [ ! -f "${ENV_PATH}" ]; then
echo "Env file not found: ${ENV_PATH}" >&2
exit 1
fi
set -a
# shellcheck disable=SC1090
. "${ENV_PATH}"
set +a
fi
HOST="${DB_HOST:-db}"
PORT="${DB_PORT:-3306}"
NAME="${DB_NAME:-scmedia}"
USER="${DB_USER:-scmedia}"
PASS="${DB_PASS:-changeme}"
ROOT_PASS="${DB_ROOT_PASS:-${MARIADB_ROOT_PASSWORD:-}}"
PROTO_ARGS=()
if [ "${HOST}" = "localhost" ] || [ "${HOST}" = "127.0.0.1" ]; then
PROTO_ARGS=(--protocol=tcp)
fi
if [ -z "${ROOT_PASS}" ]; then
echo "Missing DB_ROOT_PASS/MARIADB_ROOT_PASSWORD for init" >&2
exit 1
fi
for i in $(seq 1 60); do
if mysqladmin ping -h"${HOST}" -P"${PORT}" "${PROTO_ARGS[@]}" -uroot -p"${ROOT_PASS}" --silent; then
break
fi
sleep 1
done
if [ "${MODE}" = "--destroy" ]; then
if mysql -h"${HOST}" -P"${PORT}" "${PROTO_ARGS[@]}" -uroot -p"${ROOT_PASS}" -N -e \
"SELECT 1 FROM mysql.user WHERE User='${USER}' AND Host='%';" | grep -q 1; then
mysql -h"${HOST}" -P"${PORT}" "${PROTO_ARGS[@]}" -uroot -p"${ROOT_PASS}" -e \
"REVOKE ALL PRIVILEGES, GRANT OPTION FROM '${USER}'@'%'; FLUSH PRIVILEGES;"
mysql -h"${HOST}" -P"${PORT}" "${PROTO_ARGS[@]}" -uroot -p"${ROOT_PASS}" -e \
"DROP USER '${USER}'@'%';"
fi
mysql -h"${HOST}" -P"${PORT}" "${PROTO_ARGS[@]}" -uroot -p"${ROOT_PASS}" -e \
"DROP DATABASE IF EXISTS \`${NAME}\`;"
echo "Destroyed database/user/privileges"
exit 0
fi
mysql -h"${HOST}" -P"${PORT}" "${PROTO_ARGS[@]}" -uroot -p"${ROOT_PASS}" -e \
"CREATE DATABASE IF NOT EXISTS \`${NAME}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -h"${HOST}" -P"${PORT}" "${PROTO_ARGS[@]}" -uroot -p"${ROOT_PASS}" -e \
"CREATE USER IF NOT EXISTS '${USER}'@'%' IDENTIFIED BY '${PASS}';"
mysql -h"${HOST}" -P"${PORT}" "${PROTO_ARGS[@]}" -uroot -p"${ROOT_PASS}" -e \
"GRANT ALL PRIVILEGES ON \`${NAME}\`.* TO '${USER}'@'%'; FLUSH PRIVILEGES;"
if mysql -h"${HOST}" -P"${PORT}" "${PROTO_ARGS[@]}" -u"${USER}" -p"${PASS}" "${NAME}" -e "SHOW TABLES LIKE 'items'" | grep -q items; then
echo "Schema already present, skip import"
exit 0
fi
SCHEMA_PATH="${SCHEMA_PATH:-/var/www/sql/schema.sql}"
if [ ! -f "${SCHEMA_PATH}" ]; then
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
if [ -f "${PROJECT_ROOT}/sql/schema.sql" ]; then
SCHEMA_PATH="${PROJECT_ROOT}/sql/schema.sql"
fi
fi
echo "Importing schema.sql from ${SCHEMA_PATH}..."
mysql -h"${HOST}" -P"${PORT}" "${PROTO_ARGS[@]}" -u"${USER}" -p"${PASS}" "${NAME}" < "${SCHEMA_PATH}"
echo "Done"