trip-planner/docker/production/init-db.sh

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