138 lines
4.1 KiB
Bash
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 "------------------------------------------------------" |