#!/bin/bash set -e cd /app echo "[boot] Starting pp-planer container boot..." # Ensure all required directories exist (volumes may be freshly mounted) mkdir -p \ storage/logs \ storage/framework/views \ storage/framework/cache/data \ storage/framework/sessions \ storage/app/public \ database \ public # Run first-time initialization (idempotent — safe to call every boot) /app/build/init-app.sh # Fix permissions: www-data must own all writable directories. # The || true prevents exit on macOS Docker Desktop (bind-mount ownership restrictions). # On a Linux host running as root, chown will succeed silently. chown -R www-data:www-data storage bootstrap/cache database 2>/dev/null || true chmod -R 775 storage bootstrap/cache database 2>/dev/null || true # Remove Vite dev server hot file if it leaked into the bind-mounted public/ # (causes Laravel to try localhost:5173 instead of reading the manifest) rm -f /app/public/hot # Sync built Vite assets from the image (public-build/) into the # bind-mounted public/ directory. This ensures Caddy always serves # up-to-date assets even though public/ is a host bind-mount. if [ -d /app/public-build ]; then echo "[boot] Syncing built assets to public/..." cp -r /app/public-build/. /app/public/ chown -R www-data:www-data /app/public 2>/dev/null || true fi # Create the storage symlink after volumes are mounted # (public/storage → storage/app/public) echo "[boot] Creating storage symlink..." php artisan storage:link --force 2>/dev/null || true # Run database migrations echo "[boot] Running migrations..." php artisan migrate --force # Warm up Laravel caches echo "[boot] Warming caches..." php artisan config:cache php artisan route:cache php artisan view:cache php artisan event:cache echo "[boot] Boot complete. Starting supervisord..." # Hand off to CMD (supervisord) exec "$@"