#!/bin/bash # Don't use 'set -e' globally - we'll handle errors explicitly for critical operations # This allows non-critical operations (like permission changes) to fail without crashing the container echo "==========================================" echo "🚀 Container Entrypoint Starting" echo "==========================================" echo "Command: $@" echo "Working directory: $(pwd)" echo "User: $(whoami)" echo "" echo "🔐 Loading secrets..." # Function to load secret from file if *_FILE env var is set # This is a fallback for environments where Docker Secrets are not configured # The Framework's DockerSecretsResolver handles *_FILE pattern automatically load_secret_fallback() { local var_name="$1" local file_var="${var_name}_FILE" # Only load manually if *_FILE is set but Framework hasn't loaded it yet # (This is mainly for backward compatibility during migration) if [ -n "${!file_var}" ] && [ -f "${!file_var}" ] && [ -z "${!var_name}" ]; then export "$var_name"="$(cat "${!file_var}")" echo "✅ Loaded $var_name from ${!file_var} (fallback)" fi } # Load secrets as fallback (Framework handles *_FILE pattern automatically via DockerSecretsResolver) # This is mainly for backward compatibility during migration load_secret_fallback "DB_PASSWORD" load_secret_fallback "REDIS_PASSWORD" load_secret_fallback "APP_KEY" load_secret_fallback "VAULT_ENCRYPTION_KEY" load_secret_fallback "SHOPIFY_WEBHOOK_SECRET" load_secret_fallback "RAPIDMAIL_PASSWORD" load_secret_fallback "GIT_TOKEN" echo "✅ Secrets loading completed (Framework handles *_FILE pattern automatically)" # Git Clone/Pull functionality if [ -n "$GIT_REPOSITORY_URL" ]; then echo "" echo "đŸ“Ĩ Cloning/Pulling code from Git repository..." GIT_BRANCH="${GIT_BRANCH:-main}" GIT_TARGET_DIR="/var/www/html" # Setup Git credentials if provided if [ -n "$GIT_TOKEN" ]; then # Use token for HTTPS authentication GIT_URL_WITH_AUTH=$(echo "$GIT_REPOSITORY_URL" | sed "s|https://|https://${GIT_TOKEN}@|") elif [ -n "$GIT_USERNAME" ] && [ -n "$GIT_PASSWORD" ]; then GIT_URL_WITH_AUTH=$(echo "$GIT_REPOSITORY_URL" | sed "s|https://|https://${GIT_USERNAME}:${GIT_PASSWORD}@|") else GIT_URL_WITH_AUTH="$GIT_REPOSITORY_URL" fi # Clone or pull repository if [ ! -d "$GIT_TARGET_DIR/.git" ]; then echo "đŸ“Ĩ Cloning repository from $GIT_REPOSITORY_URL (branch: $GIT_BRANCH)..." # Remove existing files if they exist (from image build) # But preserve storage directory if it's a volume mount if [ "$(ls -A $GIT_TARGET_DIR 2>/dev/null)" ]; then echo "đŸ—‘ī¸ Cleaning existing files (preserving storage)..." find "$GIT_TARGET_DIR" -mindepth 1 -maxdepth 1 ! -name "storage" -exec rm -rf {} \; 2>/dev/null || true fi # Clone into temporary directory first, then move contents (preserving storage) TEMP_CLONE="${GIT_TARGET_DIR}.tmp" rm -rf "$TEMP_CLONE" 2>/dev/null || true if git clone --branch "$GIT_BRANCH" --depth 1 "$GIT_URL_WITH_AUTH" "$TEMP_CLONE"; then # Remove only files/dirs that are not storage (which might be a volume mount) find "$GIT_TARGET_DIR" -mindepth 1 -maxdepth 1 ! -name "storage" -exec rm -rf {} \; 2>/dev/null || true # Move contents from temp directory to target (preserving storage) find "$TEMP_CLONE" -mindepth 1 -maxdepth 1 ! -name "." ! -name ".." -exec mv {} "$GIT_TARGET_DIR/" \; 2>/dev/null || true rm -rf "$TEMP_CLONE" 2>/dev/null || true echo "✅ Repository cloned successfully" else echo "❌ Git clone failed. Falling back to image contents." rm -rf "$TEMP_CLONE" 2>/dev/null || true fi else echo "🔄 Pulling latest changes from $GIT_BRANCH..." cd "$GIT_TARGET_DIR" # Fetch and reset to latest git fetch origin "$GIT_BRANCH" || { echo "âš ī¸ Git fetch failed. Using existing code." } git reset --hard "origin/$GIT_BRANCH" || { echo "âš ī¸ Git reset failed. Using existing code." } git clean -fd || true fi # Install/update dependencies if composer.json exists if [ -f "$GIT_TARGET_DIR/composer.json" ]; then echo "đŸ“Ļ Installing/updating Composer dependencies..." cd "$GIT_TARGET_DIR" composer install --no-dev --optimize-autoloader --no-interaction --no-scripts || { echo "âš ī¸ Composer install failed. Continuing..." } # Run composer scripts if needed composer dump-autoload --optimize --classmap-authoritative || true fi echo "✅ Git sync completed" else echo "" echo "â„šī¸ GIT_REPOSITORY_URL not set, using code from image" fi echo "" echo "📊 Environment variables:" env | grep -E "DB_|APP_" | grep -Ev "(PASSWORD|KEY|SECRET)" || true echo "" echo "📂 Checking application directory structure..." if [ -d "/var/www/html" ]; then echo "✅ /var/www/html exists" echo " Contents: $(ls -la /var/www/html 2>/dev/null | head -5 | wc -l) items" if [ -f "/var/www/html/composer.json" ]; then echo "✅ composer.json found" else echo "âš ī¸ Warning: composer.json not found in /var/www/html" fi if [ -f "/var/www/html/public/index.php" ] || [ -f "/var/www/html/index.php" ]; then echo "✅ Application entry point found" else echo "âš ī¸ Warning: Application entry point (index.php) not found" fi else echo "❌ ERROR: /var/www/html does not exist!" exit 1 fi echo "" echo "đŸ› ī¸ Adjusting filesystem permissions..." # Non-critical operations - don't fail if these don't work if ! chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache 2>/dev/null; then echo "âš ī¸ Warning: Failed to change ownership of storage/cache directories (may be volume mounts)" fi if ! find /var/www/html/storage /var/www/html/bootstrap/cache -type d -exec chmod 775 {} \; 2>/dev/null; then echo "âš ī¸ Warning: Failed to set directory permissions" fi if ! find /var/www/html/storage /var/www/html/bootstrap/cache -type f -exec chmod 664 {} \; 2>/dev/null; then echo "âš ī¸ Warning: Failed to set file permissions" fi # Verify required directories exist echo "" echo "📁 Verifying required directories..." REQUIRED_DIRS=( "/var/www/html" "/var/www/html/storage" "/var/www/html/bootstrap" "/var/www/html/bootstrap/cache" ) for dir in "${REQUIRED_DIRS[@]}"; do if [ ! -d "$dir" ]; then echo "âš ī¸ Warning: Required directory $dir does not exist, creating..." mkdir -p "$dir" 2>/dev/null || echo "❌ Failed to create $dir" fi done # Start PHP-FPM in background (inherits all environment variables) echo "" echo "🚀 Starting PHP-FPM..." # Check if PHP-FPM binary exists if ! command -v php-fpm &> /dev/null; then echo "❌ ERROR: php-fpm command not found!" exit 1 fi # Start PHP-FPM and capture its PID php-fpm & PHP_FPM_PID=$! # Wait for PHP-FPM to be ready and verify it's running echo "âŗ Waiting for PHP-FPM to start..." MAX_WAIT=10 WAIT_COUNT=0 while [ $WAIT_COUNT -lt $MAX_WAIT ]; do if kill -0 $PHP_FPM_PID 2>/dev/null; then # Check if PHP-FPM is listening on the socket if [ -S /var/run/php/php-fpm.sock ] || [ -S /run/php/php-fpm.sock ] || netstat -tuln 2>/dev/null | grep -q ":9000"; then echo "✅ PHP-FPM is running (PID: $PHP_FPM_PID)" break fi else echo "❌ ERROR: PHP-FPM process died immediately after startup!" exit 1 fi sleep 1 WAIT_COUNT=$((WAIT_COUNT + 1)) done if [ $WAIT_COUNT -ge $MAX_WAIT ]; then echo "âš ī¸ Warning: PHP-FPM may not be fully ready after ${MAX_WAIT}s, but continuing..." echo " This may indicate a configuration issue. Check PHP-FPM logs if problems occur." fi # Log PHP-FPM status echo "" echo "📋 PHP-FPM Status:" if kill -0 $PHP_FPM_PID 2>/dev/null; then echo " Process: Running (PID: $PHP_FPM_PID)" if [ -S /var/run/php/php-fpm.sock ]; then echo " Socket: /var/run/php/php-fpm.sock (exists)" elif [ -S /run/php/php-fpm.sock ]; then echo " Socket: /run/php/php-fpm.sock (exists)" elif netstat -tuln 2>/dev/null | grep -q ":9000"; then echo " Socket: TCP port 9000 (listening)" else echo " Socket: Not found (may be using different configuration)" fi else echo " Process: Not running (PID check failed)" fi # Verify nginx binary exists if ! command -v nginx &> /dev/null; then echo "❌ ERROR: nginx command not found!" exit 1 fi # Test nginx configuration before starting echo "" echo "🔍 Testing nginx configuration..." if ! nginx -t 2>&1; then echo "❌ ERROR: nginx configuration test failed!" exit 1 fi # Start nginx in foreground (inherits all environment variables) echo "" echo "🚀 Starting nginx..." echo "==========================================" echo "✅ All startup checks passed" echo "🚀 Services starting..." echo "==========================================" exec nginx -g 'daemon off;'