#!/bin/bash main() { local COMMAND_AS_STRING="$*" local ROLE="api" # Default role case "$COMMAND_AS_STRING" in *"artisan queue:work"*) ROLE="worker" ;; *"artisan schedule:work"*) ROLE="scheduler" ;; *) # Defaults to "api" for any other command (e.g., php-fpm) ROLE="api" ;; esac echo "Determined role: $ROLE for command: $COMMAND_AS_STRING" apply_php_configuration prep_file_permissions prep_storage wait_for_db if [ "$ROLE" = "api" ]; then echo "Running setup for API role..." apply_db_migrations run_init_project optimize_application echo "Starting server for API role with command: $@" exec "$@" elif [ "$ROLE" = "scheduler" ]; then echo "Running setup for Scheduler role..." echo "Initializing scheduler status for first run (entrypoint)" php ./artisan app:scheduler-status --mode=record echo "Starting scheduler with command: $@" exec "$@" elif [ "$ROLE" = "worker" ]; then echo "Running setup for Worker role..." echo "Starting worker with command: $@" exec "$@" else # This case should ideally not be reached if ROLE defaults to "api" echo "Error: Unknown role '$ROLE' determined from command '$COMMAND_AS_STRING'. Exiting." exit 1 fi } apply_php_configuration() { echo "Applying PHP configuration from environment variables" # Create custom PHP config file PHP_CUSTOM_CONFIG_FILE="/usr/local/etc/php/conf.d/99-custom.ini" # Apply memory limit if provided, otherwise default to 1G if [ -n "$PHP_MEMORY_LIMIT" ]; then echo "memory_limit = $PHP_MEMORY_LIMIT" >> $PHP_CUSTOM_CONFIG_FILE else echo "memory_limit = 1G" >> $PHP_CUSTOM_CONFIG_FILE fi # Apply max execution time if provided, otherwise default to 300s if [ -n "$PHP_MAX_EXECUTION_TIME" ]; then echo "max_execution_time = $PHP_MAX_EXECUTION_TIME" >> $PHP_CUSTOM_CONFIG_FILE else echo "max_execution_time = 300" >> $PHP_CUSTOM_CONFIG_FILE fi # Apply upload max filesize if provided, otherwise default to 50M if [ -n "$PHP_UPLOAD_MAX_FILESIZE" ]; then echo "upload_max_filesize = $PHP_UPLOAD_MAX_FILESIZE" >> $PHP_CUSTOM_CONFIG_FILE else echo "upload_max_filesize = 50M" >> $PHP_CUSTOM_CONFIG_FILE fi # Apply post max size if provided, otherwise default to 55M if [ -n "$PHP_POST_MAX_SIZE" ]; then echo "post_max_size = $PHP_POST_MAX_SIZE" >> $PHP_CUSTOM_CONFIG_FILE else echo "post_max_size = 55M" >> $PHP_CUSTOM_CONFIG_FILE fi # Log applied configuration echo "Applied PHP configuration:" cat $PHP_CUSTOM_CONFIG_FILE } prep_file_permissions() { chmod a+x ./artisan } prep_storage() { local app_storage_path="/usr/share/nginx/html/storage" # Create Laravel-specific directories directly in the mounted volume mkdir -p "$app_storage_path/app/public" mkdir -p "$app_storage_path/framework/cache/data" mkdir -p "$app_storage_path/framework/sessions" mkdir -p "$app_storage_path/framework/views" mkdir -p "$app_storage_path/logs" # Set permissions for the entire storage directory chown -R www-data:www-data "$app_storage_path" chmod -R 775 "$app_storage_path" touch /var/log/opnform.log chown www-data /var/log/opnform.log # Run Laravel's storage link command (ensure script is run from app root or adjust path to artisan) echo "Creating public storage symlink" php ./artisan storage:link } wait_for_db() { echo "Waiting for DB to be ready" until php ./artisan migrate:status 2>&1 | grep -q -E "(Migration table not found|Migration name)"; do sleep 1 done } apply_db_migrations() { echo "Running DB Migrations" php ./artisan migrate --force } run_init_project() { echo "Running app:init-project command" php ./artisan app:init-project } optimize_application() { echo "Clearing application cache" php ./artisan optimize:clear echo "Optimizing application" php ./artisan optimize } main "$@"