110 lines
No EOL
3.5 KiB
Bash
110 lines
No EOL
3.5 KiB
Bash
#!/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 |