{"id":849,"date":"2022-10-24T15:24:16","date_gmt":"2022-10-24T13:24:16","guid":{"rendered":"https:\/\/olkn.myvnc.com\/?p=849"},"modified":"2023-01-17T16:06:48","modified_gmt":"2023-01-17T15:06:48","slug":"laravel-development","status":"publish","type":"post","link":"https:\/\/olkn.myvnc.com\/?p=849","title":{"rendered":"Laravel &#8211; development environment"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#laravel_with_sail\" >laravel with sail<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#basics\" >basics<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#Proxy\" >Proxy<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#git\" >git<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#Laravel_Breeze\" >Laravel Breeze<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#ModelsMigrationsControllers\" >Models\/Migrations\/Controllers<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#Models\" >Models<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#Migrations\" >Migrations<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#Controllers\" >Controllers<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#deployment\" >deployment<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#steps_on_server\" >steps on server<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#env\" >.env<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#maintenance_mode\" >maintenance mode<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#folder_structure\" >folder structure<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#Request_Lifecycle\" >Request Lifecycle<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#some_useful_commands\" >some useful commands<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#speed_up\" >speed up<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#clean_up\" >clean up<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#Laravel_Sail_Docker_Environment\" >Laravel Sail Docker Environment<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/olkn.myvnc.com\/?p=849\/#VSCode\" >VSCode<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"laravel_with_sail\"><\/span>laravel with sail<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"basics\"><\/span>basics<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>install docker compose with specific commands of the system it is used on<\/li>\n<li>install composer locally: wget https:\/\/getcomposer.org\/installer<\/li>\n<li>install sail (docker environment for laravel): curl -s &#8220;https:\/\/laravel.build\/project-name?with=mysql,selenium,mailhog,redis&#8221; | bash<\/li>\n<li>check for local and forward ports for docker in file .env and add available ports\n<ul>\n<li>(APP_PORT=38080<br>\nFORWARD_DB_PORT=33306<br>\nFORWARD_REDIS_PORT=36379<br>\nFORWARD_MEILISEARCH_PORT=37700<br>\nFORWARD_MAILHOG_PORT=31025<br>\nFORWARD_MAILHOG_DASHBOARD_PORT=38025)<\/li>\n<\/ul>\n<\/li>\n<li>start docker environment in background: .\/vendor\/bin\/sail up -d<\/li>\n<li>new app may be accessed via http:\/\/localhost:port<\/li>\n<li>stop the server again: sail down<\/li>\n<\/ul>\n<p>command alias: <code> alias sail='[ -f sail ] &amp;&amp; sh sail || sh vendor\/bin\/sail'<\/code><\/p>\n<h4><span class=\"ez-toc-section\" id=\"Proxy\"><\/span>Proxy<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>in App\\Http\\Middleware\\TrustProxies the protected variable $proxies must be changed to:<\/p>\n<p>protected $proxies = [&#8216;127.0.0.1&#8217;];<\/p>\n<h3><span class=\"ez-toc-section\" id=\"git\"><\/span>git<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>initialize git repo in current folder: git init<\/li>\n<li>git remote add laravel ssh:\/\/git@olkn.myvnc.com\/home\/git\/repo-laravel-dev.git<\/li>\n<li>.gitignore to list all files that should not be included in git repo (sail automatically generates the file)<\/li>\n<li>add files to staging: git add -A<\/li>\n<li>commit changes to repo: git commit -m \u201ccomment\u201c<\/li>\n<li>push changes to remote repo: git push laravel<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Laravel_Breeze\"><\/span>Laravel Breeze<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>install the breeze packages to start of with: sail composer require laravel\/breeze &#8211;dev<\/li>\n<li>install blade frontend with breeze: sail php artisan breeze:install blade (complete template including user authentication)<\/li>\n<li>compile CSS and refresh browser: sail npm run dev<\/li>\n<li>migrate data base: sail php artisan migrate<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"ModelsMigrationsControllers\"><\/span>Models\/Migrations\/Controllers<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><code>sail php artisan make:model -mrc <\/code><\/p>\n<h4><span class=\"ez-toc-section\" id=\"Models\"><\/span>Models<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>interface to the tables in the data base; eloquent model<\/p>\n<p><code>app\/Models\/.php<\/code><\/p>\n<h4><span class=\"ez-toc-section\" id=\"Migrations\"><\/span>Migrations<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>create and modify tables in data base<\/p>\n<p><code>database\/migrations\/_create__tables.php<\/code><\/p>\n<h4><span class=\"ez-toc-section\" id=\"Controllers\"><\/span>Controllers<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>processing requests towards application and returning responses<\/p>\n<p><code>app\/Http\/Controller\/Controller.php<\/code><\/p>\n<h1><span class=\"ez-toc-section\" id=\"deployment\"><\/span>deployment<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<h2><span class=\"ez-toc-section\" id=\"steps_on_server\"><\/span>steps on server<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>git clone serverAddressAndFolder<\/li>\n<li>point web server root to folder public<\/li>\n<li>modify\/update .env file<\/li>\n<li>php artisan key:generate &#8211; generates APP_KEY in .env file<\/li>\n<li>php artisan migrate &#8211; migrate the data base schema<\/li>\n<li>php artisan db:seed &#8211; if you want to seed your data base<\/li>\n<li>php artisan down &#8211; shut website down for maintenance<\/li>\n<li>git pull &#8211; pull latest git files to server<\/li>\n<li>composer install &#8211; to check for any necessary updates from composer.lock file<\/li>\n<li>php artisan migrate &#8211; migrate the data base schema<\/li>\n<li>systemctl restart apache2 &#8211; to kill any php session<\/li>\n<li>php artisan queue:restart &#8211; to enable and restart any queues<\/li>\n<li>php artisan cache:clear &#8211; clear cache<\/li>\n<li>php artisan up &#8211; start laravel website again<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"env\"><\/span>.env<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>php artisan config:cache enable caching of env in production environment<\/p>\n<p><code><br>\nAPP_DEBUG = true for development only<br>\nAPP_EMV=staging for development server<br>\nAPP_URL=http:\/\/localhost - may be different for dev server<br>\nDB_CONNECTION=mysql<br>\nDB_HOST=127.0.0.1<br>\nDB_PORT=3306<br>\nDB_DATABASE=laravel<br>\nDB_USERNAME=root<br>\nDB_PASSWORD=<br>\n<\/code><\/p>\n<h2><span class=\"ez-toc-section\" id=\"maintenance_mode\"><\/span>maintenance mode<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>php artisan down #enable maintenance<\/p>\n<p>php artisan up #disable maintenance<\/p>\n<h2><span class=\"ez-toc-section\" id=\"folder_structure\"><\/span>folder structure<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>app &#8211; core code\n<ul>\n<li>Broadcasting &#8211; broadcast channel classes<\/li>\n<li>Console &#8211; custom artisan commands<\/li>\n<li>Events &#8211; event classes<\/li>\n<li>Exceptions &#8211; app exceptions handlers<\/li>\n<li>Http &#8211; controllers and middleware<\/li>\n<li>Jobs &#8211; queueable jobs<\/li>\n<li>Listeners &#8211; classes that handle events<\/li>\n<li>Mail &#8211; email classes<\/li>\n<li>Models &#8211; eloquent model classes<\/li>\n<li>Notifications &#8211; transactional notifications<\/li>\n<li>Policies &#8211; authorization policy classes<\/li>\n<li>Providers &#8211; service provider classes<\/li>\n<li>Rules &#8211; custom validation rules<\/li>\n<\/ul>\n<\/li>\n<li>bootstrap &#8211; app.php to bootstrap the framework<\/li>\n<li>config<\/li>\n<li>database &#8211; database migrations, model factories and seeds<\/li>\n<li>lang &#8211; language files<\/li>\n<li>public &#8211; index.php as entry point<\/li>\n<li>resources &#8211; all views and raw assets (CSS, JavaScript)<\/li>\n<li>routes &#8211; all route definitions<\/li>\n<li>storage &#8211; logs, compiled Blade templates, session files, file caches<\/li>\n<li>tests &#8211; automated tests<\/li>\n<li>vendor &#8211; composer dependencies<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Request_Lifecycle\"><\/span>Request Lifecycle<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><a href=\"https:\/\/olkn.myvnc.com\/wp-content\/uploads\/2022\/10\/Bildschirmfoto-2022-10-24-um-16.11.27.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-853\" src=\"https:\/\/olkn.myvnc.com\/wp-content\/uploads\/2022\/10\/Bildschirmfoto-2022-10-24-um-16.11.27-300x36.png\" alt=\"\" width=\"300\" height=\"36\" srcset=\"https:\/\/olkn.myvnc.com\/wp-content\/uploads\/2022\/10\/Bildschirmfoto-2022-10-24-um-16.11.27-300x36.png 300w, https:\/\/olkn.myvnc.com\/wp-content\/uploads\/2022\/10\/Bildschirmfoto-2022-10-24-um-16.11.27-1024x123.png 1024w, https:\/\/olkn.myvnc.com\/wp-content\/uploads\/2022\/10\/Bildschirmfoto-2022-10-24-um-16.11.27-768x92.png 768w, https:\/\/olkn.myvnc.com\/wp-content\/uploads\/2022\/10\/Bildschirmfoto-2022-10-24-um-16.11.27-1536x184.png 1536w, https:\/\/olkn.myvnc.com\/wp-content\/uploads\/2022\/10\/Bildschirmfoto-2022-10-24-um-16.11.27-2048x246.png 2048w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<h2><span class=\"ez-toc-section\" id=\"some_useful_commands\"><\/span>some useful commands<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>sail shell (access a shel within the docker container)<\/li>\n<li>sail root-shell<\/li>\n<li>.\/vendor\/bin\/sail php &#8211;version<\/li>\n<li>.\/vendor\/bin\/sail artisan &#8211;version<\/li>\n<li>.\/vendor\/bin\/sail composer &#8211;version<\/li>\n<li>.\/vendor\/bin\/sail npm &#8211;version<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"speed_up\"><\/span>speed up<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>php artisan config:cache<\/li>\n<li>php artisan route:cache<\/li>\n<li>php artisan optimize &#8211;force<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"clean_up\"><\/span>clean up<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>php artisan config:clear<\/li>\n<li>php artisan route:clear<\/li>\n<li>php artisan view:clear<\/li>\n<\/ul>\n<h1><span class=\"ez-toc-section\" id=\"Laravel_Sail_Docker_Environment\"><\/span> Laravel Sail Docker Environment <span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>vendor\/laravel\/sail\/runtimes\/8.2\/Dockerfile<br>\n<code><br>\nFROM ubuntu:22.04<\/code><\/p><code>\n<p>LABEL maintainer=\"Taylor Otwell\"<\/p>\n<p>ARG WWWGROUP<br>\nARG NODE_VERSION=16<br>\nARG POSTGRES_VERSION=14<\/p>\n<p>WORKDIR \/var\/www\/html<\/p>\n<p>ENV DEBIAN_FRONTEND noninteractive<br>\nENV TZ=UTC<\/p>\n<p>RUN ln -snf \/usr\/share\/zoneinfo\/$TZ \/etc\/localtime &amp;&amp; echo $TZ &gt; \/etc\/timezone<\/p>\n<p>RUN apt-get update \\<br>\n    &amp;&amp; apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 \\<br>\n    &amp;&amp; mkdir -p ~\/.gnupg \\<br>\n    &amp;&amp; chmod 600 ~\/.gnupg \\<br>\n    &amp;&amp; echo \"disable-ipv6\" &gt;&gt; ~\/.gnupg\/dirmngr.conf \\<br>\n    &amp;&amp; echo \"keyserver hkp:\/\/keyserver.ubuntu.com:80\" &gt;&gt; ~\/.gnupg\/dirmngr.conf \\<br>\n    &amp;&amp; gpg --recv-key 0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c \\<br>\n    &amp;&amp; gpg --export 0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c &gt; \/usr\/share\/keyrings\/ppa_ondrej_php.gpg \\<br>\n    &amp;&amp; echo \"deb [signed-by=\/usr\/share\/keyrings\/ppa_ondrej_php.gpg] https:\/\/ppa.launchpadcontent.net\/ondrej\/php\/ubuntu jammy main\" &gt; \/etc\/apt\/sources.list.d\/ppa_ondrej_php.list \\<br>\n    &amp;&amp; apt-get update \\<br>\n    &amp;&amp; apt-get install -y php8.2-cli php8.2-dev \\<br>\n       php8.2-pgsql php8.2-sqlite3 php8.2-gd \\<br>\n       php8.2-curl \\<br>\n       php8.2-imap php8.2-mysql php8.2-mbstring \\<br>\n       php8.2-xml php8.2-zip php8.2-bcmath php8.2-soap \\<br>\n       php8.2-intl php8.2-readline \\<br>\n       php8.2-ldap \\<br>\n    #    php8.2-msgpack php8.2-igbinary php8.2-redis php8.2-swoole \\<br>\n    #    php8.2-memcached php8.2-pcov php8.2-xdebug \\<br>\n    &amp;&amp; php -r \"readfile('https:\/\/getcomposer.org\/installer');\" | php -- --install-dir=\/usr\/bin\/ --filename=composer \\<br>\n    &amp;&amp; curl -sLS https:\/\/deb.nodesource.com\/setup_$NODE_VERSION.x | bash - \\<br>\n    &amp;&amp; apt-get install -y nodejs \\<br>\n    &amp;&amp; npm install -g npm \\<br>\n    &amp;&amp; curl -sS https:\/\/dl.yarnpkg.com\/debian\/pubkey.gpg | gpg --dearmor | tee \/usr\/share\/keyrings\/yarn.gpg &gt;\/dev\/null \\<br>\n    &amp;&amp; echo \"deb [signed-by=\/usr\/share\/keyrings\/yarn.gpg] https:\/\/dl.yarnpkg.com\/debian\/ stable main\" &gt; \/etc\/apt\/sources.list.d\/yarn.list \\<br>\n    &amp;&amp; curl -sS https:\/\/www.postgresql.org\/media\/keys\/ACCC4CF8.asc | gpg --dearmor | tee \/usr\/share\/keyrings\/pgdg.gpg &gt;\/dev\/null \\<br>\n    &amp;&amp; echo \"deb [signed-by=\/usr\/share\/keyrings\/pgdg.gpg] http:\/\/apt.postgresql.org\/pub\/repos\/apt jammy-pgdg main\" &gt; \/etc\/apt\/sources.list.d\/pgdg.list \\<br>\n    &amp;&amp; apt-get update \\<br>\n    &amp;&amp; apt-get install -y yarn \\<br>\n    &amp;&amp; apt-get install -y mysql-client \\<br>\n    &amp;&amp; apt-get install -y postgresql-client-$POSTGRES_VERSION \\<br>\n    &amp;&amp; apt-get -y autoremove \\<br>\n    &amp;&amp; apt-get clean \\<br>\n    &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/* \/tmp\/* \/var\/tmp\/*<\/p>\n<p>RUN setcap \"cap_net_bind_service=+ep\" \/usr\/bin\/php8.2<\/p>\n<p>RUN groupadd --force -g $WWWGROUP sail<br>\nRUN useradd -ms \/bin\/bash --no-user-group -g $WWWGROUP -u 1337 sail<\/p>\n<p>COPY start-container \/usr\/local\/bin\/start-container<br>\nCOPY supervisord.conf \/etc\/supervisor\/conf.d\/supervisord.conf<br>\nCOPY php.ini \/etc\/php\/8.2\/cli\/conf.d\/99-sail.ini<br>\nRUN chmod +x \/usr\/local\/bin\/start-container<\/p>\n<p>EXPOSE 8000<\/p>\n<\/code><p><code>ENTRYPOINT [\"start-container\"]<br>\n<\/code><\/p>\n<p>.\/docker-compose.yml<br>\n<code><br>\n# For more information: https:\/\/laravel.com\/docs\/sail<br>\nversion: '3'<br>\nservices:<br>\n    laravel.test:<br>\n        build:<br>\n            context: .\/vendor\/laravel\/sail\/runtimes\/8.1<br>\n            dockerfile: Dockerfile<br>\n            args:<br>\n                WWWGROUP: '${WWWGROUP}'<br>\n        image: sail-8.1\/app<br>\n        extra_hosts:<br>\n            - 'host.docker.internal:host-gateway'<br>\n        ports:<br>\n            - '${APP_PORT:-80}:80'<br>\n            - '${VITE_PORT:-5173}:${VITE_PORT:-5173}'<br>\n        environment:<br>\n            WWWUSER: '${WWWUSER}'<br>\n            LARAVEL_SAIL: 1<br>\n            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'<br>\n            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'<br>\n        volumes:<br>\n            - '.:\/var\/www\/html'<br>\n        networks:<br>\n            - sail<br>\n        depends_on:<br>\n            - mysql<br>\n            - mailhog<br>\n            - selenium<br>\n    mysql:<br>\n        image: 'mysql\/mysql-server:8.0'<br>\n        ports:<br>\n            - '${FORWARD_DB_PORT:-3306}:3306'<br>\n        environment:<br>\n            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'<br>\n            MYSQL_ROOT_HOST: \"%\"<br>\n            MYSQL_DATABASE: '${DB_DATABASE}'<br>\n            MYSQL_USER: '${DB_USERNAME}'<br>\n            MYSQL_PASSWORD: '${DB_PASSWORD}'<br>\n            MYSQL_ALLOW_EMPTY_PASSWORD: 1<br>\n        volumes:<br>\n            - 'sail-mysql:\/var\/lib\/mysql'<br>\n            - '.\/vendor\/laravel\/sail\/database\/mysql\/create-testing-database.sh:\/docker-entrypoint-initdb.d\/10-create-testing-database.sh'<br>\n        networks:<br>\n            - sail<br>\n        healthcheck:<br>\n            test: [\"CMD\", \"mysqladmin\", \"ping\", \"-p${DB_PASSWORD}\"]<br>\n            retries: 3<br>\n            timeout: 5s<br>\n    mailhog:<br>\n        image: 'mailhog\/mailhog:latest'<br>\n        ports:<br>\n            - '${FORWARD_MAILHOG_PORT:-1025}:1025'<br>\n            - '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'<br>\n        networks:<br>\n            - sail<br>\n    selenium:<br>\n        image: 'selenium\/standalone-chrome'<br>\n        extra_hosts:<br>\n            - 'host.docker.internal:host-gateway'<br>\n        volumes:<br>\n            - '\/dev\/shm:\/dev\/shm'<br>\n        networks:<br>\n            - sail<br>\nnetworks:<br>\n    sail:<br>\n        driver: bridge<br>\nvolumes:<br>\n    sail-mysql:<br>\n        driver: local<\/code><\/p><code>\n<\/code><p><code><\/code><\/p>\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"VSCode\"><\/span>VSCode<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Export extensions via local shell command (STRG+SHIFT+P terminal local):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>code --list-extensions | sed -e 's\/^\/code --install-extension \/' > my_vscode_extensions.sh<\/code><\/pre>\n\n\n\n<p>Import extensions via:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>bash my_vscode_extensions.sh<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>laravel with sail basics install docker compose with specific commands of the system it is used on install composer locally: wget https:\/\/getcomposer.org\/installer install sail (docker environment for laravel): curl -s &#8220;https:\/\/laravel.build\/project-name?with=mysql,selenium,mailhog,redis&#8221; | bash check for local and forward ports for docker in file .env and add available ports (APP_PORT=38080 FORWARD_DB_PORT=33306 FORWARD_REDIS_PORT=36379 FORWARD_MEILISEARCH_PORT=37700 FORWARD_MAILHOG_PORT=31025 FORWARD_MAILHOG_DASHBOARD_PORT=38025) start &hellip; <a href=\"https:\/\/olkn.myvnc.com\/?p=849\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Laravel &#8211; development environment<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,184,24,10],"tags":[],"class_list":["post-849","post","type-post","status-publish","format-standard","hentry","category-knowledgebase","category-php-development","category-programming","category-sniplets"],"_links":{"self":[{"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=\/wp\/v2\/posts\/849","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=849"}],"version-history":[{"count":35,"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=\/wp\/v2\/posts\/849\/revisions"}],"predecessor-version":[{"id":944,"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=\/wp\/v2\/posts\/849\/revisions\/944"}],"wp:attachment":[{"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=849"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=849"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/olkn.myvnc.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=849"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}