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