Deploy Laravel Applications
Prerequisites
- Laravel application in a Git repository
- HCS account with Applications access
- Domain name (optional)
Deployment Steps
-
Login to HCS Dashboard
- Navigate to the dashboard
- Sign in with your credentials
-
Create New Application
- Click “Create New Application”
- Select “Laravel” as your application type
- Connect your Git repository
-
Configure Build Settings
- Set Build Pack to
nixpacks
- Add required environment variables
- Configure nixpacks.toml
- Set Build Pack to
-
Deploy Your Application
- Click “Deploy” to start the build process
- Wait for build and deployment to complete
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling.
Example repository here.
Requirements
- Set
Build Pack
tonixpacks
- Set the required environment variables
- Add
nixpacks.toml
with the following configuration - Set
Ports Exposes
to80
Environment Variables
If your application needs a database or Redis, you can simply create them beforehand in the Coolify dashboard.
You will receive the connection strings which you can use in your application and set them as environment variables:
DB_CONNECTION=mysqlDB_HOST=<DB_HOST>DB_PORT=3306DB_DATABASE=laravelDB_USERNAME=rootDB_PASSWORD=
REDIS_HOST=<REDIS_HOST>REDIS_PASSWORD=nullREDIS_PORT=6379
All-in-one container
If you would like to start queue worker, scheduler, etc within one container (recommended), then you can place a nixpacks.toml
inside your repository with the following value.
[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 = '/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 /etc/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=200
[rpcinterface:supervisor]supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]serverurl=unix:///assets/supervisor.sock
[include]files = /etc/supervisor/conf.d/*.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=12startsecs=0stopwaitsecs=3600stdout_logfile=/var/log/worker-laravel.logstderr_logfile=/var/log/worker-laravel.log'''
"php-fpm.conf" = '''[www]listen = 127.0.0.1:9000user = www-datagroup = www-datalisten.owner = www-datalisten.group = www-datapm = dynamicpm.max_children = 50pm.min_spare_servers = 4pm.max_spare_servers = 32pm.start_servers = 18clear_env = no'''
"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(IS_LARAVEL) ( location / { try_files $uri $uri/ /index.php?$query_string; } ) else ()
$if(NIXPACKS_PHP_FALLBACK_PATH) ( location / { try_files $uri $uri/ ${NIXPACKS_PHP_FALLBACK_PATH}?$query_string; } ) else ()
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_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;
fastcgi_param PHP_VALUE "upload_max_filesize=30M \n post_max_size=35M"; }
location ~ /\.(?!well-known).* { deny all; } }}'''
### With Inertia.js
When using Laravel with [Inertia.js](https://inertiajs.com/), you may need to specify some additional configuration in your `nixpacks.toml` file.
#### Increasing the NGINX buffer size for Inertia requests
Because of a [known issue](https://github.com/inertiajs/inertia-laravel/issues/529) with Inertia.js and default NGINX configuration, you may need to increase the buffer size for NGINX to handle Inertia requests.
```diff toml"nginx.template.conf" = '''# ...http { # ... server { # ... location ~ \.php$ {+ fastcgi_buffer_size 8k; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include $!{nginx}/conf/fastcgi_params; include $!{nginx}/conf/fastcgi.conf;
# ... } }}
Inertia SSR
If you are using Inertia.js with server-side rendering, you should add another worker in your nixpacks.toml
file to automatically start your SSR server.
"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'''