CINXE.COM
Local environment - Wodby Docs
<!doctype html> <html lang="en" class="no-js"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="description" content="Wodby 1.0 Documentation"> <meta name="author" content="Wodby, Inc."> <link rel="canonical" href="https://wodby.com/docs/1.0/stacks/laravel/local/"> <link rel="prev" href="../containers/"> <link rel="next" href="../../ruby/"> <link rel="icon" href="../../../assets/images/favicon.png"> <meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.4.8"> <title>Local environment - Wodby Docs</title> <link rel="stylesheet" href="../../../assets/stylesheets/main.4b4a2bd9.min.css"> <link rel="stylesheet" href="../../../assets/stylesheets/palette.356b1318.min.css"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> <link rel="stylesheet" href="../../../assets/wodby.css"> <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> </head> <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo"> <script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script> <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> <label class="md-overlay" for="__drawer"></label> <div data-md-component="skip"> <a href="#local-environment-with-docker4laravel" class="md-skip"> Skip to content </a> </div> <div data-md-component="announce"> </div> <!-- Copyright (c) 2016-2023 Martin Donath <martin.donath@squidfunk.com> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --> <!-- Determine classes --> <!-- Header --> <header class="md-header" data-md-component="header"> <nav class="md-header__inner md-grid" aria-label="Header" > <!-- Link to home --> <a href="../../.." title="Wodby Docs" class="md-header__button md-logo" aria-label="Wodby Docs" data-md-component="logo" > <img src="../../../assets/images/wodby1-logo.png" alt="logo"> </a> <!-- Button to open drawer --> <label class="md-header__button md-icon" for="__drawer"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg> </label> <!-- Header title --> <div class="md-header__title" data-md-component="header-title"> <div class="md-header__ellipsis"> <div class="md-header__topic"> <span class="md-ellipsis"> Wodby Docs </span> <div class="md-version"> <button class="md-version__current" aria-label="1.0" > 1.0 </button> <ul class="md-version__list"> <li class="md-version__item"> <a href="https://wodby.com/docs/1.0" class="md-version__link"> 1.0 </a> </li> <li class="md-version__item"> <a href="https://wodby.com/docs/2.0" class="md-version__link"> 2.0 </a> </li> </ul> </div> </div> <div class="md-header__topic" data-md-component="header-topic"> <span class="md-ellipsis"> Local environment </span> </div> </div> </div> <!-- Color palette toggle --> <form class="md-header__option" data-md-component="palette"> <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg> </label> <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_2"> <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg> </label> </form> <!-- Site language selector --> <!-- Button to open search modal --> <label class="md-header__button md-icon" for="__search"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> </label> <!-- Search interface --> <div class="md-search" data-md-component="search" role="dialog"> <label class="md-search__overlay" for="__search"></label> <div class="md-search__inner" role="search"> <form class="md-search__form" name="search"> <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> <label class="md-search__icon md-icon" for="__search"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg> </label> <nav class="md-search__options" aria-label="Search"> <a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg> </a> <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg> </button> </nav> <div class="md-search__suggest" data-md-component="search-suggest"></div> </form> <div class="md-search__output"> <div class="md-search__scrollwrap" data-md-scrollfix> <div class="md-search-result" data-md-component="search-result"> <div class="md-search-result__meta"> Initializing search </div> <ol class="md-search-result__list" role="presentation"></ol> </div> </div> </div> </div> </div> <!-- Repository information --> <div class="md-header__source"> <a href="https://github.com/wodby/docs" title="Go to repository" class="md-source" data-md-component="source"> <div class="md-source__icon md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg> </div> <div class="md-source__repository"> wodby/docs </div> </a> </div> </nav> <!-- Navigation tabs (sticky) --> </header> <div class="md-container" data-md-component="container"> <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> <div class="md-grid"> <ul class="md-tabs__list"> <li class="md-tabs__item"> <a href="../../.." class="md-tabs__link"> Home </a> </li> <li class="md-tabs__item"> <a href="../../../apps/new/" class="md-tabs__link"> Apps </a> </li> <li class="md-tabs__item"> <a href="../../../infrastructure/" class="md-tabs__link"> Infrastructure </a> </li> <li class="md-tabs__item md-tabs__item--active"> <a href="../../" class="md-tabs__link"> Stacks </a> </li> <li class="md-tabs__item"> <a href="../../../integrations/aws/" class="md-tabs__link"> Integrations </a> </li> <li class="md-tabs__item"> <a href="../../../cluster/" class="md-tabs__link"> Cluster </a> </li> </ul> </div> </nav> <main class="md-main" data-md-component="main"> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > <div class="md-sidebar__scrollwrap"> <div class="md-sidebar__inner"> <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> <label class="md-nav__title" for="__drawer"> <a href="../../.." title="Wodby Docs" class="md-nav__button md-logo" aria-label="Wodby Docs" data-md-component="logo"> <img src="../../../assets/images/wodby1-logo.png" alt="logo"> </a> Wodby Docs </label> <div class="md-nav__source"> <a href="https://github.com/wodby/docs" title="Go to repository" class="md-source" data-md-component="source"> <div class="md-source__icon md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg> </div> <div class="md-source__repository"> wodby/docs </div> </a> </div> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_1" > <label class="md-nav__link" for="__nav_1" id="__nav_1_label" tabindex=""> <span class="md-ellipsis"> Home </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_1_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_1"> <span class="md-nav__icon md-icon"></span> Home </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../.." class="md-nav__link"> <span class="md-ellipsis"> Getting started </span> </a> </li> <li class="md-nav__item"> <a href="../../../billing/" class="md-nav__link"> <span class="md-ellipsis"> Billing </span> </a> </li> <li class="md-nav__item"> <a href="../../../dev/" class="md-nav__link"> <span class="md-ellipsis"> Development </span> </a> </li> <li class="md-nav__item"> <a href="../../../docker4x/" class="md-nav__link"> <span class="md-ellipsis"> Docker4X </span> </a> </li> <li class="md-nav__item"> <a href="../../../faq/" class="md-nav__link"> <span class="md-ellipsis"> FAQ </span> </a> </li> <li class="md-nav__item"> <a href="../../../status/" class="md-nav__link"> <span class="md-ellipsis"> Status </span> </a> </li> <li class="md-nav__item"> <a href="../../../support/" class="md-nav__link"> <span class="md-ellipsis"> Support </span> </a> </li> <li class="md-nav__item"> <a href="../../../troubleshooting/" class="md-nav__link"> <span class="md-ellipsis"> Troubleshooting </span> </a> </li> <li class="md-nav__item"> <a href="../../../roles/" class="md-nav__link"> <span class="md-ellipsis"> User roles </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" > <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex=""> <span class="md-ellipsis"> Apps </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_2"> <span class="md-nav__icon md-icon"></span> Apps </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../../apps/new/" class="md-nav__link"> <span class="md-ellipsis"> New app </span> </a> </li> <li class="md-nav__item"> <a href="../../../apps/instances/" class="md-nav__link"> <span class="md-ellipsis"> Instances </span> </a> </li> <li class="md-nav__item"> <a href="../../../apps/deploy/" class="md-nav__link"> <span class="md-ellipsis"> Deployment </span> </a> </li> <li class="md-nav__item"> <a href="../../../apps/domains/" class="md-nav__link"> <span class="md-ellipsis"> Domains </span> </a> </li> <li class="md-nav__item"> <a href="../../../apps/backups/" class="md-nav__link"> <span class="md-ellipsis"> Backups </span> </a> </li> <li class="md-nav__item"> <a href="../../../apps/logs/" class="md-nav__link"> <span class="md-ellipsis"> Logging </span> </a> </li> <li class="md-nav__item"> <a href="../../../apps/post-deployment-scripts/" class="md-nav__link"> <span class="md-ellipsis"> Post-deployment scripts </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" > <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex=""> <span class="md-ellipsis"> Infrastructure </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_3"> <span class="md-nav__icon md-icon"></span> Infrastructure </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../../infrastructure/" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item"> <a href="../../../infrastructure/connecting-server/" class="md-nav__link"> <span class="md-ellipsis"> Connecting server </span> </a> </li> <li class="md-nav__item"> <a href="../../../infrastructure/containers/" class="md-nav__link"> <span class="md-ellipsis"> Containers </span> </a> </li> <li class="md-nav__item"> <a href="../../../infrastructure/monitoring/" class="md-nav__link"> <span class="md-ellipsis"> Monitoring </span> </a> </li> <li class="md-nav__item"> <a href="../../../infrastructure/mail-delivery/" class="md-nav__link"> <span class="md-ellipsis"> Mail delivery </span> </a> </li> <li class="md-nav__item"> <a href="../../../infrastructure/env-vars/" class="md-nav__link"> <span class="md-ellipsis"> Environment variables </span> </a> </li> <li class="md-nav__item"> <a href="../../../infrastructure/disk/" class="md-nav__link"> <span class="md-ellipsis"> Disk </span> </a> </li> <li class="md-nav__item"> <a href="../../../infrastructure/maintenance/" class="md-nav__link"> <span class="md-ellipsis"> Maintenance </span> </a> </li> <li class="md-nav__item"> <a href="../../../infrastructure/security/" class="md-nav__link"> <span class="md-ellipsis"> Security </span> </a> </li> <li class="md-nav__item"> <a href="../../../infrastructure/hsts/" class="md-nav__link"> <span class="md-ellipsis"> HSTS </span> </a> </li> <li class="md-nav__item"> <a href="../../../infrastructure/ufw/" class="md-nav__link"> <span class="md-ellipsis"> UFW </span> </a> </li> <li class="md-nav__item"> <a href="../../../infrastructure/cli/" class="md-nav__link"> <span class="md-ellipsis"> CLI </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked> <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex=""> <span class="md-ellipsis"> Stacks </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true"> <label class="md-nav__title" for="__nav_4"> <span class="md-nav__icon md-icon"></span> Stacks </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item"> <a href="../../config/" class="md-nav__link"> <span class="md-ellipsis"> Configuration </span> </a> </li> <li class="md-nav__item"> <a href="../../template/" class="md-nav__link"> <span class="md-ellipsis"> Template </span> </a> </li> <li class="md-nav__item"> <a href="../../maintenance/" class="md-nav__link"> <span class="md-ellipsis"> Maintenance </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_5" > <label class="md-nav__link" for="__nav_4_5" id="__nav_4_5_label" tabindex="0"> <span class="md-ellipsis"> Drupal </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_5_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_4_5"> <span class="md-nav__icon md-icon"></span> Drupal </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../drupal/" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item"> <a href="../../drupal/containers/" class="md-nav__link"> <span class="md-ellipsis"> Containers </span> </a> </li> <li class="md-nav__item"> <a href="../../drupal/local/" class="md-nav__link"> <span class="md-ellipsis"> Local environment </span> </a> </li> <li class="md-nav__item"> <a href="../../drupal/changelog/" class="md-nav__link"> <span class="md-ellipsis"> Changelog </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_6" > <label class="md-nav__link" for="__nav_4_6" id="__nav_4_6_label" tabindex="0"> <span class="md-ellipsis"> WordPress </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_6_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_4_6"> <span class="md-nav__icon md-icon"></span> WordPress </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../wordpress/" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item"> <a href="../../wordpress/containers/" class="md-nav__link"> <span class="md-ellipsis"> Containers </span> </a> </li> <li class="md-nav__item"> <a href="../../wordpress/local/" class="md-nav__link"> <span class="md-ellipsis"> Local environment </span> </a> </li> <li class="md-nav__item"> <a href="../../wordpress/changelog/" class="md-nav__link"> <span class="md-ellipsis"> Changelog </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_7" > <label class="md-nav__link" for="__nav_4_7" id="__nav_4_7_label" tabindex="0"> <span class="md-ellipsis"> PHP </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_7_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_4_7"> <span class="md-nav__icon md-icon"></span> PHP </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../php/" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item"> <a href="../../php/containers/" class="md-nav__link"> <span class="md-ellipsis"> Containers </span> </a> </li> <li class="md-nav__item"> <a href="../../php/local/" class="md-nav__link"> <span class="md-ellipsis"> Local environment </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_8" checked> <label class="md-nav__link" for="__nav_4_8" id="__nav_4_8_label" tabindex="0"> <span class="md-ellipsis"> Laravel </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_8_label" aria-expanded="true"> <label class="md-nav__title" for="__nav_4_8"> <span class="md-nav__icon md-icon"></span> Laravel </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item"> <a href="../containers/" class="md-nav__link"> <span class="md-ellipsis"> Containers </span> </a> </li> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> <label class="md-nav__link md-nav__link--active" for="__toc"> <span class="md-ellipsis"> Local environment </span> <span class="md-nav__icon md-icon"></span> </label> <a href="./" class="md-nav__link md-nav__link--active"> <span class="md-ellipsis"> Local environment </span> </a> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class="md-nav__title" for="__toc"> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> <li class="md-nav__item"> <a href="#requirements" class="md-nav__link"> Requirements </a> </li> <li class="md-nav__item"> <a href="#usage" class="md-nav__link"> Usage </a> </li> <li class="md-nav__item"> <a href="#domains" class="md-nav__link"> Domains </a> </li> <li class="md-nav__item"> <a href="#xdebug" class="md-nav__link"> Xdebug </a> <nav class="md-nav" aria-label="Xdebug"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#debugging-web-requests" class="md-nav__link"> Debugging web requests </a> </li> <li class="md-nav__item"> <a href="#debugging-cli-requests" class="md-nav__link"> Debugging CLI requests </a> </li> <li class="md-nav__item"> <a href="#ide-configuration" class="md-nav__link"> IDE configuration </a> <nav class="md-nav" aria-label="IDE configuration"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#phpstorm" class="md-nav__link"> PHPStorm </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#database-import-and-export" class="md-nav__link"> Database import and export </a> <nav class="md-nav" aria-label="Database import and export"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#mariadb" class="md-nav__link"> MariaDB </a> </li> <li class="md-nav__item"> <a href="#postgresql" class="md-nav__link"> PostgreSQL </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#make-commands" class="md-nav__link"> Make commands </a> </li> <li class="md-nav__item"> <a href="#docker-for-mac" class="md-nav__link"> Docker for mac </a> <nav class="md-nav" aria-label="Docker for mac"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#macos-permissions-issues" class="md-nav__link"> macOS permissions issues </a> </li> <li class="md-nav__item"> <a href="#bind-mounts-performance" class="md-nav__link"> Bind mounts performance </a> <nav class="md-nav" aria-label="Bind mounts performance"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#mutagen" class="md-nav__link"> Mutagen </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#permissions-issues" class="md-nav__link"> Permissions issues </a> <nav class="md-nav" aria-label="Permissions issues"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#linux" class="md-nav__link"> Linux </a> </li> <li class="md-nav__item"> <a href="#macos" class="md-nav__link"> macOS </a> </li> <li class="md-nav__item"> <a href="#windows" class="md-nav__link"> Windows </a> </li> <li class="md-nav__item"> <a href="#different-uidgid" class="md-nav__link"> Different uid/gid? </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#running-multiple-projects" class="md-nav__link"> Running multiple Projects </a> <nav class="md-nav" aria-label="Running multiple Projects"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#single-port" class="md-nav__link"> Single port </a> </li> <li class="md-nav__item"> <a href="#different-ports" class="md-nav__link"> Different ports </a> </li> </ul> </nav> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_9" > <label class="md-nav__link" for="__nav_4_9" id="__nav_4_9_label" tabindex="0"> <span class="md-ellipsis"> Ruby </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_9_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_4_9"> <span class="md-nav__icon md-icon"></span> Ruby </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../ruby/" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item"> <a href="../../ruby/containers/" class="md-nav__link"> <span class="md-ellipsis"> Containers </span> </a> </li> <li class="md-nav__item"> <a href="../../ruby/local/" class="md-nav__link"> <span class="md-ellipsis"> Local environment </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_10" > <label class="md-nav__link" for="__nav_4_10" id="__nav_4_10_label" tabindex="0"> <span class="md-ellipsis"> Python </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_10_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_4_10"> <span class="md-nav__icon md-icon"></span> Python </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../python/" class="md-nav__link"> <span class="md-ellipsis"> Overview </span> </a> </li> <li class="md-nav__item"> <a href="../../python/containers/" class="md-nav__link"> <span class="md-ellipsis"> Containers </span> </a> </li> <li class="md-nav__item"> <a href="../../python/local/" class="md-nav__link"> <span class="md-ellipsis"> Local environment </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="../../html/" class="md-nav__link"> <span class="md-ellipsis"> HTML </span> </a> </li> <li class="md-nav__item"> <a href="../../matomo/" class="md-nav__link"> <span class="md-ellipsis"> Matomo </span> </a> </li> <li class="md-nav__item"> <a href="../../cachet/" class="md-nav__link"> <span class="md-ellipsis"> Cachet </span> </a> </li> <li class="md-nav__item"> <a href="../../mariadb/" class="md-nav__link"> <span class="md-ellipsis"> MariaDB </span> </a> </li> <li class="md-nav__item"> <a href="../../postgres/" class="md-nav__link"> <span class="md-ellipsis"> PostgreSQL </span> </a> </li> <li class="md-nav__item"> <a href="../../solr/" class="md-nav__link"> <span class="md-ellipsis"> Solr </span> </a> </li> <li class="md-nav__item"> <a href="../../solr-drupal/" class="md-nav__link"> <span class="md-ellipsis"> Solr for Drupal </span> </a> </li> <li class="md-nav__item"> <a href="../../opensmtpd/" class="md-nav__link"> <span class="md-ellipsis"> OpenSMTPD </span> </a> </li> <li class="md-nav__item"> <a href="../../elasticsearch/" class="md-nav__link"> <span class="md-ellipsis"> Elasticsearch </span> </a> </li> <li class="md-nav__item"> <a href="../../athenapdf/" class="md-nav__link"> <span class="md-ellipsis"> AthenaPDF </span> </a> </li> <li class="md-nav__item"> <a href="../../redis/" class="md-nav__link"> <span class="md-ellipsis"> Redis </span> </a> </li> <li class="md-nav__item"> <a href="../../varnish/" class="md-nav__link"> <span class="md-ellipsis"> Varnish </span> </a> </li> <li class="md-nav__item"> <a href="../../docker-registry/" class="md-nav__link"> <span class="md-ellipsis"> Docker registry </span> </a> </li> <li class="md-nav__item"> <a href="../../slackin/" class="md-nav__link"> <span class="md-ellipsis"> Slackin </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" > <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex=""> <span class="md-ellipsis"> Integrations </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5"> <span class="md-nav__icon md-icon"></span> Integrations </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../../integrations/aws/" class="md-nav__link"> <span class="md-ellipsis"> AWS </span> </a> </li> <li class="md-nav__item"> <a href="../../../integrations/azure/" class="md-nav__link"> <span class="md-ellipsis"> Azure </span> </a> </li> <li class="md-nav__item"> <a href="../../../integrations/bitbucket/" class="md-nav__link"> <span class="md-ellipsis"> BitBucket </span> </a> </li> <li class="md-nav__item"> <a href="../../../integrations/cloudflare/" class="md-nav__link"> <span class="md-ellipsis"> CloudFlare </span> </a> </li> <li class="md-nav__item"> <a href="../../../integrations/digitalocean/" class="md-nav__link"> <span class="md-ellipsis"> DigitalOcean </span> </a> </li> <li class="md-nav__item"> <a href="../../../integrations/docker-registry/" class="md-nav__link"> <span class="md-ellipsis"> Docker registry </span> </a> </li> <li class="md-nav__item"> <a href="../../../integrations/gcp/" class="md-nav__link"> <span class="md-ellipsis"> GCP </span> </a> </li> <li class="md-nav__item"> <a href="../../../integrations/github/" class="md-nav__link"> <span class="md-ellipsis"> GitHub </span> </a> </li> <li class="md-nav__item"> <a href="../../../integrations/gitlab/" class="md-nav__link"> <span class="md-ellipsis"> GitLab </span> </a> </li> <li class="md-nav__item"> <a href="../../../integrations/sendgrid/" class="md-nav__link"> <span class="md-ellipsis"> SendGrid </span> </a> </li> <li class="md-nav__item"> <a href="../../../integrations/custom/" class="md-nav__link"> <span class="md-ellipsis"> Custom provider </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" > <label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex=""> <span class="md-ellipsis"> Cluster </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_6"> <span class="md-nav__icon md-icon"></span> Cluster </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="../../../cluster/" class="md-nav__link"> <span class="md-ellipsis"> Kubernetes cluster </span> </a> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > <div class="md-sidebar__scrollwrap"> <div class="md-sidebar__inner"> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class="md-nav__title" for="__toc"> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> <li class="md-nav__item"> <a href="#requirements" class="md-nav__link"> Requirements </a> </li> <li class="md-nav__item"> <a href="#usage" class="md-nav__link"> Usage </a> </li> <li class="md-nav__item"> <a href="#domains" class="md-nav__link"> Domains </a> </li> <li class="md-nav__item"> <a href="#xdebug" class="md-nav__link"> Xdebug </a> <nav class="md-nav" aria-label="Xdebug"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#debugging-web-requests" class="md-nav__link"> Debugging web requests </a> </li> <li class="md-nav__item"> <a href="#debugging-cli-requests" class="md-nav__link"> Debugging CLI requests </a> </li> <li class="md-nav__item"> <a href="#ide-configuration" class="md-nav__link"> IDE configuration </a> <nav class="md-nav" aria-label="IDE configuration"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#phpstorm" class="md-nav__link"> PHPStorm </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#database-import-and-export" class="md-nav__link"> Database import and export </a> <nav class="md-nav" aria-label="Database import and export"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#mariadb" class="md-nav__link"> MariaDB </a> </li> <li class="md-nav__item"> <a href="#postgresql" class="md-nav__link"> PostgreSQL </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#make-commands" class="md-nav__link"> Make commands </a> </li> <li class="md-nav__item"> <a href="#docker-for-mac" class="md-nav__link"> Docker for mac </a> <nav class="md-nav" aria-label="Docker for mac"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#macos-permissions-issues" class="md-nav__link"> macOS permissions issues </a> </li> <li class="md-nav__item"> <a href="#bind-mounts-performance" class="md-nav__link"> Bind mounts performance </a> <nav class="md-nav" aria-label="Bind mounts performance"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#mutagen" class="md-nav__link"> Mutagen </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#permissions-issues" class="md-nav__link"> Permissions issues </a> <nav class="md-nav" aria-label="Permissions issues"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#linux" class="md-nav__link"> Linux </a> </li> <li class="md-nav__item"> <a href="#macos" class="md-nav__link"> macOS </a> </li> <li class="md-nav__item"> <a href="#windows" class="md-nav__link"> Windows </a> </li> <li class="md-nav__item"> <a href="#different-uidgid" class="md-nav__link"> Different uid/gid? </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="#running-multiple-projects" class="md-nav__link"> Running multiple Projects </a> <nav class="md-nav" aria-label="Running multiple Projects"> <ul class="md-nav__list"> <li class="md-nav__item"> <a href="#single-port" class="md-nav__link"> Single port </a> </li> <li class="md-nav__item"> <a href="#different-ports" class="md-nav__link"> Different ports </a> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class="md-content" data-md-component="content"> <article class="md-content__inner md-typeset"> <h1 id="local-environment-with-docker4laravel">Local environment with Docker4Laravel<a class="headerlink" href="#local-environment-with-docker4laravel" title="Permanent link">¶</a></h1> <p>Docker4Laravel is an open-source project (<a href="https://github.com/wodby/docker4laravel">GitHub page</a>) that provides pre-configured <code>compose.yml</code> file with images to spin up local environment on Linux, Mac OS X and Windows. </p> <h2 id="requirements">Requirements<a class="headerlink" href="#requirements" title="Permanent link">¶</a></h2> <ul> <li>Install Docker (<a href="https://docs.docker.com/engine/installation">Linux</a>, <a href="https://docs.docker.com/engine/installation/mac">Docker for Mac</a> or <a href="https://docs.docker.com/engine/installation/windows">Docker for Windows (10+ Pro)</a>)</li> <li>For Linux additionally install <a href="https://docs.docker.com/compose/install">docker compose</a></li> </ul> <h2 id="usage">Usage<a class="headerlink" href="#usage" title="Permanent link">¶</a></h2> <div class="admonition warning"> <p class="admonition-title">Database data persistence</p> <p>By default Docker will create a persistent <a href="https://docs.docker.com/storage/volumes/">volume</a> for your DB data and unless you explicitly remove volumes the files will not be deleted. However, if you run <code>docker compose down</code> (it's ok to use <code>stop</code> though) these volumes will not be reattached when you run <code>docker compose up</code>. If you want to have your DB data all-time persistent and attached, we recommend using <a href="https://docs.docker.com/storage/bind-mounts/">a bind mount</a>. To use a bind mount uncomment the corresponding line under db server's <code>volumes:</code> in your <code>compose.yml</code> and update the host path to your data directory.</p> </div> <ol> <li>Download <code>docker4laravel.tar.gz</code> from the <a href="https://github.com/wodby/docker4laravel/releases">latest stable release</a> and unpack to your Laravel project root</li> <li>Make sure <code>NGINX_SERVER_ROOT</code> (or <code>APACHE_DOCUMENT_ROOT</code>) is set to your project public directory with <code>index.php</code> (by default <code>/var/www/html/public</code>) </li> <li>Ensure database credentials match in your database config and <code>.env</code> files</li> <li><a href="#domains">Configure domains</a> </li> <li>Optional: <a href="#database-import-and-export">import existing database</a> </li> <li>Optional: uncomment lines in the compose file to run redis, elasticsearch, kibana, etc</li> <li>Optional: macOS users please read <a href="#docker-for-mac">this</a></li> <li>Optional: Windows users please read <a href="#permissions-issues">this</a></li> <li>Run containers: <a href="#make-commands"><code>make up</code></a> or <code>docker compose up -d</code></li> <li>Your laravel application should be up and running at <a href="http://laravel.docker.localhost:8000">http://laravel.docker.localhost:8000</a></li> <li>You can see status of your containers and their logs via portainer: <a href="http://portainer.laravel.docker.localhost:8000">http://portainer.laravel.docker.localhost:8000</a></li> </ol> <p>You can stop containers by executing <a href="#make-commands"><code>make stop</code></a> or <code>docker compose stop</code>.</p> <div class="admonition info"> <p class="admonition-title">Optional files</p> <p>If you don't need to <a href="#running-multiple-projects">run multiple projects</a> feel free to delete <code>traefik.yml</code> that come within <code>docker4laravel.tar.gz</code></p> </div> <div class="admonition success"> <p class="admonition-title">Get updates</p> <p>We release updates to images from time to time, you can find detailed changelog and update instructions on GitHub under <a href="https://github.com/wodby/docker4laravel/releases">releases page</a> </p> </div> <h2 id="domains">Domains<a class="headerlink" href="#domains" title="Permanent link">¶</a></h2> <p>Docker4Laravel uses <a href="https://hub.docker.com/_/traefik">traefik</a> container for routing. By default, we use port <code>8000</code> to avoid potential conflicts but if port <code>80</code> is free on your host machine just replace traefik's ports definition in the compose file.</p> <p>By default <code>BASE_URL</code> set to <code>laravel.docker.localhost</code>, you can change it in <code>.env</code> file.</p> <p>Add <code>127.0.0.1 laravel.docker.localhost</code> to your <code>/etc/hosts</code> file (some browsers like Chrome may work without it). Do the same for other default domains you might need from listed below: </p> <table> <thead> <tr> <th>Service</th> <th>Domain</th> </tr> </thead> <tbody> <tr> <td><code>nginx/apache</code></td> <td><code>http://laravel.docker.localhost:8000</code></td> </tr> <tr> <td><code>pma</code></td> <td><code>http://pma.laravel.docker.localhost:8000</code></td> </tr> <tr> <td><code>adminer</code></td> <td><code>http://adminer.laravel.docker.localhost:8000</code></td> </tr> <tr> <td><code>mailpit</code></td> <td><code>http://mailpit.laravel.docker.localhost:8000</code></td> </tr> <tr> <td><code>solr</code></td> <td><code>http://solr.laravel.docker.localhost:8000</code></td> </tr> <tr> <td><code>kibana</code></td> <td><code>http://kibana.laravel.docker.localhost:8000</code></td> </tr> <tr> <td><code>node</code></td> <td><code>http://front.laravel.docker.localhost:8000</code></td> </tr> <tr> <td><code>varnish</code></td> <td><code>http://varnish.laravel.docker.localhost:8000</code></td> </tr> <tr> <td><code>portainer</code></td> <td><code>http://portainer.laravel.docker.localhost:8000</code></td> </tr> <tr> <td><code>webgrind</code></td> <td><code>http://webgrind.laravel.docker.localhost:8000</code></td> </tr> </tbody> </table> <h2 id="xdebug">Xdebug<a class="headerlink" href="#xdebug" title="Permanent link">¶</a></h2> <div class="admonition help"> <p class="admonition-title">Xdebug troubleshooting</p> <p>Enable xdebug logs to get more information by adding <code>$PHP_XDEBUG_REMOTE_LOG=/tmp/php-xdebug.log</code> environment variable to PHP container.</p> </div> <h3 id="debugging-web-requests">Debugging web requests<a class="headerlink" href="#debugging-web-requests" title="Permanent link">¶</a></h3> <p>Make sure you have <code>PHP_EXTENSIONS_DISABLE</code> env var overridden in your compose file to enable Xdebug (default value is <code>xdebug,xhprof</code>). </p> <ol> <li>Uncomment these lines for PHP service in your <code>compose.yml</code> file (environment variables changed since xdebug 3.x) <div class="highlight"><pre><span></span><code>PHP_XDEBUG_MODE: debug </code></pre></div></li> <li>Restart containers (<code>make</code>)</li> <li>Start debugging in IDE</li> <li>Start your browser debug helper plugin (<a href="https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc?hl=en">Chrome</a> or <a href="https://addons.mozilla.org/en-us/firefox/addon/the-easiest-xdebug">Firefox</a>) and open the page you want to debug. Alternatively, enable auto start by adding <code>PHP_XDEBUG_START_WITH_REQUEST: "yes"</code></li> </ol> <h3 id="debugging-cli-requests">Debugging CLI requests<a class="headerlink" href="#debugging-cli-requests" title="Permanent link">¶</a></h3> <ol> <li>Enable Xdebug as described in the previous section</li> <li>Uncomment the following environment variables for PHP service in your composer file <div class="highlight"><pre><span></span><code>PHP_IDE_CONFIG: serverName=my-ide </code></pre></div></li> <li><a href="#ide-configuration-to-debug-cli-requests">Configure your IDE</a></li> <li>Restart containers (<code>make</code>)</li> </ol> <p>Also, you might need to <a href="https://github.com/wodby/docker4drupal/issues/193">update your hosts</a> file.</p> <h3 id="ide-configuration">IDE configuration<a class="headerlink" href="#ide-configuration" title="Permanent link">¶</a></h3> <p>You must additionally configure your IDE to debug CLI requests.</p> <h4 id="phpstorm">PHPStorm<a class="headerlink" href="#phpstorm" title="Permanent link">¶</a></h4> <ol> <li>Open <code>Run > Edit Configurations</code> from the main menu, choose <code>Defaults > PHP Web Page</code> in the left sidebar</li> <li>Click to <code>[...]</code> to the right of <code>Server</code> and add a new server<ul> <li>Enter name <code>my-ide</code> (as specified in <code>PHP_IDE_CONFIG</code>)</li> <li>Enter any host, it does not matter</li> <li>Check <code>Use path mappings</code>, select path to your project and enter <code>/var/www/html</code> in the right column (Absolute path on the server) </li> </ul> </li> <li>Choose newly created server in "Server" for PHP Web Page</li> <li>Save settings</li> </ol> <h2 id="database-import-and-export">Database import and export<a class="headerlink" href="#database-import-and-export" title="Permanent link">¶</a></h2> <h3 id="mariadb">MariaDB<a class="headerlink" href="#mariadb" title="Permanent link">¶</a></h3> <div class="admonition danger"> <p class="admonition-title">Known issues with indexes rebuild</p> <p>Issues have been reported when MariaDB does not build indexes when dump imported using <code>mariadb-init</code> bind mount. For safety use the workaround described at <a href="https://github.com/wodby/mariadb/issues/11">https://github.com/wodby/mariadb/issues/11</a></p> </div> <p>if you want to import your database, uncomment the line for <code>mariadb-init</code> bind mount in your compose file. Create the directory <code>./mariadb-init</code> in the same directory as the compose file and put there your <code>.sql .sql.gz .sh</code> file(s). All SQL files will be automatically imported once MariaDB container has started.</p> <p>Exporting all databases: <div class="highlight"><pre><span></span><code>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>mariadb<span class="w"> </span>sh<span class="w"> </span>-c<span class="w"> </span><span class="s1">'exec mysqldump --all-databases -uroot -p"root-password"'</span><span class="w"> </span>><span class="w"> </span>databases.sql </code></pre></div></p> <p>Exporting a specific database: <div class="highlight"><pre><span></span><code>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>mariadb<span class="w"> </span>sh<span class="w"> </span>-c<span class="w"> </span><span class="s1">'exec mysqldump -uroot -p"root-password" my-db'</span><span class="w"> </span>><span class="w"> </span>my-db.sql </code></pre></div></p> <h3 id="postgresql">PostgreSQL<a class="headerlink" href="#postgresql" title="Permanent link">¶</a></h3> <p>if you want to import your database, uncomment the line for <code>postgres-init</code> volume in your compose file. Create the volume directory <code>./postgres-init</code> in the same directory as the compose file and put there your <code>.sql .sql.gz .sh</code> file(s). All SQL files will be automatically imported once Postgres container has started.</p> <h2 id="make-commands">Make commands<a class="headerlink" href="#make-commands" title="Permanent link">¶</a></h2> <p>We provide <code>Makefile</code> that contains commands to simplify the work with your local environment. You can run <code>make [COMMAND]</code> to execute the following commands:</p> <div class="highlight"><pre><span></span><code>Usage: make COMMAND Commands: help List available commands and their description up Start up all container from the current compose.yml start Start stopped containers stop Stop all containers for the current compose.yml (docker compose stop) down Same as stop prune [service] Stop and remove containers, networks, images, and volumes (docker compose down) ps List container for the current project (docker ps with filter by name) shell [service] Access a container via shell as a default user (by default [service] is php) logs [service] Show containers logs, use [service] to show logs of specific service mutagen Start mutagen container and runs mutagen project </code></pre></div> <h2 id="docker-for-mac">Docker for mac<a class="headerlink" href="#docker-for-mac" title="Permanent link">¶</a></h2> <p>There two major problems macOS users face with when using Docker for mac:</p> <h3 id="macos-permissions-issues">macOS permissions issues<a class="headerlink" href="#macos-permissions-issues" title="Permanent link">¶</a></h3> <p>To avoid any permissions issues caused by different user id (uid), group id (gid) between your host and a container use <code>-dev-macos</code> version of php image (uncomment the environment variables in <code>.env</code> files) where the default user <code>wodby</code> has <code>501:20</code> uid/gid that matches default macOS user. </p> <h3 id="bind-mounts-performance">Bind mounts performance<a class="headerlink" href="#bind-mounts-performance" title="Permanent link">¶</a></h3> <p>By default, we use <code>:cached</code> option on bind mounts to improve performance on macOS (on Linux it behaves similarly to <code>consistent</code>). You can find more information about this in <a href="https://blog.docker.com/2017/05/user-guided-caching-in-docker-for-mac">docker blog</a>. However, there's the <a href="https://mutagen.io/documentation/orchestration/projects">synchronisation with Mutagen</a> which is a <a href="https://medium.com/netresearch/improving-performance-for-docker-on-mac-computers-when-using-named-volumes-55580efcbf68#bf1b">faster alternative</a>.</p> <h4 id="mutagen">Mutagen<a class="headerlink" href="#mutagen" title="Permanent link">¶</a></h4> <p>The core idea of this project is to use an external volume that will sync your files with a file synchronizer tool.</p> <p>First, we must install <code>mutagen</code> and <code>mutagen-compose</code>. Mutagen Compose requires Mutagen v0.13.0+. </p> <div class="highlight"><pre><span></span><code>brew<span class="w"> </span>install<span class="w"> </span>mutagen-io/mutagen brew<span class="w"> </span>install<span class="w"> </span>mutagen-io/mutagen/mutagen-compose </code></pre></div> <ol> <li>Modify your <code>compose.yml</code> as following:<ul> <li>at the end of the file uncomment <code>x-mutagen:</code> and <code>volumes:</code> fields </li> <li>replace volumes definitions under services that needs to be synced with the ones marked as "Mutagen"</li> </ul> </li> <li>Make sure ids of <code>defaultOwner</code> and <code>defaultGroup</code> under <code>x-mutagen:</code> match ids of the image you're using, e.g. uid <code>501</code> and gid <code>20</code> for <code>-dev-macos</code> image by default</li> <li>Start mutagen via <code>mutagen-compose up</code></li> </ol> <p>Now when you change your code on the host machine Mutagen will sync your data to containers that use the synced volumed.</p> <p>For more information visit <a href="https://mutagen.io/">Mutagen project page</a>.</p> <h2 id="permissions-issues">Permissions issues<a class="headerlink" href="#permissions-issues" title="Permanent link">¶</a></h2> <p>You might have permissions issues caused by non-matching uid/gid on your host machine and the default user in php container.</p> <h3 id="linux">Linux<a class="headerlink" href="#linux" title="Permanent link">¶</a></h3> <p>Since version 5.0 the default php container user <code>wodby</code> has uid/gid <code>1000</code> that matches the default uid/gid for most popular Linux distributions. </p> <h3 id="macos">macOS<a class="headerlink" href="#macos" title="Permanent link">¶</a></h3> <p><a href="#macos-permissions-issues">Use <code>-dev-macos</code> version</a> of php image where default <code>wodby</code> user has <code>501:20</code> uid/gid that matches default macOS user.</p> <h3 id="windows">Windows<a class="headerlink" href="#windows" title="Permanent link">¶</a></h3> <p>Since you <a href="https://github.com/docker/for-win/issues/39">can't change owner of mounted volumes</a> in Docker for Win, the only solution is to run everything as root, add the following options to <code>php</code> service in your <code>compose.yml</code> file:</p> <div class="highlight"><pre><span></span><code> php: user: root command: "php-fpm -R" environment: PHP_FPM_USER: root PHP_FPM_GROUP: root </code></pre></div> <h3 id="different-uidgid">Different uid/gid?<a class="headerlink" href="#different-uidgid" title="Permanent link">¶</a></h3> <p>You can rebuild the base image <a href="https://github.com/wodby/php">wodby/php</a> with custom user/group ids by using docker build arguments <code>WODBY_USER_ID</code>, <code>WODBY_GROUP_ID</code> (both <code>1000</code> by default)</p> <h2 id="running-multiple-projects">Running multiple Projects<a class="headerlink" href="#running-multiple-projects" title="Permanent link">¶</a></h2> <p>This project uses <a href="https://docs.traefik.io">tr忙fik</a> to route traffic to different containers. Tr忙fik is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease. To understand the basics of Traefik it is suggested to check Tr忙fik's documentation page: <a href="https://docs.traefik.io/">https://docs.traefik.io/</a></p> <p><img src="https://docs.traefik.io/assets/img/traefik-architecture.png" /></p> <p>Image: Multi-domain set-up example (Source: traefik.io)</p> <p>There are two ways how you can run multiple projects:</p> <h3 id="single-port">Single port<a class="headerlink" href="#single-port" title="Permanent link">¶</a></h3> <p>In this case you will run a stand-alone traefik that will be connected to docker networks of your projects:</p> <ol> <li>Download <code>traefik.yml</code> file (part of <code>docker4x.tar.gz</code> archive). Place it separately from your projects, it will be a global traefik container that will route requests to your projects on a specified port </li> <li>Now we need to provide traefik names of docker networks of our projects. Let's say projects directories with <code>compose.yml</code> named <code>foo</code> and <code>bar</code>. Docker Compose will create default docker networks for these projects called <code>foo_default</code> and <code>bar_default</code>. Update external networks names accordingly in <code>traefik.yml</code></li> <li>In <code>compose.yml</code> of your projects comment out <code>traefik</code> service and make sure <code>traefik.http.*</code> labels have <code>${PROJECT_NAME}_</code> prefix</li> <li>Make sure<code>$PROJECT_BASE_URL</code> and <code>$PROJECT_NAME</code> (in <code>.env</code> file) differ, both hosts point to <code>127.0.0.1</code> in <code>/etc/hosts</code> </li> <li>Run your projects: <code>make</code> (or <code>docker compose up -d</code>) </li> <li>Run stand-alone traefik: <code>docker compose -f traefik.yml up -d</code> </li> <li>Now when you visit URL from <code>$PROJECT_BASE_URL</code>, traefik will route traffic to the corresponding docker networks </li> </ol> <h3 id="different-ports">Different ports<a class="headerlink" href="#different-ports" title="Permanent link">¶</a></h3> <p>Alternatively, instead of running a stand-alone traefik, you can just run default traefik containers on different ports. Just a few things to make sure:</p> <ul> <li>Ports of <code>traefik</code> service in your <code>compose.yml</code> files differ </li> <li><code>traefik.http.*</code> labels have <code>${PROJECT_NAME}_</code> prefix</li> <li><code>$PROJECT_BASE_URL</code> and <code>$PROJECT_NAME</code> (in <code>.env</code> file) differ, both hosts point to <code>127.0.0.1</code> in <code>/etc/hosts</code></li> </ul> </article> </div> </div> <button type="button" class="md-top md-icon" data-md-component="top" hidden> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg> Back to top </button> </main> <footer class="md-footer"> <nav class="md-footer__inner md-grid" aria-label="Footer" > <a href="../containers/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Containers"> <div class="md-footer__button md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg> </div> <div class="md-footer__title"> <span class="md-footer__direction"> Previous </span> <div class="md-ellipsis"> Containers </div> </div> </a> <a href="../../ruby/" class="md-footer__link md-footer__link--next" aria-label="Next: Overview"> <div class="md-footer__title"> <span class="md-footer__direction"> Next </span> <div class="md-ellipsis"> Overview </div> </div> <div class="md-footer__button md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg> </div> </a> </nav> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class="md-copyright"> <div class="md-copyright__highlight"> Wodby, Inc. </div> </div> <div class="md-social"> <a href="https://wodby.com" target="_blank" rel="noopener" title="wodby.com" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.3c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.4c2.2 20.4 3.3 41.8 3.3 64zm28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64zm112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7zm-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.3 87.7-55.3 151.6zM8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64zm186.6 254.6c-11.6-26-20.9-58.2-27-94.6h176.6c-6.1 36.4-15.5 68.6-27 94.6-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6h116.7zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6h116.6z"/></svg> </a> <a href="https://github.com/wodby" target="_blank" rel="noopener" title="github.com" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg> </a> <a href="https://x.com/wodbycloud" target="_blank" rel="noopener" title="x.com" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg> </a> <a href="https://slack.wodby.com" target="_blank" rel="noopener" title="slack.wodby.com" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M94.12 315.1c0 25.9-21.16 47.06-47.06 47.06S0 341 0 315.1c0-25.9 21.16-47.06 47.06-47.06h47.06v47.06zm23.72 0c0-25.9 21.16-47.06 47.06-47.06s47.06 21.16 47.06 47.06v117.84c0 25.9-21.16 47.06-47.06 47.06s-47.06-21.16-47.06-47.06V315.1zm47.06-188.98c-25.9 0-47.06-21.16-47.06-47.06S139 32 164.9 32s47.06 21.16 47.06 47.06v47.06H164.9zm0 23.72c25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06H47.06C21.16 243.96 0 222.8 0 196.9s21.16-47.06 47.06-47.06H164.9zm188.98 47.06c0-25.9 21.16-47.06 47.06-47.06 25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06h-47.06V196.9zm-23.72 0c0 25.9-21.16 47.06-47.06 47.06-25.9 0-47.06-21.16-47.06-47.06V79.06c0-25.9 21.16-47.06 47.06-47.06 25.9 0 47.06 21.16 47.06 47.06V196.9zM283.1 385.88c25.9 0 47.06 21.16 47.06 47.06 0 25.9-21.16 47.06-47.06 47.06-25.9 0-47.06-21.16-47.06-47.06v-47.06h47.06zm0-23.72c-25.9 0-47.06-21.16-47.06-47.06 0-25.9 21.16-47.06 47.06-47.06h117.84c25.9 0 47.06 21.16 47.06 47.06 0 25.9-21.16 47.06-47.06 47.06H283.1z"/></svg> </a> <a href="https://discord.wodby.com/wodbycloud" target="_blank" rel="noopener" title="discord.wodby.com" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M524.531 69.836a1.5 1.5 0 0 0-.764-.7A485.065 485.065 0 0 0 404.081 32.03a1.816 1.816 0 0 0-1.923.91 337.461 337.461 0 0 0-14.9 30.6 447.848 447.848 0 0 0-134.426 0 309.541 309.541 0 0 0-15.135-30.6 1.89 1.89 0 0 0-1.924-.91 483.689 483.689 0 0 0-119.688 37.107 1.712 1.712 0 0 0-.788.676C39.068 183.651 18.186 294.69 28.43 404.354a2.016 2.016 0 0 0 .765 1.375 487.666 487.666 0 0 0 146.825 74.189 1.9 1.9 0 0 0 2.063-.676A348.2 348.2 0 0 0 208.12 430.4a1.86 1.86 0 0 0-1.019-2.588 321.173 321.173 0 0 1-45.868-21.853 1.885 1.885 0 0 1-.185-3.126 251.047 251.047 0 0 0 9.109-7.137 1.819 1.819 0 0 1 1.9-.256c96.229 43.917 200.41 43.917 295.5 0a1.812 1.812 0 0 1 1.924.233 234.533 234.533 0 0 0 9.132 7.16 1.884 1.884 0 0 1-.162 3.126 301.407 301.407 0 0 1-45.89 21.83 1.875 1.875 0 0 0-1 2.611 391.055 391.055 0 0 0 30.014 48.815 1.864 1.864 0 0 0 2.063.7A486.048 486.048 0 0 0 610.7 405.729a1.882 1.882 0 0 0 .765-1.352c12.264-126.783-20.532-236.912-86.934-334.541ZM222.491 337.58c-28.972 0-52.844-26.587-52.844-59.239s23.409-59.241 52.844-59.241c29.665 0 53.306 26.82 52.843 59.239 0 32.654-23.41 59.241-52.843 59.241Zm195.38 0c-28.971 0-52.843-26.587-52.843-59.239s23.409-59.241 52.843-59.241c29.667 0 53.307 26.82 52.844 59.239 0 32.654-23.177 59.241-52.844 59.241Z"/></svg> </a> </div> </div> </div> </footer> </div> <div class="md-dialog" data-md-component="dialog"> <div class="md-dialog__inner md-typeset"></div> </div> <script id="__config" type="application/json">{"base": "../../..", "features": ["navigation.tabs", "navigation.instant", "navigation.footer", "content.code.annotate", "content.code.copy", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.f886a092.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script> <script src="../../../assets/javascripts/bundle.81fa17fe.min.js"></script> <script src="../../../assets/intercom.js"></script> </body> </html>