154 lines
4.8 KiB
Bash
154 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 "$@"
|