app/.docker/production/entrypoint.sh

153 lines
4.8 KiB
Bash

#!/bin/bash
set -e
echo "=========================================="
echo "Dish Planner - Starting Initialization"
echo "=========================================="
# ============================================
# MySQL Initialization
# ============================================
echo "[1/6] Initializing MySQL..."
# Check if MySQL data directory is empty (first run)
if [ ! -d "/var/lib/mysql/mysql" ]; then
echo " → First run detected, initializing MySQL data directory..."
mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql
fi
# Start MySQL temporarily in background for setup
echo " → Starting MySQL..."
mysqld --user=mysql --datadir=/var/lib/mysql &
MYSQL_PID=$!
# Wait for MySQL to be ready
echo " → Waiting for MySQL to be ready..."
for i in {1..30}; do
if mysqladmin ping -h localhost --silent; then
echo " → MySQL is ready!"
break
fi
echo " → Waiting... ($i/30)"
sleep 2
done
# ============================================
# Database Setup
# ============================================
echo "[2/6] Setting up database..."
# Set default values for database credentials
DB_DATABASE=${DB_DATABASE:-dishplanner}
DB_USERNAME=${DB_USERNAME:-dishuser}
# Check if this is first run by looking for credentials file
CREDS_FILE="/var/www/backend/storage/.db_credentials"
if [ -f "$CREDS_FILE" ]; then
# Not first run - load existing credentials
echo " → Loading existing database credentials..."
source "$CREDS_FILE"
else
# First run - generate new credentials and save them
echo " → First run detected, generating credentials..."
DB_PASSWORD=${DB_PASSWORD:-$(openssl rand -base64 32)}
MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-$(openssl rand -base64 32)}
# Save credentials for future restarts
cat > "$CREDS_FILE" <<EOF
DB_PASSWORD='${DB_PASSWORD}'
MYSQL_ROOT_PASSWORD='${MYSQL_ROOT_PASSWORD}'
EOF
chmod 600 "$CREDS_FILE"
# Set root password
mysql -u root <<-EOSQL
ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
FLUSH PRIVILEGES;
EOSQL
# Create database and user
mysql -u root -p"${MYSQL_ROOT_PASSWORD}" <<-EOSQL
CREATE DATABASE IF NOT EXISTS ${DB_DATABASE};
CREATE USER IF NOT EXISTS '${DB_USERNAME}'@'localhost' IDENTIFIED BY '${DB_PASSWORD}';
CREATE USER IF NOT EXISTS '${DB_USERNAME}'@'%' IDENTIFIED BY '${DB_PASSWORD}';
GRANT ALL PRIVILEGES ON ${DB_DATABASE}.* TO '${DB_USERNAME}'@'localhost';
GRANT ALL PRIVILEGES ON ${DB_DATABASE}.* TO '${DB_USERNAME}'@'%';
FLUSH PRIVILEGES;
EOSQL
echo " → Database '${DB_DATABASE}' created"
echo " → User '${DB_USERNAME}' created"
fi
# ============================================
# Laravel Environment Setup
# ============================================
echo "[3/6] Configuring Laravel environment..."
cd /var/www/backend
# Create .env if it doesn't exist
if [ ! -f .env ]; then
echo " → Creating .env file..."
cp .env.example .env
fi
# Update database credentials in .env using a more robust method
# Use @ as delimiter to avoid conflicts with special chars in passwords
sed -i "s@DB_DATABASE=.*@DB_DATABASE=${DB_DATABASE}@" .env
sed -i "s@DB_USERNAME=.*@DB_USERNAME=${DB_USERNAME}@" .env
sed -i "s@DB_PASSWORD=.*@DB_PASSWORD=${DB_PASSWORD}@" .env
sed -i "s@DB_HOST=.*@DB_HOST=127.0.0.1@" .env
sed -i "s@DB_PORT=.*@DB_PORT=3306@" .env
# Generate APP_KEY if not set
if ! grep -q "APP_KEY=base64:" .env; then
echo " → Generating application key..."
php artisan key:generate --force
else
echo " → Application key already set"
fi
# Set APP_URL if provided
if [ -n "${APP_URL}" ]; then
sed -i "s@APP_URL=.*@APP_URL=${APP_URL}@" .env
fi
# ============================================
# Run Database Migrations
# ============================================
echo "[4/6] Running database migrations..."
php artisan migrate --force
# ============================================
# Laravel Optimizations
# ============================================
echo "[5/6] Optimizing Laravel..."
php artisan config:cache
php artisan route:cache
php artisan view:cache
# ============================================
# Stop temporary MySQL instance
# ============================================
echo "[6/6] Stopping temporary MySQL instance..."
mysqladmin -u root -p"${MYSQL_ROOT_PASSWORD}" shutdown
wait $MYSQL_PID
echo "=========================================="
echo "Initialization complete!"
echo "=========================================="
echo ""
echo "Database Credentials (save these!):"
echo " Database: ${DB_DATABASE}"
echo " Username: ${DB_USERNAME}"
echo " Password: ${DB_PASSWORD}"
echo " Root Password: ${MYSQL_ROOT_PASSWORD}"
echo ""
echo "Starting all services with supervisord..."
echo "=========================================="
# Execute the command passed to the container (supervisord)
exec "$@"