[{"data":1,"prerenderedAt":548},["ShallowReactive",2],{"navigation":3,"/docs/framework-guides/laravel/horizon":229,"/docs/framework-guides/laravel/horizon-surround":543},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","/docs","docs",[9,12,56,85,132,153,186,203,216],{"title":10,"path":6,"stem":11},"","docs/index",{"title":13,"path":14,"stem":15,"children":16,"icon":55},"Getting Started","/docs/getting-started","docs/1.getting-started/1.index",[17,19,23,27,31,35,39,43,47,51],{"title":18,"path":14,"stem":15},"Introduction",{"title":20,"path":21,"stem":22},"Container Basics","/docs/getting-started/container-basics","docs/1.getting-started/2.container-basics",{"title":24,"path":25,"stem":26},"Installation","/docs/getting-started/installation","docs/1.getting-started/3.installation",{"title":28,"path":29,"stem":30},"These Images vs Others","/docs/getting-started/these-images-vs-others","docs/1.getting-started/4.these-images-vs-others",{"title":32,"path":33,"stem":34},"Choosing an Image","/docs/getting-started/choosing-an-image","docs/1.getting-started/5.choosing-an-image",{"title":36,"path":37,"stem":38},"Default Configurations","/docs/getting-started/default-configurations","docs/1.getting-started/6.default-configurations",{"title":40,"path":41,"stem":42},"Upgrade Guide","/docs/getting-started/upgrade-guide","docs/1.getting-started/7.upgrade-guide",{"title":44,"path":45,"stem":46},"Changelog","/docs/getting-started/changelog","docs/1.getting-started/8.changelog",{"title":48,"path":49,"stem":50},"About","/docs/getting-started/about","docs/1.getting-started/9.about",{"title":52,"path":53,"stem":54},"Contributing","/docs/getting-started/contributing","docs/1.getting-started/99.contributing",false,{"title":57,"path":58,"stem":59,"children":60,"page":55},"Image Variations","/docs/image-variations","docs/2.image-variations",[61,65,69,73,77,81],{"title":62,"path":63,"stem":64},"CLI","/docs/image-variations/cli","docs/2.image-variations/cli",{"title":66,"path":67,"stem":68},"FPM","/docs/image-variations/fpm","docs/2.image-variations/fpm",{"title":70,"path":71,"stem":72},"FPM-Apache","/docs/image-variations/fpm-apache","docs/2.image-variations/fpm-apache",{"title":74,"path":75,"stem":76},"FPM-NGINX","/docs/image-variations/fpm-nginx","docs/2.image-variations/fpm-nginx",{"title":78,"path":79,"stem":80},"FrankenPHP","/docs/image-variations/frankenphp","docs/2.image-variations/frankenphp",{"title":82,"path":83,"stem":84},"Unit (Deprecated)","/docs/image-variations/unit","docs/2.image-variations/unit",{"title":86,"path":87,"stem":88,"children":89,"page":55},"Framework Guides","/docs/framework-guides","docs/3.framework-guides",[90,123],{"title":91,"icon":55,"defaultOpen":55,"path":92,"stem":93,"children":94,"page":55},"Laravel","/docs/framework-guides/laravel","docs/3.framework-guides/1.laravel",[95,99,103,107,111,115,119],{"title":96,"path":97,"stem":98},"Automations","/docs/framework-guides/laravel/automations","docs/3.framework-guides/1.laravel/1.automations",{"title":100,"path":101,"stem":102},"Task Scheduler","/docs/framework-guides/laravel/task-scheduler","docs/3.framework-guides/1.laravel/2.task-scheduler",{"title":104,"path":105,"stem":106},"Queue","/docs/framework-guides/laravel/queue","docs/3.framework-guides/1.laravel/3.queue",{"title":108,"path":109,"stem":110},"Horizon","/docs/framework-guides/laravel/horizon","docs/3.framework-guides/1.laravel/4.horizon",{"title":112,"path":113,"stem":114},"Reverb","/docs/framework-guides/laravel/reverb","docs/3.framework-guides/1.laravel/4.reverb",{"title":116,"path":117,"stem":118},"Nightwatch","/docs/framework-guides/laravel/nightwatch","docs/3.framework-guides/1.laravel/5.nightwatch",{"title":120,"path":121,"stem":122},"Octane","/docs/framework-guides/laravel/octane","docs/3.framework-guides/1.laravel/octane",{"title":124,"icon":55,"defaultOpen":55,"path":125,"stem":126,"children":127,"page":55},"WordPress","/docs/framework-guides/wordpress","docs/3.framework-guides/2.wordpress",[128],{"title":129,"path":130,"stem":131},"Using Docker with WordPress","/docs/framework-guides/wordpress/using-wordpress-with-docker","docs/3.framework-guides/2.wordpress/4.using-wordpress-with-docker",{"title":133,"path":134,"stem":135,"children":136,"page":55},"Deployment And Production","/docs/deployment-and-production","docs/4.deployment-and-production",[137,141,145,149],{"title":138,"path":139,"stem":140},"Development to Production","/docs/deployment-and-production/development-to-production","docs/4.deployment-and-production/2.development-to-production",{"title":142,"path":143,"stem":144},"Packaging Your App for Deployment","/docs/deployment-and-production/packaging-your-app-for-deployment","docs/4.deployment-and-production/3.packaging-your-app-for-deployment",{"title":146,"path":147,"stem":148},"Configuring SSL","/docs/deployment-and-production/configuring-ssl","docs/4.deployment-and-production/4.configuring-ssl",{"title":150,"path":151,"stem":152},"Choosing a Host","/docs/deployment-and-production/choosing-a-host","docs/4.deployment-and-production/5.choosing-a-host",{"title":154,"icon":55,"defaultOpen":55,"path":155,"stem":156,"children":157,"page":55},"Advanced Guides","/docs/guide","docs/5.guide",[158,162,166,170,174,178,182],{"title":159,"path":160,"stem":161},"Migrating from official PHP images","/docs/guide/migrating-from-official-php-images","docs/5.guide/1.migrating-from-official-php-images",{"title":163,"path":164,"stem":165},"Using Healthchecks With Laravel","/docs/guide/using-healthchecks-with-laravel","docs/5.guide/2.using-healthchecks-with-laravel",{"title":167,"path":168,"stem":169},"Using S6 Overlay","/docs/guide/using-s6-overlay","docs/5.guide/2.using-s6-overlay",{"title":171,"path":172,"stem":173},"Understanding File Permissions","/docs/guide/understanding-file-permissions","docs/5.guide/3.understanding-file-permissions",{"title":175,"path":176,"stem":177},"Configuring Trusted Proxies","/docs/guide/configuring-trusted-proxies","docs/5.guide/4.configuring-trusted-proxies",{"title":179,"path":180,"stem":181},"Major version migrations","/docs/guide/major-version-migrations","docs/5.guide/5.major-version-migrations",{"title":183,"path":184,"stem":185},"Production performance tuning","/docs/guide/production-performance-tuning","docs/5.guide/6.production-performance-tuning",{"title":187,"icon":55,"defaultOpen":55,"path":188,"stem":189,"children":190,"page":55},"Customization","/docs/customizing-the-image","docs/6.customizing-the-image",[191,195,199],{"title":192,"path":193,"stem":194},"Changing php.ini settings","/docs/customizing-the-image/changing-common-php-settings","docs/6.customizing-the-image/1.changing-common-php-settings",{"title":196,"path":197,"stem":198},"Installing PHP extensions","/docs/customizing-the-image/installing-additional-php-extensions","docs/6.customizing-the-image/2.installing-additional-php-extensions",{"title":200,"path":201,"stem":202},"Adding Start Up Scripts","/docs/customizing-the-image/adding-your-own-start-up-scripts","docs/6.customizing-the-image/3.adding-your-own-start-up-scripts",{"title":204,"path":205,"stem":206,"children":207,"page":55},"Troubleshooting","/docs/troubleshooting","docs/7.troubleshooting",[208,212],{"title":209,"path":210,"stem":211},"Common Issues","/docs/troubleshooting/common-issues","docs/7.troubleshooting/1.common-issues",{"title":213,"path":214,"stem":215},"Getting Help","/docs/troubleshooting/getting-help","docs/7.troubleshooting/2.getting-help",{"title":217,"path":218,"stem":219,"children":220,"page":55},"Reference","/docs/reference","docs/8.reference",[221,225],{"title":222,"path":223,"stem":224},"Environment Variable Specification","/docs/reference/environment-variable-specification","docs/8.reference/1.environment-variable-specification",{"title":226,"path":227,"stem":228},"Command Reference","/docs/reference/command-reference","docs/8.reference/2.command-reference",{"id":230,"title":108,"body":231,"description":535,"extension":536,"links":537,"meta":538,"navigation":358,"path":109,"redirect":537,"seo":541,"stem":110,"__hash__":542},"docs/docs/3.framework-guides/1.laravel/4.horizon.md",{"type":232,"value":233,"toc":530},"minimark",[234,239,243,247,262,270,276,310,484,488,502,526],[235,236,238],"h2",{"id":237},"laravel-horizon-with-docker","Laravel Horizon with Docker",[240,241,242],"p",{},"Run Laravel Horizon by passing the Artisan command as the container's command. Horizon provides a dashboard and monitoring for your Redis queues.",[235,244,246],{"id":245},"docker-compose-example","Docker Compose example",[248,249,252],"tip",{"target":250,"to":251},"_blank","https://getspin.pro/docs/services/laravel-scheduler",[240,253,254,255,261],{},"Want to skip the setup? ",[256,257,260],"a",{"href":251,"rel":258,"target":250},[259],"nofollow","Spin Pro"," handles Laravel Horizon on your VPS with Docker and zero-downtime deployments—all configured for you.",[240,263,264,265,269],{},"This example runs a dedicated Horizon container using the same image as your web service. Horizon requires Redis to be running and properly configured in your ",[266,267,268],"code",{},".env"," file.",[240,271,272],{},[273,274,275],"strong",{},"Key points:",[277,278,279,283,286,292,307],"ul",{},[280,281,282],"li",{},"Use the same image for both your web and Horizon services",[280,284,285],{},"Ensure Redis is running before starting Horizon",[280,287,288,289,291],{},"Configure Redis connection details in your ",[266,290,268],{}," file",[280,293,294,295,298,299,302,303,306],{},"Set ",[266,296,297],{},"SIGTERM"," as the stop signal for graceful shutdown (especially for ",[266,300,301],{},"fpm-apache"," and ",[266,304,305],{},"fpm-nginx",")",[280,308,309],{},"Include a health check to monitor Horizon status",[311,312,317],"pre",{"className":313,"code":314,"filename":315,"language":316,"meta":10,"style":10},"language-yml shiki shiki-themes github-dark","services:\n  php:\n    image: my/laravel-app\n\n  redis:\n    image: redis:6\n    command: \"redis-server --appendonly yes --requirepass redispassword\"\n\n  horizon:\n    image: my/laravel-app\n    command: [\"php\", \"/var/www/html/artisan\", \"horizon\"]\n    stop_signal: SIGTERM\n    healthcheck:\n      test: [\"CMD\", \"healthcheck-horizon\"]\n      start_period: 10s\n","compose.yml","yml",[266,318,319,332,340,353,360,368,378,389,394,402,411,436,447,455,473],{"__ignoreMap":10},[320,321,324,328],"span",{"class":322,"line":323},"line",1,[320,325,327],{"class":326},"s4JwU","services",[320,329,331],{"class":330},"s95oV",":\n",[320,333,335,338],{"class":322,"line":334},2,[320,336,337],{"class":326},"  php",[320,339,331],{"class":330},[320,341,343,346,349],{"class":322,"line":342},3,[320,344,345],{"class":326},"    image",[320,347,348],{"class":330},": ",[320,350,352],{"class":351},"sU2Wk","my/laravel-app\n",[320,354,356],{"class":322,"line":355},4,[320,357,359],{"emptyLinePlaceholder":358},true,"\n",[320,361,363,366],{"class":322,"line":362},5,[320,364,365],{"class":326},"  redis",[320,367,331],{"class":330},[320,369,371,373,375],{"class":322,"line":370},6,[320,372,345],{"class":326},[320,374,348],{"class":330},[320,376,377],{"class":351},"redis:6\n",[320,379,381,384,386],{"class":322,"line":380},7,[320,382,383],{"class":326},"    command",[320,385,348],{"class":330},[320,387,388],{"class":351},"\"redis-server --appendonly yes --requirepass redispassword\"\n",[320,390,392],{"class":322,"line":391},8,[320,393,359],{"emptyLinePlaceholder":358},[320,395,397,400],{"class":322,"line":396},9,[320,398,399],{"class":326},"  horizon",[320,401,331],{"class":330},[320,403,405,407,409],{"class":322,"line":404},10,[320,406,345],{"class":326},[320,408,348],{"class":330},[320,410,352],{"class":351},[320,412,414,416,419,422,425,428,430,433],{"class":322,"line":413},11,[320,415,383],{"class":326},[320,417,418],{"class":330},": [",[320,420,421],{"class":351},"\"php\"",[320,423,424],{"class":330},", ",[320,426,427],{"class":351},"\"/var/www/html/artisan\"",[320,429,424],{"class":330},[320,431,432],{"class":351},"\"horizon\"",[320,434,435],{"class":330},"]\n",[320,437,439,442,444],{"class":322,"line":438},12,[320,440,441],{"class":326},"    stop_signal",[320,443,348],{"class":330},[320,445,446],{"class":351},"SIGTERM\n",[320,448,450,453],{"class":322,"line":449},13,[320,451,452],{"class":326},"    healthcheck",[320,454,331],{"class":330},[320,456,458,461,463,466,468,471],{"class":322,"line":457},14,[320,459,460],{"class":326},"      test",[320,462,418],{"class":330},[320,464,465],{"class":351},"\"CMD\"",[320,467,424],{"class":330},[320,469,470],{"class":351},"\"healthcheck-horizon\"",[320,472,435],{"class":330},[320,474,476,479,481],{"class":322,"line":475},15,[320,477,478],{"class":326},"      start_period",[320,480,348],{"class":330},[320,482,483],{"class":351},"10s\n",[235,485,487],{"id":486},"advanced-configuration","Advanced configuration",[240,489,490,493,494,496,497,302,499,501],{},[273,491,492],{},"Graceful shutdown:"," The ",[266,495,297],{}," signal ensures Horizon finishes processing current jobs before stopping. This is especially important for ",[266,498,301],{},[266,500,305],{}," images.",[248,503,504],{},[240,505,506,509,510,512,513,515,516,521,522,525],{},[273,507,508],{},"Multiple processes in one container:"," If you're running ",[266,511,305],{}," or ",[266,514,301],{}," and you'd like to have everything in a single container, you can ",[256,517,520],{"href":518,"rel":519,"target":250},"https://github.com/just-containers/s6-overlay/tree/master#writing-a-service-script",[259],"write your own S6 Overlay service script"," to properly manage multiple processes in a single container. Learn more about about this in our ",[256,523,524],{"href":168},"Using S6 Overlay guide",".",[527,528,529],"style",{},"html pre.shiki code .s4JwU, html code.shiki .s4JwU{--shiki-default:#85E89D}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":10,"searchDepth":334,"depth":334,"links":531},[532,533,534],{"id":237,"depth":334,"text":238},{"id":245,"depth":334,"text":246},{"id":486,"depth":334,"text":487},"Learn how to configure Laravel Horizon with Docker.","md",null,{"head":539,"layout":7},{"title":540},"Laravel Horizon with Docker - Docker PHP - Server Side Up",{"title":108,"description":535},"ZaLYvANle5WM5WenO__m5JyLyDy6EdqL53cdGsgDSmI",[544,546],{"title":104,"path":105,"stem":106,"description":545,"children":-1},"Learn how to configure a Laravel Queue with Docker.",{"title":112,"path":113,"stem":114,"description":547,"children":-1},"Learn how to configure Laravel Reverb with Docker.",1789148877054]