From 4baf45f4fbe611f46b1444aa6ac434a7be77fb48 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 13 Sep 2024 08:31:02 +0200 Subject: [PATCH] chore: Update Laravel application configuration for all-in-one container setup --- .../knowledge-base/applications/laravel.mdx | 194 +++++++++++++++++- 1 file changed, 192 insertions(+), 2 deletions(-) diff --git a/src/content/docs/knowledge-base/applications/laravel.mdx b/src/content/docs/knowledge-base/applications/laravel.mdx index 3252b01..fdf1d28 100644 --- a/src/content/docs/knowledge-base/applications/laravel.mdx +++ b/src/content/docs/knowledge-base/applications/laravel.mdx @@ -17,7 +17,8 @@ Example repository [here](https://github.com/coollabsio/coolify-examples/tree/ma ## Requirements - Set `Build Pack` to `nixpacks` -- Set `APP_KEY` +- Set the required [environment variables](#environment-variables) +- Add `nixpacks.toml` with the following [configuration](#all-in-one-container) - Set `Ports Exposes` to `80` -### Other components + +### Environment Variables If your application needs a database or Redis, you can simply create them beforehand in the Coolify dashboard. @@ -44,3 +46,191 @@ REDIS_HOST= REDIS_PASSWORD=null REDIS_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. + + +```toml +[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 configuration +node /assets/scripts/prestart.mjs /assets/nginx.template.conf /etc/nginx.conf + +# Start supervisor +supervisord -c /etc/supervisord.conf -n +''' + +"supervisord.conf" = ''' +[unix_http_server] +file=/assets/supervisor.sock + +[supervisord] +logfile=/var/log/supervisord.log +logfile_maxbytes=50MB +logfile_backups=10 +loglevel=info +pidfile=/assets/supervisord.pid +nodaemon=false +silent=false +minfds=1024 +minprocs=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)02d +command=nginx -c /etc/nginx.conf +autostart=true +autorestart=true +stdout_logfile=/var/log/worker-nginx.log +stderr_logfile=/var/log/worker-nginx.log +''' + +"worker-phpfpm.conf" = ''' +[program:worker-phpfpm] +process_name=%(program_name)s_%(process_num)02d +command=php-fpm -y /assets/php-fpm.conf -F +autostart=true +autorestart=true +stdout_logfile=/var/log/worker-phpfpm.log +stderr_logfile=/var/log/worker-phpfpm.log +''' + +"worker-laravel.conf" = ''' +[program:worker-laravel] +process_name=%(program_name)s_%(process_num)02d +command=bash -c 'exec php /app/artisan queue:work --sleep=3 --tries=3 --max-time=3600' +autostart=true +autorestart=true +stopasgroup=true +killasgroup=true +numprocs=12 +startsecs=0 +stopwaitsecs=3600 +stdout_logfile=/var/log/worker-laravel.log +stderr_logfile=/var/log/worker-laravel.log +''' + +"php-fpm.conf" = ''' +[www] +listen = 127.0.0.1:9000 +user = www-data +group = www-data +listen.owner = www-data +listen.group = www-data +pm = dynamic +pm.max_children = 50 +pm.min_spare_servers = 4 +pm.max_spare_servers = 32 +pm.start_servers = 18 +clear_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; + } + } +} +''' +``` \ No newline at end of file