# Production Dockerfile - uses pre-built base image FROM forge.lvl0.xyz/lvl0/fedi-feed-router-base:latest # Set working directory WORKDIR /app # Set fixed production environment variables ENV APP_ENV=production \ APP_DEBUG=false \ DB_CONNECTION=mysql \ DB_HOST=db \ DB_PORT=3306 \ SESSION_DRIVER=redis \ CACHE_STORE=redis \ QUEUE_CONNECTION=redis \ LOG_CHANNEL=stack \ LOG_LEVEL=error # Copy application code first COPY . . # Install PHP dependencies (production only) RUN composer install --no-dev --no-interaction --optimize-autoloader # Install ALL Node dependencies (including dev for building) RUN npm install # Build frontend assets RUN npm run build # Remove node_modules after build to save space RUN rm -rf node_modules # Publish Livewire assets RUN php artisan livewire:publish --assets # Laravel optimizations (skip route cache - Livewire registers routes dynamically) RUN php artisan config:cache \ && php artisan view:cache \ && composer dump-autoload --optimize # Set permissions RUN chown -R www-data:www-data /app/storage /app/bootstrap/cache # Configure Caddy RUN cat > /etc/caddy/Caddyfile < /start-prod.sh <<'EOF' #!/bin/sh set -e # Wait for database to be ready echo "Waiting for database..." for i in $(seq 1 30); do if mysqladmin ping -h "$DB_HOST" -u "$DB_USERNAME" -p"$DB_PASSWORD" --silent 2>/dev/null; then echo "Database is ready!" break fi echo "Waiting for database... ($i/30)" sleep 2 done # Run migrations echo "Running migrations..." php artisan migrate --force || echo "Migrations failed or already up-to-date" # Start Horizon in the background php artisan horizon & # Start FrankenPHP exec frankenphp run --config /etc/caddy/Caddyfile EOF RUN chmod +x /start-prod.sh # Start with our script CMD ["/start-prod.sh"]