opnform-host-nginx/docker/php-fpm-entrypoint

141 lines
4.2 KiB
Bash

#!/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 "$@"