Nixpacks configration for deploying Laravel on Railway
This is the Nixpacks configration file that I use to deploy Laravel apps on Railway. Check out my more in depth guide here.
[phases.setup]nixPkgs = ["...", "python311Packages.supervisor"]
[phases.build]cmds = [ "mkdir -p /etc/supervisor/conf.d/", "cp /assets/worker-*.conf /etc/supervisor/conf.d/", "cp /assets/supervisord.conf /etc/supervisord.conf", "chmod +x /assets/start.sh", "..."]
[start]cmd = 'bash /assets/start.sh'
[staticAssets]"start.sh" = '''#!/bin/bash
# Transform the nginx configurationnode /assets/scripts/prestart.mjs /assets/nginx.template.conf /etc/nginx.conf
# Start supervisorsupervisord -c /assets/supervisord.conf -n'''
"supervisord.conf" = '''[unix_http_server]file=/assets/supervisor.sock
[supervisord]logfile=/var/log/supervisord.loglogfile_maxbytes=50MBlogfile_backups=10loglevel=infopidfile=/assets/supervisord.pidnodaemon=falsesilent=falseminfds=1024minprocs=200user=root
[rpcinterface:supervisor]supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]serverurl=unix:///assets/supervisor.sock
[include]files = /assets/worker-*.conf'''
"worker-nginx.conf" = '''[program:worker-nginx]process_name=%(program_name)s_%(process_num)02dcommand=nginx -c /etc/nginx.confautostart=trueautorestart=truestdout_logfile=/var/log/worker-nginx.logstderr_logfile=/var/log/worker-nginx.log'''
"worker-phpfpm.conf" = '''[program:worker-phpfpm]process_name=%(program_name)s_%(process_num)02dcommand=php-fpm -y /assets/php-fpm.conf -Fautostart=trueautorestart=truestdout_logfile=/var/log/worker-phpfpm.logstderr_logfile=/var/log/worker-phpfpm.log'''
"worker-laravel.conf" = '''[program:worker-laravel]process_name=%(program_name)s_%(process_num)02dcommand=bash -c 'exec php /app/artisan queue:work --sleep=3 --tries=3 --max-time=3600'autostart=trueautorestart=truestopasgroup=truekillasgroup=truenumprocs=2startsecs=0stopwaitsecs=3600stdout_logfile=/var/log/worker-laravel.logstderr_logfile=/var/log/worker-laravel.log'''
"worker-inertia-ssr.conf" = '''[program:inertia-ssr]process_name=%(program_name)s_%(process_num)02dcommand=bash -c 'exec php /app/artisan inertia:start-ssr'autostart=trueautorestart=truestderr_logfile=/var/log/worker-inertia-ssr.logstdout_logfile=/var/log/worker-inertia-ssr.log'''
"worker-nightwatch.conf" = '''[program:nightwatch]process_name=%(program_name)s_%(process_num)02dcommand=bash -c 'exec php /app/artisan nightwatch:agent'autostart=trueautorestart=truestdout_logfile=/var/log/worker-nightwatch.logstderr_logfile=/var/log/worker-nightwatch.log'''
"php-fpm.conf" = '''[www]listen = 127.0.0.1:9000user = www-datagroup = www-datalisten.owner = www-datalisten.group = www-datapm = dynamicpm.max_children = 20pm.min_spare_servers = 2pm.max_spare_servers = 8pm.start_servers = 4clear_env = nophp_admin_value[post_max_size] = 35Mphp_admin_value[upload_max_filesize] = 30M'''
"nginx.template.conf" = '''user www-data www-data;worker_processes 5;daemon off;
worker_rlimit_nofile 8192;
events { worker_connections 4096; # Default: 1024}
http { include $!{nginx}/conf/mime.types; index index.html index.htm index.php;
default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] $status ' '"$request" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx-access.log; error_log /var/log/nginx-error.log; sendfile on; tcp_nopush on; server_names_hash_bucket_size 128; # this seems to be required for some vhosts
server { listen ${PORT}; listen [::]:${PORT}; server_name localhost;
$if(NIXPACKS_PHP_ROOT_DIR) ( root ${NIXPACKS_PHP_ROOT_DIR}; ) else ( root /app; )
add_header X-Content-Type-Options "nosniff";
client_max_body_size 35M;
index index.php;
charset utf-8;
$if(NIXPACKS_PHP_FALLBACK_PATH) ( location / { try_files $uri $uri/ ${NIXPACKS_PHP_FALLBACK_PATH}?$query_string; } ) else ( location / { try_files $uri $uri/ /index.php?$query_string; } )
location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; }
$if(IS_LARAVEL) ( error_page 404 /index.php; ) else ()
location ~ \.php$ { fastcgi_buffer_size 8k; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include $!{nginx}/conf/fastcgi_params; include $!{nginx}/conf/fastcgi.conf; }
location ~ /\.(?!well-known).* { deny all; } }}'''