Files
WKVS/docker-install.sh
T

138 lines
4.1 KiB
Bash

#!/usr/bin/env bash
set -e
# 1. Reset containers and volumes
docker compose down -v
# Ensure the config directory exists
mkdir -p config
# 2. Generate Random Variables correctly using $(...)
MYSQL_USER=$(openssl rand -hex 16)
MYSQL_PASSWORD=$(openssl rand -base64 32)
MYSQL_DATABASE="wkvs_database"
MYSQL_ROOT_PASSWORD=$(openssl rand -base64 32)
cat <<EOF > config/.env.docker.db
MYSQL_ROOT_PASSWORD="$MYSQL_ROOT_PASSWORD"
MYSQL_DATABASE=$MYSQL_DATABASE
MYSQL_USER=$MYSQL_USER
MYSQL_PASSWORD="$MYSQL_PASSWORD"
EOF
# 3. Handle Admin Hashing
KEYWORD=$(openssl rand -hex 16)
HASHED_KEYWORD=$(php -r "echo password_hash('$KEYWORD', PASSWORD_ARGON2ID);")
# Replace placeholder in SQL template
sed "s|__ARGON_HASH_PLACEHOLDER__|$HASHED_KEYWORD|g" docker/database/wkvs-database-template.sql > docker/database/db-sql.sql
# 1. Generate password
REDIS_PASSWORD=$(openssl rand -hex 32)
# 3. Save variables to your .env file
cat <<EOF > config/.env.redis
REDIS_PASSWORD="$REDIS_PASSWORD"
REDIS_HOST=redis
REDIS_PORT=6379
EOF
# 4. Start Docker Containers
docker compose up -d --build
# 5. Wait until MariaDB is fully up and accepting connections
echo "Waiting for MariaDB to start..."
sleep 5
until docker compose exec -T mariadb mariadb-admin ping -h localhost -u root -p"$MYSQL_ROOT_PASSWORD" --silent >/dev/null 2>&1; do
sleep 2
done
# 6. Execute Primary Schema Import
docker compose exec -T mariadb mariadb -u root -p"$MYSQL_ROOT_PASSWORD" "$MYSQL_DATABASE" < docker/database/db-sql.sql
rm docker/database/db-sql.sql
# 7. Generate Additional Application Users & Passwords
MYSQL_WKVS_USERNAME="wkvs_normal_user"
MYSQL_GUEST_USERNAME="wkvs_guest_user"
MYSQL_WKVS_PASSWORD=$(openssl rand -hex 32)
MYSQL_GUEST_PASSWORD=$(openssl rand -hex 16)
# Write app user configuration files
cat <<EOF > config/.env.db-wkvs-user
DB_USER=$MYSQL_WKVS_USERNAME
DB_PASSWORD="$MYSQL_WKVS_PASSWORD"
DB_NAME=$MYSQL_DATABASE
DB_HOST=mariadb
DB_PORT=3306
EOF
cat <<EOF > config/.env.db-guest
DB_GUEST_USER=$MYSQL_GUEST_USERNAME
DB_GUEST_PASSWORD="$MYSQL_GUEST_PASSWORD"
DB_NAME=$MYSQL_DATABASE
DB_HOST=mariadb
DB_PORT=3306
EOF
# 8. Create Additional Users & Grant Permissions in MariaDB
echo "Creating application users and setting permissions..."
docker compose exec -T mariadb mariadb -u root -p"$MYSQL_ROOT_PASSWORD" <<EOF
-- Create Normal User
CREATE USER IF NOT EXISTS '$MYSQL_WKVS_USERNAME'@'%' IDENTIFIED BY '$MYSQL_WKVS_PASSWORD';
GRANT SELECT, INSERT, UPDATE, DELETE ON \`$MYSQL_DATABASE\`.* TO '$MYSQL_WKVS_USERNAME'@'%';
-- Create Guest User
CREATE USER IF NOT EXISTS '$MYSQL_GUEST_USERNAME'@'%' IDENTIFIED BY '$MYSQL_GUEST_PASSWORD';
GRANT SELECT, INSERT, UPDATE ON \`$MYSQL_DATABASE\`.* TO '$MYSQL_GUEST_USERNAME'@'%';
FLUSH PRIVILEGES;
EOF
SERVICE_NAME="apache"
COMPOSER_DIR="/var/www/wkvs/composer"
echo "Running Composer setup via Docker Compose..."
# 1. Download Composer inside the service container if not installed globally
docker compose exec "$SERVICE_NAME" bash -c '
if ! command -v composer &> /dev/null && [ ! -f "composer.phar" ]; then
php -r "copy('\''https://getcomposer.org/installer'\'', '\''composer-setup.php'\'');"
php composer-setup.php --quiet
php -r "unlink('\''composer-setup.php'\'');"
fi
'
# 2. Run composer install against the specified directory
docker compose exec "$SERVICE_NAME" bash -c "
COMPOSER_CMD=\$(command -v composer || echo \"php \$(pwd)/composer.phar\")
TARGET_DIR=\"$COMPOSER_DIR\"
if [ -f \"\$TARGET_DIR/composer.lock\" ] || [ -f \"\$TARGET_DIR/composer.json\" ]; then
\$COMPOSER_CMD install --working-dir=\"\$TARGET_DIR\" --no-interaction --prefer-dist --quiet
else
echo \"Error: Neither composer.json nor composer.lock found in '\$TARGET_DIR'.\" >&2
exit 1
fi
"
echo "Konfiguriere Redis..."
# 2. Set password in the currently running Redis container
docker compose exec redis redis-cli CONFIG SET requirepass "$REDIS_PASSWORD"
PASSWORD_KEY=openssl rand -base64 32
cat <<EOF > config/.env.pw-encryption-key
PW_ENCRYPTION_KEY=$PASSWORD_KEY
EOF
echo "------------------------------------------------------"
echo "Setup Complete!"
echo "Admin Plain Keyword: $KEYWORD"
echo "------------------------------------------------------"