[{"data":1,"prerenderedAt":733},["ShallowReactive",2],{"navigation":3,"/docs/framework-guides/laravel/reverb":229,"/docs/framework-guides/laravel/reverb-surround":728},[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":112,"body":231,"description":720,"extension":721,"links":722,"meta":723,"navigation":420,"path":113,"redirect":722,"seo":726,"stem":114,"__hash__":727},"docs/docs/3.framework-guides/1.laravel/4.reverb.md",{"type":232,"value":233,"toc":714},"minimark",[234,239,243,258,270,274,277,283,315,572,576,598,601,682,686,710],[235,236,238],"h2",{"id":237},"laravel-reverb-with-docker","Laravel Reverb with Docker",[240,241,242],"p",{},"Run Laravel Reverb by passing the Artisan command as the container's command. Reverb is Laravel's WebSocket server for real-time communication.",[244,245,248],"tip",{"target":246,"to":247},"_blank","https://getspin.pro/docs/services/laravel-scheduler",[240,249,250,251,257],{},"Want to skip the setup? ",[252,253,256],"a",{"href":247,"rel":254,"target":246},[255],"nofollow","Spin Pro"," handles Laravel Reverb on your VPS with Docker and zero-downtime deployments—all configured for you.",[259,260,261],"note",{},[240,262,263,264,269],{},"Before using Reverb with Docker, follow the ",[252,265,268],{"href":266,"rel":267},"https://laravel.com/docs/12.x/reverb",[255],"Laravel Reverb setup instructions"," to install and configure the Reverb package in your Laravel application.",[235,271,273],{"id":272},"docker-compose-example","Docker Compose example",[240,275,276],{},"This example runs Reverb as a separate container using the same image as your web service. Reverb requires a reverse proxy (like Traefik) to route WebSocket traffic correctly.",[240,278,279],{},[280,281,282],"strong",{},"Key points:",[284,285,286,290,293,309,312],"ul",{},[287,288,289],"li",{},"Use the same image for both your web and Reverb services",[287,291,292],{},"Reverb runs on a different port than your web server (8000 vs 8080)",[287,294,295,296,300,301,304,305,308],{},"Set ",[297,298,299],"code",{},"SIGTERM"," as the stop signal for graceful shutdown (especially for ",[297,302,303],{},"fpm-apache"," and ",[297,306,307],{},"fpm-nginx",")",[287,310,311],{},"Include a health check to monitor Reverb status",[287,313,314],{},"Configure a reverse proxy to route traffic to the correct container",[316,317,322],"pre",{"className":318,"code":319,"filename":320,"language":321,"meta":10,"style":10},"language-yml shiki shiki-themes github-dark","services:\n  php:\n    image: my/laravel-app\n    labels:\n      - \"traefik.enable=true\"\n      - \"traefik.http.routers.laravel.tls=true\"\n      - \"traefik.http.routers.laravel.entrypoints=websecure\"\n      - \"traefik.http.routers.laravel.rule=Host(`https://app.example.com`)\"\n      - \"traefik.http.services.laravel.loadbalancer.server.port=8080\"\n      - \"traefik.http.services.laravel.loadbalancer.server.scheme=http\"\n\n  reverb:\n    image: my/laravel-app\n    command: [\"php\", \"/var/www/html/artisan\", \"reverb:start\", \"--port=8000\"]\n    stop_signal: SIGTERM\n    healthcheck:\n      test: [\"CMD\", \"healthcheck-reverb\"]\n      start_period: 10s\n    labels:\n      - \"traefik.enable=true\"\n      - \"traefik.http.routers.reverb.tls=true\"\n      - \"traefik.http.routers.reverb.entrypoints=websecure\"\n      - \"traefik.http.routers.reverb.rule=Host(`https://reverb.example.com`)\"\n      - \"traefik.http.services.reverb.loadbalancer.server.port=8000\"\n      - \"traefik.http.services.reverb.loadbalancer.server.scheme=http\"\n","compose.yml","yml",[297,323,324,337,345,358,366,375,383,391,399,407,415,422,430,439,470,481,489,507,518,525,532,540,548,556,564],{"__ignoreMap":10},[325,326,329,333],"span",{"class":327,"line":328},"line",1,[325,330,332],{"class":331},"s4JwU","services",[325,334,336],{"class":335},"s95oV",":\n",[325,338,340,343],{"class":327,"line":339},2,[325,341,342],{"class":331},"  php",[325,344,336],{"class":335},[325,346,348,351,354],{"class":327,"line":347},3,[325,349,350],{"class":331},"    image",[325,352,353],{"class":335},": ",[325,355,357],{"class":356},"sU2Wk","my/laravel-app\n",[325,359,361,364],{"class":327,"line":360},4,[325,362,363],{"class":331},"    labels",[325,365,336],{"class":335},[325,367,369,372],{"class":327,"line":368},5,[325,370,371],{"class":335},"      - ",[325,373,374],{"class":356},"\"traefik.enable=true\"\n",[325,376,378,380],{"class":327,"line":377},6,[325,379,371],{"class":335},[325,381,382],{"class":356},"\"traefik.http.routers.laravel.tls=true\"\n",[325,384,386,388],{"class":327,"line":385},7,[325,387,371],{"class":335},[325,389,390],{"class":356},"\"traefik.http.routers.laravel.entrypoints=websecure\"\n",[325,392,394,396],{"class":327,"line":393},8,[325,395,371],{"class":335},[325,397,398],{"class":356},"\"traefik.http.routers.laravel.rule=Host(`https://app.example.com`)\"\n",[325,400,402,404],{"class":327,"line":401},9,[325,403,371],{"class":335},[325,405,406],{"class":356},"\"traefik.http.services.laravel.loadbalancer.server.port=8080\"\n",[325,408,410,412],{"class":327,"line":409},10,[325,411,371],{"class":335},[325,413,414],{"class":356},"\"traefik.http.services.laravel.loadbalancer.server.scheme=http\"\n",[325,416,418],{"class":327,"line":417},11,[325,419,421],{"emptyLinePlaceholder":420},true,"\n",[325,423,425,428],{"class":327,"line":424},12,[325,426,427],{"class":331},"  reverb",[325,429,336],{"class":335},[325,431,433,435,437],{"class":327,"line":432},13,[325,434,350],{"class":331},[325,436,353],{"class":335},[325,438,357],{"class":356},[325,440,442,445,448,451,454,457,459,462,464,467],{"class":327,"line":441},14,[325,443,444],{"class":331},"    command",[325,446,447],{"class":335},": [",[325,449,450],{"class":356},"\"php\"",[325,452,453],{"class":335},", ",[325,455,456],{"class":356},"\"/var/www/html/artisan\"",[325,458,453],{"class":335},[325,460,461],{"class":356},"\"reverb:start\"",[325,463,453],{"class":335},[325,465,466],{"class":356},"\"--port=8000\"",[325,468,469],{"class":335},"]\n",[325,471,473,476,478],{"class":327,"line":472},15,[325,474,475],{"class":331},"    stop_signal",[325,477,353],{"class":335},[325,479,480],{"class":356},"SIGTERM\n",[325,482,484,487],{"class":327,"line":483},16,[325,485,486],{"class":331},"    healthcheck",[325,488,336],{"class":335},[325,490,492,495,497,500,502,505],{"class":327,"line":491},17,[325,493,494],{"class":331},"      test",[325,496,447],{"class":335},[325,498,499],{"class":356},"\"CMD\"",[325,501,453],{"class":335},[325,503,504],{"class":356},"\"healthcheck-reverb\"",[325,506,469],{"class":335},[325,508,510,513,515],{"class":327,"line":509},18,[325,511,512],{"class":331},"      start_period",[325,514,353],{"class":335},[325,516,517],{"class":356},"10s\n",[325,519,521,523],{"class":327,"line":520},19,[325,522,363],{"class":331},[325,524,336],{"class":335},[325,526,528,530],{"class":327,"line":527},20,[325,529,371],{"class":335},[325,531,374],{"class":356},[325,533,535,537],{"class":327,"line":534},21,[325,536,371],{"class":335},[325,538,539],{"class":356},"\"traefik.http.routers.reverb.tls=true\"\n",[325,541,543,545],{"class":327,"line":542},22,[325,544,371],{"class":335},[325,546,547],{"class":356},"\"traefik.http.routers.reverb.entrypoints=websecure\"\n",[325,549,551,553],{"class":327,"line":550},23,[325,552,371],{"class":335},[325,554,555],{"class":356},"\"traefik.http.routers.reverb.rule=Host(`https://reverb.example.com`)\"\n",[325,557,559,561],{"class":327,"line":558},24,[325,560,371],{"class":335},[325,562,563],{"class":356},"\"traefik.http.services.reverb.loadbalancer.server.port=8000\"\n",[325,565,567,569],{"class":327,"line":566},25,[325,568,371],{"class":335},[325,570,571],{"class":356},"\"traefik.http.services.reverb.loadbalancer.server.scheme=http\"\n",[235,573,575],{"id":574},"environment-variable-configuration","Environment variable configuration",[577,578,579],"warning",{},[240,580,581,582,585,586,589,590,593,594,597],{},"Don't confuse ",[280,583,584],{},"CLIENT"," variables with ",[280,587,588],{},"SERVER"," variables. The ",[297,591,592],{},"REVERB_SERVER_*"," variables configure the Reverb daemon itself, while ",[297,595,596],{},"REVERB_*"," variables tell your frontend clients how to connect.",[240,599,600],{},"Configure these environment variables in your Laravel application:",[602,603,604,626],"table",{},[605,606,607],"thead",{},[608,609,610,616,621],"tr",{},[611,612,613],"th",{},[280,614,615],{},"Laravel ENV Variable",[611,617,618],{},[280,619,620],{},"Description",[611,622,623],{},[280,624,625],{},"Value (matching example above)",[627,628,629,648,665],"tbody",{},[608,630,631,637,643],{},[632,633,634],"td",{},[297,635,636],{},"REVERB_HOST",[632,638,639,640,642],{},"The hostname the ",[280,641,584],{}," will connect to",[632,644,645],{},[297,646,647],{},"reverb.example.com",[608,649,650,655,660],{},[632,651,652],{},[297,653,654],{},"REVERB_PORT",[632,656,657,658,642],{},"The port the ",[280,659,584],{},[632,661,662],{},[297,663,664],{},"443",[608,666,667,672,677],{},[632,668,669],{},[297,670,671],{},"REVERB_SCHEME",[632,673,674,675,642],{},"The scheme the ",[280,676,584],{},[632,678,679],{},[297,680,681],{},"https",[235,683,685],{"id":684},"advanced-configuration","Advanced configuration",[244,687,688],{},[240,689,690,693,694,696,697,699,700,705,706,709],{},[280,691,692],{},"Multiple processes in one container:"," If you're running ",[297,695,307],{}," or ",[297,698,303],{}," and you'd like to have everything in a single container, you can ",[252,701,704],{"href":702,"rel":703,"target":246},"https://github.com/just-containers/s6-overlay/tree/master#writing-a-service-script",[255],"write your own S6 Overlay service script"," to properly manage multiple processes in a single container. Learn more about about this in our ",[252,707,708],{"href":168},"Using S6 Overlay guide",".",[711,712,713],"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":339,"depth":339,"links":715},[716,717,718,719],{"id":237,"depth":339,"text":238},{"id":272,"depth":339,"text":273},{"id":574,"depth":339,"text":575},{"id":684,"depth":339,"text":685},"Learn how to configure Laravel Reverb with Docker.","md",null,{"head":724,"layout":7},{"title":725},"Laravel Reverb with Docker - Docker PHP - Server Side Up",{"title":112,"description":720},"JYYlp-3KNEpXDEr61z4FAss3JGMB8pDppRAG-EbiNbA",[729,731],{"title":108,"path":109,"stem":110,"description":730,"children":-1},"Learn how to configure Laravel Horizon with Docker.",{"title":116,"path":117,"stem":118,"description":732,"children":-1},"Learn how to configure Laravel Nightwatch with Docker.",1789148877056]