#!/bin/bash set -e # Database configuration with defaults DB_NAME="${DB_DATABASE:-trip_planner}" DB_USER="${DB_USERNAME:-trip_planner}" DB_PASS="${DB_PASSWORD:-trip_planner_secret}" DB_ROOT_PASS="${DB_ROOT_PASSWORD:-$(openssl rand -base64 32)}" # Initialize MariaDB data directory if needed if [ ! -d "/var/lib/mysql-data/mysql" ]; then echo "Initializing MariaDB data directory..." mysql_install_db --user=mysql --datadir=/var/lib/mysql-data fi # Check if database is already initialized using marker file DB_INITIALIZED=false if [ -f "/var/lib/mysql-data/.initialized" ]; then DB_INITIALIZED=true echo "Database already initialized (marker file exists)" fi # If not initialized, set up database if [ "$DB_INITIALIZED" = false ]; then echo "Setting up database for the first time..." # Validate APP_KEY is set if [ -z "$APP_KEY" ]; then echo "ERROR: APP_KEY not set. Generate with: docker run --rm trip-planner php artisan key:generate --show" exit 1 fi # Start MariaDB mysqld_safe --datadir=/var/lib/mysql-data --user=mysql & MYSQL_PID=$! # Wait for MariaDB to start echo "Waiting for MariaDB to be ready..." for i in {1..30}; do if mysqladmin ping -h localhost --silent 2>/dev/null; then echo "MariaDB is ready!" break fi if [ $i -eq 30 ]; then echo "MariaDB failed to start in time" exit 1 fi sleep 1 done # Set root password and configure database if ! mysql -u root <<-EOSQL ALTER USER 'root'@'localhost' IDENTIFIED BY '${DB_ROOT_PASS}'; DELETE FROM mysql.user WHERE User=''; DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'; CREATE DATABASE IF NOT EXISTS ${DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER IF NOT EXISTS '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}'; GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '${DB_USER}'@'localhost'; FLUSH PRIVILEGES; EOSQL then echo "ERROR: Database initialization failed" exit 1 fi echo "Database created and user configured" # Wait for database to be accessible by application user echo "Verifying database accessibility..." cd /var/www/html for i in {1..10}; do if mysql -u "${DB_USER}" -p"${DB_PASS}" -h localhost "${DB_NAME}" -e "SELECT 1" &>/dev/null; then echo "Database accessible!" break fi if [ $i -eq 10 ]; then echo "ERROR: Database not accessible" exit 1 fi sleep 1 done # Run Laravel migrations echo "Running Laravel migrations..." if ! php artisan migrate --force; then echo "ERROR: Migration failed" exit 1 fi # Optimize Laravel for production echo "Optimizing Laravel for production..." php artisan config:cache php artisan route:cache php artisan view:cache # Create marker file to indicate successful initialization touch /var/lib/mysql-data/.initialized echo "Database initialization complete!" # Shutdown MariaDB for clean restart mysqladmin -u root -p"${DB_ROOT_PASS}" shutdown 2>/dev/null || kill $MYSQL_PID wait $MYSQL_PID 2>/dev/null || true fi # Start MariaDB in foreground echo "Starting MariaDB..." exec mysqld --datadir=/var/lib/mysql-data --user=mysql