<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: aeweda</title>
    <description>The latest articles on Forem by aeweda (@aeweda).</description>
    <link>https://forem.com/aeweda</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F642327%2F9ae5cd49-91fa-4fcf-861e-74ffcaf593bc.jpeg</url>
      <title>Forem: aeweda</title>
      <link>https://forem.com/aeweda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/aeweda"/>
    <language>en</language>
    <item>
      <title>Create a Laravel &amp; Any Front-end Development Stack🐱‍🏍</title>
      <dc:creator>aeweda</dc:creator>
      <pubDate>Sat, 05 Jun 2021 20:33:31 +0000</pubDate>
      <link>https://forem.com/aeweda/create-a-laravel-any-front-end-development-stack-3i53</link>
      <guid>https://forem.com/aeweda/create-a-laravel-any-front-end-development-stack-3i53</guid>
      <description>&lt;h2&gt;
  
  
  Table Of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;Requirements&lt;/li&gt;
&lt;li&gt;Preparing Laravel Backend Api&lt;/li&gt;
&lt;li&gt;Folder Structure&lt;/li&gt;
&lt;li&gt;Choosing Your Favorite Front-end&lt;/li&gt;
&lt;li&gt;.env As a Blueprint&lt;/li&gt;
&lt;li&gt;Preparing Docker Images&lt;/li&gt;
&lt;li&gt;php, php-fpm config&lt;/li&gt;
&lt;li&gt;nginx Config&lt;/li&gt;
&lt;li&gt;Connecting Everything&lt;/li&gt;
&lt;li&gt;Create The init Script&lt;/li&gt;
&lt;li&gt;Create a CLI&lt;/li&gt;
&lt;li&gt;Create The Repo&lt;/li&gt;
&lt;li&gt;Improvements&lt;/li&gt;
&lt;li&gt;TL;DR&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Introduction &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;The purpose of this guide is to make your application as easy as possible to self deploy on the developers side without them bothering with installing mysql, nginx, and a ton of stuff just to start doing what they do best.&lt;/p&gt;




&lt;h3&gt;
  
  
  Requirements &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Before we start, we're gonna need a few dependencies to get this project underway&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Docker&lt;br&gt;
Docker-Compose&lt;br&gt;
Node/npm&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To install Docker &amp;amp; Docker-Compose simply use the following commands&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Docker&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://get.docker.com &lt;span class="nt"&gt;-o&lt;/span&gt; get-docker.sh
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;sh get-docker.sh
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;groupadd docker
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;newgrp docker
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; get-docker.sh
&lt;span class="c"&gt;# Install Docker-Compose&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/docker/compose/releases/download/1.29.2/docker-compose-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/local/bin/docker-compose
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x /usr/local/bin/docker-compose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or look them up yourself on the official Docker Documentation &lt;a href="https://docs.docker.com/engine/install/"&gt;Install Docker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For npm go with nvm for ease of use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;NVM_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;XDG_CONFIG_HOME&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; %s &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.nvm"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; %s &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;XDG_CONFIG_HOME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/nvm"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NVM_DIR&lt;/span&gt;&lt;span class="s2"&gt;/nvm.sh"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NVM_DIR&lt;/span&gt;&lt;span class="s2"&gt;/nvm.sh"&lt;/span&gt; &lt;span class="c"&gt;# This loads nvm&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;nvm &lt;span class="nb"&gt;install &lt;/span&gt;node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Preparing Laravel Backend Api &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Rather than go through all the hassle of installing php/composer and running the composer command to generate the laravel project you can simply use the following command to create the laravel project&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://laravel.build/folder-name | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice: &lt;code&gt;Change folder-name in the command with any folder name you'd like&lt;/code&gt;&lt;br&gt;
Lets delete the package.json file in the root directory since we are not gonna be using it&lt;/p&gt;


&lt;h3&gt;
  
  
  Folder Structure &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;add the missing folders from the following structure and leave them empty for now&lt;br&gt;
.&lt;br&gt;
├── tools&lt;br&gt;
│   ├── dockerfiles&lt;br&gt;
│   │   ├── ci&lt;br&gt;
│   │   ├── dev-images&lt;br&gt;
│   │   └── prod-images&lt;br&gt;
│   └── scripts&lt;br&gt;
│   │   ├── ci&lt;br&gt;
│   │   ├── local&lt;br&gt;
├── app&lt;br&gt;
├── bootstrap&lt;br&gt;
├── config&lt;br&gt;
├── database&lt;br&gt;
├── public&lt;br&gt;
├── resources&lt;br&gt;
├── routes&lt;br&gt;
├── server&lt;br&gt;
│   └── config&lt;br&gt;
├── storage&lt;br&gt;
├── tests&lt;br&gt;
├── client&lt;br&gt;
└── vendor&lt;/p&gt;


&lt;h3&gt;
  
  
  Choosing Your Favorite Front-end &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Or as people say "Pick your poison"&lt;br&gt;
Any of the big 3 will do fine here&lt;/p&gt;

&lt;p&gt;lets go with vue.js, inside the root folder run the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @vue/cli
&lt;span class="nv"&gt;$ &lt;/span&gt;vue create client &lt;span class="c"&gt;# You can use `vue ui` as an alternative to the cli to generate an interface and guide you through the steps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now you're gonna be greeted with a lot of options to choose from, those are entirely up to you &lt;code&gt;choose with the space bar&lt;/code&gt; and I recommend having vuex router&lt;/p&gt;

&lt;p&gt;notice: (At the current time of writing!) avoid choosing a unit/e2e/node-sass preprocessor with typescript as it can have some build problems / errors, simply install those after you finish compiling the project with npm like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;jest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in case the project is created with a repo simply do a&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; client/.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively you can follow the official guide yourself on &lt;a href="https://v3.vuejs.org/guide/installation.html"&gt;vue.js&lt;/a&gt; or go with React or Angular(urgh)&lt;/p&gt;




&lt;h3&gt;
  
  
  Preparing Docker Images&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Okay now for the fun part, lets start creating the images the application will use&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend image&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;in &lt;code&gt;tools/dockerfiles/dev-images/&lt;/code&gt; create &lt;code&gt;backend.dockerfile&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# ! Image&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; php:8.0.6-fpm-alpine3.12&lt;/span&gt;

&lt;span class="c"&gt;# ? Set Working Directory&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /var/www/html&lt;/span&gt;

&lt;span class="c"&gt;# ? Install Mysql Extensions&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;docker-php-ext-install pdo pdo_mysql

&lt;span class="c"&gt;# ? Install and enable PHP Redis extension&lt;/span&gt;
&lt;span class="c"&gt;# ? Redis extension is not provided with the PHP Source&lt;/span&gt;
&lt;span class="c"&gt;# ? pecl install will download and compile redis&lt;/span&gt;
&lt;span class="c"&gt;# ? docker-php-ext-enable will enable it&lt;/span&gt;
&lt;span class="c"&gt;# ? finally apk del to maintain a small image size&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apk add &lt;span class="nt"&gt;--no-cache&lt;/span&gt; &lt;span class="nt"&gt;--virtual&lt;/span&gt; .build-deps &lt;span class="nv"&gt;$PHPIZE_DEPS&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pecl &lt;span class="nb"&gt;install &lt;/span&gt;redis-5.3.4 &lt;span class="se"&gt;\
&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker-php-ext-enable redis &lt;span class="se"&gt;\
&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apk del .build-deps

&lt;span class="c"&gt;# ? Install &amp;amp; Configure gd&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apk add &lt;span class="nt"&gt;--no-cache&lt;/span&gt; freetype libpng libjpeg-turbo freetype-dev libpng-dev libjpeg-turbo-dev &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;  docker-php-ext-configure gd &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nt"&gt;--with-freetype&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nt"&gt;--with-jpeg&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="nv"&gt;NPROC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; ^processor /proc/cpuinfo 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; 1&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;  docker-php-ext-install &lt;span class="nt"&gt;-j&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; gd &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;  apk del &lt;span class="nt"&gt;--no-cache&lt;/span&gt; freetype-dev libpng-dev libjpeg-turbo-dev

&lt;span class="c"&gt;# ? Install git (required by Composer)&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apk add git

&lt;span class="c"&gt;# *** Install Composer&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;php &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"readfile('http://getcomposer.org/installer');"&lt;/span&gt; | php &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--install-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/ &lt;span class="nt"&gt;--filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;composer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Client image&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;in &lt;code&gt;tools/dockerfiles/dev-images/&lt;/code&gt; create &lt;code&gt;client.dockerfile&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# ! Image&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:14-alpine&lt;/span&gt;

&lt;span class="c"&gt;# ? Set Working Directory&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /var/www/client&lt;/span&gt;

&lt;span class="c"&gt;# * Install PM2 to serve the app&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;pm2 &lt;span class="nt"&gt;-g&lt;/span&gt;

&lt;span class="c"&gt;# ? Serve the application on start&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; command pm2 serve ./dist/ 8080 --spa --watch &amp;amp;&amp;amp; pm2 log&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;those are the images we'll need for now&lt;/p&gt;




&lt;h3&gt;
  
  
  php &amp;amp; php-fpm config&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;whether or not you want to change something in &lt;code&gt;php.ini&lt;/code&gt; or &lt;code&gt;www.conf&lt;/code&gt; you should at least have them exposed in case you wanna edit them later&lt;br&gt;
we'll do that by creating them and linking them inside the containers&lt;/p&gt;

&lt;p&gt;in &lt;code&gt;server/config&lt;/code&gt; create &lt;code&gt;php.ini&lt;/code&gt; &amp;amp; &lt;code&gt;www.conf&lt;/code&gt; files and paste the following gist content accordingly&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gist.github.com/aeweda/b169a48d9c885e22ff19b43baa359c78"&gt;php.ini&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gist.github.com/aeweda/e216e6a676d3a9b3dfe4fd5653c854a4"&gt;www.conf&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  nginx Config&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;We are going to need a self signed certificate, inside the project's root directory run the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;openssl req &lt;span class="nt"&gt;-x509&lt;/span&gt; &lt;span class="nt"&gt;-nodes&lt;/span&gt; &lt;span class="nt"&gt;-days&lt;/span&gt; 365 &lt;span class="nt"&gt;-newkey&lt;/span&gt; rsa:2048 &lt;span class="nt"&gt;-keyout&lt;/span&gt; ./server/key.pem &lt;span class="nt"&gt;-out&lt;/span&gt; ./server/cert.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;notice: skip all the prompts with enter&lt;br&gt;
once generated, lets open up &lt;code&gt;key.pem&lt;/code&gt; permissions so that we can add it to the repo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;644 server/key.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for nginx config, create a &lt;code&gt;default.conf&lt;/code&gt; file inside the server folder and paste the following content&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;server&lt;/span&gt;
{
    &lt;span class="c"&gt;# Listen To HTTPS port
&lt;/span&gt;    &lt;span class="n"&gt;listen&lt;/span&gt;                  &lt;span class="m"&gt;443&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt; &lt;span class="n"&gt;http2&lt;/span&gt;;
    &lt;span class="n"&gt;listen&lt;/span&gt;                  [::]:&lt;span class="m"&gt;443&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt; &lt;span class="n"&gt;http2&lt;/span&gt;;

    &lt;span class="c"&gt;# Define Domain Name
&lt;/span&gt;    &lt;span class="n"&gt;server_name&lt;/span&gt;             &lt;span class="n"&gt;localhost&lt;/span&gt;;
    &lt;span class="n"&gt;server_tokens&lt;/span&gt;           &lt;span class="n"&gt;off&lt;/span&gt;;

    &lt;span class="c"&gt;# Security Headers
&lt;/span&gt;    &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;-&lt;span class="n"&gt;Frame&lt;/span&gt;-&lt;span class="n"&gt;Options&lt;/span&gt;              &lt;span class="s2"&gt;"SAMEORIGIN"&lt;/span&gt;;
    &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;-&lt;span class="n"&gt;XSS&lt;/span&gt;-&lt;span class="n"&gt;Protection&lt;/span&gt;             &lt;span class="s2"&gt;"1; mode=block"&lt;/span&gt;;
    &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;-&lt;span class="n"&gt;Content&lt;/span&gt;-&lt;span class="n"&gt;Type&lt;/span&gt;-&lt;span class="n"&gt;Options&lt;/span&gt;       &lt;span class="s2"&gt;"nosniff"&lt;/span&gt;;
    &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="n"&gt;Referrer&lt;/span&gt;-&lt;span class="n"&gt;Policy&lt;/span&gt;              &lt;span class="s2"&gt;"no-referrer-when-downgrade"&lt;/span&gt; &lt;span class="n"&gt;always&lt;/span&gt;;
    &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="n"&gt;Content&lt;/span&gt;-&lt;span class="n"&gt;Security&lt;/span&gt;-&lt;span class="n"&gt;Policy&lt;/span&gt;      &lt;span class="s2"&gt;"default-src 'self' http: https: data: blob: 'unsafe-inline' 'unsafe-eval'; connect-src https: wss:"&lt;/span&gt; &lt;span class="n"&gt;always&lt;/span&gt;;
    &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="n"&gt;Strict&lt;/span&gt;-&lt;span class="n"&gt;Transport&lt;/span&gt;-&lt;span class="n"&gt;Security&lt;/span&gt;    &lt;span class="s2"&gt;"max-age=31536000; includeSubDomains"&lt;/span&gt; &lt;span class="n"&gt;always&lt;/span&gt;;

    &lt;span class="c"&gt;# Index Fallback
&lt;/span&gt;    &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;htm&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;;

    &lt;span class="c"&gt;# Default Charset
&lt;/span&gt;    &lt;span class="n"&gt;charset&lt;/span&gt; &lt;span class="n"&gt;utf&lt;/span&gt;-&lt;span class="m"&gt;8&lt;/span&gt;;

    &lt;span class="c"&gt;# Redirect Everything to Front-end
&lt;/span&gt;    &lt;span class="n"&gt;location&lt;/span&gt; / {
        &lt;span class="n"&gt;proxy_pass&lt;/span&gt;                    &lt;span class="n"&gt;http&lt;/span&gt;://&lt;span class="n"&gt;client&lt;/span&gt;:&lt;span class="m"&gt;8080&lt;/span&gt;/;
        &lt;span class="n"&gt;proxy_redirect&lt;/span&gt;                &lt;span class="n"&gt;off&lt;/span&gt;;
        &lt;span class="n"&gt;proxy_set_header&lt;/span&gt;              &lt;span class="n"&gt;Host&lt;/span&gt; $&lt;span class="n"&gt;host&lt;/span&gt;;
        &lt;span class="n"&gt;proxy_set_header&lt;/span&gt;              &lt;span class="n"&gt;X&lt;/span&gt;-&lt;span class="n"&gt;Real&lt;/span&gt;-&lt;span class="n"&gt;IP&lt;/span&gt; $&lt;span class="n"&gt;remote_addr&lt;/span&gt;;
        &lt;span class="n"&gt;proxy_set_header&lt;/span&gt;              &lt;span class="n"&gt;X&lt;/span&gt;-&lt;span class="n"&gt;Forwarded&lt;/span&gt;-&lt;span class="n"&gt;For&lt;/span&gt; $&lt;span class="n"&gt;proxy_add_x_forwarded_for&lt;/span&gt;;
        &lt;span class="n"&gt;proxy_set_header&lt;/span&gt;              &lt;span class="n"&gt;X&lt;/span&gt;-&lt;span class="n"&gt;Forwarded&lt;/span&gt;-&lt;span class="n"&gt;Host&lt;/span&gt; $&lt;span class="n"&gt;server_name&lt;/span&gt;;
    }

    &lt;span class="c"&gt;# Redirect everything after /api/ to Backend
&lt;/span&gt;    &lt;span class="n"&gt;location&lt;/span&gt; /&lt;span class="n"&gt;api&lt;/span&gt;/ {
        &lt;span class="n"&gt;try_files&lt;/span&gt; $&lt;span class="n"&gt;uri&lt;/span&gt; $&lt;span class="n"&gt;uri&lt;/span&gt;/ &lt;span class="n"&gt;public&lt;/span&gt;/&lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;?$&lt;span class="n"&gt;query_string&lt;/span&gt;;
    }

    &lt;span class="c"&gt;# Handle PHP Files
&lt;/span&gt;    &lt;span class="n"&gt;location&lt;/span&gt; ~ \.&lt;span class="n"&gt;php&lt;/span&gt;$ {
        &lt;span class="n"&gt;fastcgi_pass&lt;/span&gt;                  &lt;span class="n"&gt;backend&lt;/span&gt;:&lt;span class="m"&gt;9000&lt;/span&gt;;
        &lt;span class="n"&gt;fastcgi_index&lt;/span&gt;                 &lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;;
        &lt;span class="n"&gt;fastcgi_buffers&lt;/span&gt;               &lt;span class="m"&gt;8&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;;
        &lt;span class="n"&gt;fastcgi_buffer_size&lt;/span&gt;           &lt;span class="m"&gt;32&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;;
        &lt;span class="n"&gt;fastcgi_param&lt;/span&gt;                 &lt;span class="n"&gt;SCRIPT_FILENAME&lt;/span&gt; $&lt;span class="n"&gt;realpath_root&lt;/span&gt;$&lt;span class="n"&gt;fastcgi_script_name&lt;/span&gt;;
        &lt;span class="n"&gt;fastcgi_hide_header&lt;/span&gt;           &lt;span class="n"&gt;X&lt;/span&gt;-&lt;span class="n"&gt;Powered&lt;/span&gt;-&lt;span class="n"&gt;By&lt;/span&gt;;
        &lt;span class="n"&gt;include&lt;/span&gt;                       &lt;span class="n"&gt;fastcgi_params&lt;/span&gt;;
    }

    &lt;span class="c"&gt;###################### Content #########################
&lt;/span&gt;
    &lt;span class="c"&gt;# Deny Access to Files
&lt;/span&gt;    &lt;span class="n"&gt;location&lt;/span&gt; ~ /\.(?!&lt;span class="n"&gt;well&lt;/span&gt;-&lt;span class="n"&gt;known&lt;/span&gt;).* {
        &lt;span class="n"&gt;deny&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;;
    }

    &lt;span class="c"&gt;# robots.txt
&lt;/span&gt;    &lt;span class="n"&gt;location&lt;/span&gt; = /&lt;span class="n"&gt;robots&lt;/span&gt;.&lt;span class="n"&gt;txt&lt;/span&gt; {
        &lt;span class="n"&gt;log_not_found&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;;
        &lt;span class="n"&gt;access_log&lt;/span&gt;    &lt;span class="n"&gt;off&lt;/span&gt;;
    }

    &lt;span class="c"&gt;######################## Compression ####################
&lt;/span&gt;
    &lt;span class="c"&gt;# Add global gzip compression to all other files
&lt;/span&gt;    &lt;span class="n"&gt;gzip&lt;/span&gt;                &lt;span class="n"&gt;on&lt;/span&gt;;
    &lt;span class="n"&gt;gzip_comp_level&lt;/span&gt;     &lt;span class="m"&gt;5&lt;/span&gt;;
    &lt;span class="n"&gt;gzip_min_length&lt;/span&gt;     &lt;span class="m"&gt;256&lt;/span&gt;;
    &lt;span class="n"&gt;gzip_proxied&lt;/span&gt;        &lt;span class="n"&gt;any&lt;/span&gt;;
    &lt;span class="n"&gt;gzip_vary&lt;/span&gt;           &lt;span class="n"&gt;on&lt;/span&gt;;
    &lt;span class="n"&gt;gzip_types&lt;/span&gt;
        &lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;atom&lt;/span&gt;+&lt;span class="n"&gt;xml&lt;/span&gt;
        &lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;javascript&lt;/span&gt;
        &lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;json&lt;/span&gt;
        &lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;ld&lt;/span&gt;+&lt;span class="n"&gt;json&lt;/span&gt;
        &lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;manifest&lt;/span&gt;+&lt;span class="n"&gt;json&lt;/span&gt;
        &lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;rss&lt;/span&gt;+&lt;span class="n"&gt;xml&lt;/span&gt;
        &lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;vnd&lt;/span&gt;.&lt;span class="n"&gt;geo&lt;/span&gt;+&lt;span class="n"&gt;json&lt;/span&gt;
        &lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;vnd&lt;/span&gt;.&lt;span class="n"&gt;ms&lt;/span&gt;-&lt;span class="n"&gt;fontobject&lt;/span&gt;
        &lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;x&lt;/span&gt;-&lt;span class="n"&gt;font&lt;/span&gt;-&lt;span class="n"&gt;ttf&lt;/span&gt;
        &lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;x&lt;/span&gt;-&lt;span class="n"&gt;web&lt;/span&gt;-&lt;span class="n"&gt;app&lt;/span&gt;-&lt;span class="n"&gt;manifest&lt;/span&gt;+&lt;span class="n"&gt;json&lt;/span&gt;
        &lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;xhtml&lt;/span&gt;+&lt;span class="n"&gt;xml&lt;/span&gt;
        &lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;xml&lt;/span&gt;
        &lt;span class="n"&gt;font&lt;/span&gt;/&lt;span class="n"&gt;opentype&lt;/span&gt;
        &lt;span class="n"&gt;image&lt;/span&gt;/&lt;span class="n"&gt;bmp&lt;/span&gt;
        &lt;span class="n"&gt;image&lt;/span&gt;/&lt;span class="n"&gt;svg&lt;/span&gt;+&lt;span class="n"&gt;xml&lt;/span&gt;
        &lt;span class="n"&gt;image&lt;/span&gt;/&lt;span class="n"&gt;x&lt;/span&gt;-&lt;span class="n"&gt;icon&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;/&lt;span class="n"&gt;cache&lt;/span&gt;-&lt;span class="n"&gt;manifest&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;/&lt;span class="n"&gt;css&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;/&lt;span class="n"&gt;plain&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;/&lt;span class="n"&gt;vcard&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;/&lt;span class="n"&gt;vnd&lt;/span&gt;.&lt;span class="n"&gt;rim&lt;/span&gt;.&lt;span class="n"&gt;location&lt;/span&gt;.&lt;span class="n"&gt;xloc&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;/&lt;span class="n"&gt;vtt&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;/&lt;span class="n"&gt;x&lt;/span&gt;-&lt;span class="n"&gt;component&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;/&lt;span class="n"&gt;x&lt;/span&gt;-&lt;span class="n"&gt;cross&lt;/span&gt;-&lt;span class="n"&gt;domain&lt;/span&gt;-&lt;span class="n"&gt;policy&lt;/span&gt;
        &lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;octet&lt;/span&gt;-&lt;span class="n"&gt;stream&lt;/span&gt;;

    &lt;span class="c"&gt;######################## SSL ###########################
&lt;/span&gt;
    &lt;span class="c"&gt;# SSL Certificates
&lt;/span&gt;    &lt;span class="n"&gt;ssl_certificate&lt;/span&gt;         &lt;span class="n"&gt;conf&lt;/span&gt;.&lt;span class="n"&gt;d&lt;/span&gt;/&lt;span class="n"&gt;cert&lt;/span&gt;.&lt;span class="n"&gt;pem&lt;/span&gt;;
    &lt;span class="n"&gt;ssl_certificate_key&lt;/span&gt;     &lt;span class="n"&gt;conf&lt;/span&gt;.&lt;span class="n"&gt;d&lt;/span&gt;/&lt;span class="n"&gt;key&lt;/span&gt;.&lt;span class="n"&gt;pem&lt;/span&gt;;

    &lt;span class="c"&gt;# SSL Config
&lt;/span&gt;    &lt;span class="n"&gt;ssl_session_timeout&lt;/span&gt;  &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;;
    &lt;span class="n"&gt;ssl_session_cache&lt;/span&gt;    &lt;span class="n"&gt;shared&lt;/span&gt;:&lt;span class="n"&gt;SSL&lt;/span&gt;:&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;;
    &lt;span class="n"&gt;ssl_session_tickets&lt;/span&gt;  &lt;span class="n"&gt;off&lt;/span&gt;;

    &lt;span class="c"&gt;# Mozilla Intermediate configuration
&lt;/span&gt;    &lt;span class="n"&gt;ssl_protocols&lt;/span&gt;        &lt;span class="n"&gt;TLSv1&lt;/span&gt;.&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="n"&gt;TLSv1&lt;/span&gt;.&lt;span class="m"&gt;3&lt;/span&gt;;
    &lt;span class="n"&gt;ssl_ciphers&lt;/span&gt;          &lt;span class="n"&gt;ECDHE&lt;/span&gt;-&lt;span class="n"&gt;ECDSA&lt;/span&gt;-&lt;span class="n"&gt;AES128&lt;/span&gt;-&lt;span class="n"&gt;GCM&lt;/span&gt;-&lt;span class="n"&gt;SHA256&lt;/span&gt;:&lt;span class="n"&gt;ECDHE&lt;/span&gt;-&lt;span class="n"&gt;RSA&lt;/span&gt;-&lt;span class="n"&gt;AES128&lt;/span&gt;-&lt;span class="n"&gt;GCM&lt;/span&gt;-&lt;span class="n"&gt;SHA256&lt;/span&gt;:&lt;span class="n"&gt;ECDHE&lt;/span&gt;-&lt;span class="n"&gt;ECDSA&lt;/span&gt;-&lt;span class="n"&gt;AES256&lt;/span&gt;-&lt;span class="n"&gt;GCM&lt;/span&gt;-&lt;span class="n"&gt;SHA384&lt;/span&gt;:&lt;span class="n"&gt;ECDHE&lt;/span&gt;-&lt;span class="n"&gt;RSA&lt;/span&gt;-&lt;span class="n"&gt;AES256&lt;/span&gt;-&lt;span class="n"&gt;GCM&lt;/span&gt;-&lt;span class="n"&gt;SHA384&lt;/span&gt;:&lt;span class="n"&gt;ECDHE&lt;/span&gt;-&lt;span class="n"&gt;ECDSA&lt;/span&gt;-&lt;span class="n"&gt;CHACHA20&lt;/span&gt;-&lt;span class="n"&gt;POLY1305&lt;/span&gt;:&lt;span class="n"&gt;ECDHE&lt;/span&gt;-&lt;span class="n"&gt;RSA&lt;/span&gt;-&lt;span class="n"&gt;CHACHA20&lt;/span&gt;-&lt;span class="n"&gt;POLY1305&lt;/span&gt;:&lt;span class="n"&gt;DHE&lt;/span&gt;-&lt;span class="n"&gt;RSA&lt;/span&gt;-&lt;span class="n"&gt;AES128&lt;/span&gt;-&lt;span class="n"&gt;GCM&lt;/span&gt;-&lt;span class="n"&gt;SHA256&lt;/span&gt;:&lt;span class="n"&gt;DHE&lt;/span&gt;-&lt;span class="n"&gt;RSA&lt;/span&gt;-&lt;span class="n"&gt;AES256&lt;/span&gt;-&lt;span class="n"&gt;GCM&lt;/span&gt;-&lt;span class="n"&gt;SHA384&lt;/span&gt;;
}

&lt;span class="c"&gt;# Redirect HTTP to HTTPs
&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;
{
    &lt;span class="n"&gt;listen&lt;/span&gt;                  &lt;span class="m"&gt;80&lt;/span&gt;;
    &lt;span class="n"&gt;listen&lt;/span&gt;                  [::]:&lt;span class="m"&gt;80&lt;/span&gt;;
    &lt;span class="n"&gt;server_name&lt;/span&gt;             &lt;span class="n"&gt;localhost&lt;/span&gt;;

    &lt;span class="n"&gt;location&lt;/span&gt; / {
        &lt;span class="n"&gt;return&lt;/span&gt; &lt;span class="m"&gt;301&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;://&lt;span class="n"&gt;localhost&lt;/span&gt;$&lt;span class="n"&gt;request_uri&lt;/span&gt;;
    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  .env As a Blueprint &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Before we proceed any further we must adapt the mentality of having our .env file as the true source of configurations, or at least the ones we want to mess with&lt;/p&gt;

&lt;p&gt;This will be reflected in the next steps and emphasized upon&lt;/p&gt;




&lt;h3&gt;
  
  
  Connecting Everything&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;first of all, we need to stop our front-end dev server from intercepting anything after /api/ and redirecting the traffic to nginx&lt;/p&gt;

&lt;p&gt;we can do that by modifying the &lt;code&gt;vue.config.js&lt;/code&gt; file or the file that houses your &lt;code&gt;webpack.config&lt;/code&gt;, if the file doesn't exist simply create it yourself&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BundleAnalyzerPlugin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;webpack-bundle-analyzer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BundleAnalyzerPlugin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plugins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="nx"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;BundleAnalyzerPlugin&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;analyzerMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;disabled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;devServer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;^/api&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://webserver/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;secure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8081&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;configureWebpack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;plugins&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;next we are going to need to add some variables to our &lt;code&gt;.env.example&lt;/code&gt; file to use in our docker-compose file and other stuff&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Define Application Specific Keys&lt;/span&gt;
&lt;span class="nv"&gt;APP_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Laravel
&lt;span class="nv"&gt;APP_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;local
&lt;/span&gt;&lt;span class="nv"&gt;APP_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="nv"&gt;APP_DEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
&lt;/span&gt;&lt;span class="nv"&gt;APP_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost

&lt;span class="c"&gt;# Log Channel Variables&lt;/span&gt;
&lt;span class="nv"&gt;LOG_CHANNEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;stack
&lt;span class="nv"&gt;LOG_LEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;debug

&lt;span class="c"&gt;# Database Variables&lt;/span&gt;
&lt;span class="nv"&gt;DB_CONNECTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mysql
&lt;span class="nv"&gt;DB_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;database
&lt;span class="nv"&gt;DB_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3306
&lt;span class="nv"&gt;DB_DATABASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;laravel
&lt;span class="nv"&gt;DB_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;someuser
&lt;span class="nv"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"lapassord@100"&lt;/span&gt;
&lt;span class="nv"&gt;DB_ROOT_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"password@9000"&lt;/span&gt;

&lt;span class="c"&gt;# Nginx Variables&lt;/span&gt;
&lt;span class="nv"&gt;HTTP_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;80:80
&lt;span class="nv"&gt;HTTPS_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;443:443

&lt;span class="c"&gt;# BroadCast, Queue, Session Variables&lt;/span&gt;
&lt;span class="nv"&gt;BROADCAST_DRIVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;log
&lt;span class="nv"&gt;FILESYSTEM_DRIVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;local
&lt;/span&gt;&lt;span class="nv"&gt;QUEUE_CONNECTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;sync
&lt;/span&gt;&lt;span class="nv"&gt;SESSION_DRIVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;file
&lt;span class="nv"&gt;SESSION_LIFETIME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;120

&lt;span class="c"&gt;# Cache Variables&lt;/span&gt;
&lt;span class="nv"&gt;CACHE_DRIVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;redis
&lt;span class="nv"&gt;REDIS_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;cache
&lt;span class="nv"&gt;REDIS_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;null
&lt;span class="nv"&gt;REDIS_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;6379

&lt;span class="c"&gt;# Mail Variables&lt;/span&gt;
&lt;span class="nv"&gt;MAIL_MAILER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;smtp
&lt;span class="nv"&gt;MAIL_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mailhog
&lt;span class="nv"&gt;MAIL_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1025
&lt;span class="nv"&gt;MAIL_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;null
&lt;span class="nv"&gt;MAIL_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;null
&lt;span class="nv"&gt;MAIL_ENCRYPTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;null
&lt;span class="nv"&gt;MAIL_FROM_ADDRESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;null
&lt;span class="nv"&gt;MAIL_FROM_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;APP_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Pusher Server Variables&lt;/span&gt;
&lt;span class="nv"&gt;PUSHER_APP_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="nv"&gt;PUSHER_APP_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="nv"&gt;PUSHER_APP_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="nv"&gt;PUSHER_APP_CLUSTER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mt1
&lt;span class="nv"&gt;MIX_PUSHER_APP_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PUSHER_APP_KEY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;MIX_PUSHER_APP_CLUSTER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PUSHER_APP_CLUSTER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;create the &lt;code&gt;docker-compose.yml&lt;/code&gt; file in the root directory and paste in the following content&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ! Docker-Compose Specification&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.8"&lt;/span&gt;

&lt;span class="c1"&gt;# ! Define Project Network&lt;/span&gt;
&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;StackName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="c1"&gt;# ? App Stack&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# ? Bring up Nginx After Backend and Link Volumes&lt;/span&gt;
  &lt;span class="na"&gt;webserver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:1.19.6-alpine&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webserver&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${HTTP_PORT}"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${HTTPS_PORT}"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./server/:/etc/nginx/conf.d&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;StackName&lt;/span&gt;

  &lt;span class="c1"&gt;# ? Bring up Mysql and configure the Database&lt;/span&gt;
  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.0.21&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;database&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;tty&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;expose&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3306"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${DB_DATABASE}"&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${DB_USERNAME}"&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${DB_PASSWORD}"&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${DB_ROOT_PASSWORD}"&lt;/span&gt;
      &lt;span class="na"&gt;SERVICE_TAG&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dev&lt;/span&gt;
      &lt;span class="na"&gt;SERVICE_NAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;database&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./storage/database:/var/lib/mysql&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;StackName&lt;/span&gt;

  &lt;span class="c1"&gt;# ? Build, Bring up Backend Container&lt;/span&gt;
  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tools/dockerfiles/dev-images/backend.dockerfile&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./:/var/www/html&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./server/config/php.ini:/usr/local/etc/php/php.ini&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./server/config/www.conf:/usr/local/etc/php-fpm.d/www.conf&lt;/span&gt;
    &lt;span class="na"&gt;expose&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9000"&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;database&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;cache&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;StackName&lt;/span&gt;

  &lt;span class="c1"&gt;# ? Bring Up Client UI&lt;/span&gt;
  &lt;span class="na"&gt;client&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tools/dockerfiles/dev-images/client.dockerfile&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;client&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./client/:/var/www/client&lt;/span&gt;
    &lt;span class="na"&gt;expose&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080"&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;StackName&lt;/span&gt;

  &lt;span class="c1"&gt;# ? Bring Up Caching Layer&lt;/span&gt;
  &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:6.0.9&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cache&lt;/span&gt;
    &lt;span class="na"&gt;expose&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;6379"&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;StackName&lt;/span&gt;

  &lt;span class="c1"&gt;# * Helper Container for Serving the Front-end&lt;/span&gt;
  &lt;span class="na"&gt;npm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node:14&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./client:/var/www/client&lt;/span&gt;
    &lt;span class="na"&gt;working_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/client&lt;/span&gt;
    &lt;span class="na"&gt;entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;npm"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;StackName&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change all instances of &lt;code&gt;StackName&lt;/code&gt; with your application name&lt;/p&gt;




&lt;h3&gt;
  
  
  Create a The init Script&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Finally we get to the whole point of this guide, having the user start everything by running a single script which is what we are gonna do here&lt;/p&gt;

&lt;p&gt;create &lt;code&gt;init.sh&lt;/code&gt; file in the root directory of the project, run the following command from the terminal to give it execute permissions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x init.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;paste in the following content&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;#?###################################################################################################&lt;/span&gt;
&lt;span class="c"&gt;#?                                                                                                  #&lt;/span&gt;
&lt;span class="c"&gt;#?                                      Output Helper Methods                                       #&lt;/span&gt;
&lt;span class="c"&gt;#?                                                                                                  #&lt;/span&gt;
&lt;span class="c"&gt;#?###################################################################################################&lt;/span&gt;

&lt;span class="nb"&gt;trap&lt;/span&gt; &lt;span class="s2"&gt;"exit"&lt;/span&gt; INT

&lt;span class="k"&gt;function &lt;/span&gt;blue_text_box&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  tput setaf 3
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" -&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="p"&gt;//?/-&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-
| &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="p"&gt;//?/ &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; |
| &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;tput setaf 4&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;tput setaf 3&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; |
| &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="p"&gt;//?/ &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; |
 -&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="p"&gt;//?/-&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-"&lt;/span&gt;
  tput sgr 0
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function &lt;/span&gt;red_text_box&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  tput setaf 3
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" -&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="p"&gt;//?/-&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-
| &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="p"&gt;//?/ &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; |
| &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;tput setaf 1&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;tput setaf 3&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; |
| &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="p"&gt;//?/ &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; |
 -&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="p"&gt;//?/-&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-"&lt;/span&gt;
  tput sgr 0
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function &lt;/span&gt;green_text_box&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  tput setaf 3
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" -&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="p"&gt;//?/-&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-
| &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="p"&gt;//?/ &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; |
| &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;tput setaf 2&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;$s&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;tput setaf 3&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; |
| &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="p"&gt;//?/ &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; |
 -&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="p"&gt;//?/-&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-"&lt;/span&gt;
  tput sgr 0
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;#!###################################################################################################&lt;/span&gt;
&lt;span class="c"&gt;#!                                                                                                  #&lt;/span&gt;
&lt;span class="c"&gt;#!                                       Script Start                                               #&lt;/span&gt;
&lt;span class="c"&gt;#!                                                                                                  #&lt;/span&gt;
&lt;span class="c"&gt;#!###################################################################################################&lt;/span&gt;

&lt;span class="c"&gt;# ! Add .env file&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env

&lt;span class="c"&gt;# ! bring down any service instance if it exists&lt;/span&gt;
red_text_box &lt;span class="s1"&gt;'Removing Old Stack if It Exists'&lt;/span&gt;
docker-compose down

&lt;span class="c"&gt;# ? Change Permissions for Artisan&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x artisan

&lt;span class="c"&gt;# ? Remove everything in the storage/database &amp;amp; bootstrap/cache directory&lt;/span&gt;
&lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; storage/database/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; bootstrap/cache/&lt;span class="k"&gt;*&lt;/span&gt;.php

&lt;span class="c"&gt;# TODO: Start &amp;amp; Build Container Stack&lt;/span&gt;
blue_text_box &lt;span class="s1"&gt;'Rebuilding the docker images &amp;amp; Starting them'&lt;/span&gt;
docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--build&lt;/span&gt;

&lt;span class="c"&gt;# * Install Laravel Dependencies&lt;/span&gt;
green_text_box &lt;span class="s1"&gt;'Installing Laravel Dependencies'&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; backend composer &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# * Install Front-end Dependencies &amp;amp; Build&lt;/span&gt;
green_text_box &lt;span class="s1"&gt;'Installing Dependencies &amp;amp; Build for User UI'&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; client npm i
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; client npm run build

&lt;span class="c"&gt;# ! Generate Key &amp;amp; Caching/Optimizing Config&lt;/span&gt;
red_text_box &lt;span class="s1"&gt;'Generating Laravel'&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; backend php artisan key:generate


&lt;span class="c"&gt;# ! Migrate and Generate Passport Encryption Key&lt;/span&gt;
red_text_box &lt;span class="s1"&gt;'Migrating &amp;amp; Seeding'&lt;/span&gt;
&lt;span class="nb"&gt;sleep &lt;/span&gt;10
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; backend composer dump-autoload
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; backend php artisan migrate:fresh &lt;span class="nt"&gt;--seed&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; backend &lt;span class="nb"&gt;chmod &lt;/span&gt;o+w ./storage/ &lt;span class="nt"&gt;-R&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Create The CLI&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Lets make interacting the stack easy for developers by creating a simple psuedo-cli&lt;/p&gt;

&lt;p&gt;in our &lt;code&gt;tools/scripts/local&lt;/code&gt; lets create a &lt;code&gt;cli.sh&lt;/code&gt; file and run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x cli.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;paste in the following content or modify the naming scheme to fit your needs by modifying "stack helper instances" and/or changing the container names&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;#?###################################################################################################&lt;/span&gt;
&lt;span class="c"&gt;#?                                                                                                  #&lt;/span&gt;
&lt;span class="c"&gt;#?                                      Output Helper Methods                                       #&lt;/span&gt;
&lt;span class="c"&gt;#?                                                                                                  #&lt;/span&gt;
&lt;span class="c"&gt;#?###################################################################################################&lt;/span&gt;

&lt;span class="c"&gt;# ! little helpers for terminal print control and key input&lt;/span&gt;
select_option &lt;span class="o"&gt;(){&lt;/span&gt;
  &lt;span class="nv"&gt;ESC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%b'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s2"&gt;33"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

  cursor_blink_on&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ESC&lt;/span&gt;&lt;span class="s2"&gt;[?25h"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  cursor_blink_off&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ESC&lt;/span&gt;&lt;span class="s2"&gt;[?25l"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  cursor_to&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ESC&lt;/span&gt;&lt;span class="s2"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;;&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;H"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  print_option&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'   %s '&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  print_selected&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'  %s'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ESC&lt;/span&gt;&lt;span class="s2"&gt;[7m &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ESC&lt;/span&gt;&lt;span class="s2"&gt;[27m"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  get_cursor_row&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;';'&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-sdR&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s1"&gt;$'&lt;/span&gt;&lt;span class="se"&gt;\E&lt;/span&gt;&lt;span class="s1"&gt;[6n'&lt;/span&gt; ROW COL&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s'&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ROW&lt;/span&gt;&lt;span class="p"&gt;#*[&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  key_input&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-n3&lt;/span&gt; key 2&amp;gt;/dev/null &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$ESC&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;A &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
      &lt;/span&gt;&lt;span class="nb"&gt;echo &lt;/span&gt;up
    &lt;span class="k"&gt;fi
    if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$ESC&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;B &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
      &lt;/span&gt;&lt;span class="nb"&gt;echo &lt;/span&gt;down
    &lt;span class="k"&gt;fi
    if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;  &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
      &lt;/span&gt;&lt;span class="nb"&gt;echo &lt;/span&gt;enter
    &lt;span class="k"&gt;fi&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

   &lt;span class="c"&gt;# initially print empty new lines (scroll down if at bottom of screen)&lt;/span&gt;
   &lt;span class="k"&gt;for &lt;/span&gt;opt&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
     &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
   &lt;span class="k"&gt;done&lt;/span&gt;

   &lt;span class="c"&gt;# determine current screen position for overwriting the options&lt;/span&gt;
   &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;lastrow&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;get_cursor_row&lt;span class="si"&gt;)&lt;/span&gt;
   &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;startrow&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="nv"&gt;$lastrow&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$#)&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

   &lt;span class="c"&gt;# ensure cursor and input echoing back on upon a ctrl+c during read -s&lt;/span&gt;
   &lt;span class="nb"&gt;trap&lt;/span&gt; &lt;span class="s2"&gt;"cursor_blink_on; stty echo; printf '&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;'; exit"&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
   cursor_blink_off

   &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;selected&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
   &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
     &lt;span class="c"&gt;# print options by overwriting the last lines&lt;/span&gt;
     &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;idx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
     &lt;span class="k"&gt;for &lt;/span&gt;opt&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
       &lt;/span&gt;cursor_to &lt;span class="k"&gt;$((&lt;/span&gt;startrow &lt;span class="o"&gt;+&lt;/span&gt; idx&lt;span class="k"&gt;))&lt;/span&gt;
       &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$idx&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;$selected&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
         &lt;/span&gt;print_selected &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$opt&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
       &lt;span class="k"&gt;else
         &lt;/span&gt;print_option &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$opt&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
       &lt;span class="k"&gt;fi&lt;/span&gt;
       &lt;span class="o"&gt;((&lt;/span&gt;idx++&lt;span class="k"&gt;))&lt;/span&gt;
     &lt;span class="k"&gt;done&lt;/span&gt;

     &lt;span class="c"&gt;# user key control&lt;/span&gt;
     &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;key_input&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in
       &lt;/span&gt;enter&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
       up&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="o"&gt;((&lt;/span&gt;selected--&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
         &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt; &lt;span class="nv"&gt;$selected&lt;/span&gt; &amp;lt; 0 &lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nv"&gt;selected&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="nv"&gt;$# &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
         down&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;((&lt;/span&gt;selected++&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
           &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt; selected &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$# &lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nv"&gt;selected&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
         &lt;span class="k"&gt;esac&lt;/span&gt;
       &lt;span class="k"&gt;done&lt;/span&gt;

       &lt;span class="c"&gt;# cursor position back to normal&lt;/span&gt;
       cursor_to &lt;span class="nv"&gt;$lastrow&lt;/span&gt;
       &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
       cursor_blink_on

       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$selected&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;#!###################################################################################################&lt;/span&gt;
&lt;span class="c"&gt;#!                                                                                                  #&lt;/span&gt;
&lt;span class="c"&gt;#!                                       Script Start                                               #&lt;/span&gt;
&lt;span class="c"&gt;#!                                                                                                  #&lt;/span&gt;
&lt;span class="c"&gt;#!###################################################################################################&lt;/span&gt;

&lt;span class="c"&gt;# Print Instructions&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'\n&amp;gt; %s\n\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;tput setaf 3&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;Please Choose your Shell&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;tput sgr 0&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;:

&lt;span class="c"&gt;# Options&lt;/span&gt;
&lt;span class="nv"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="s2"&gt;"Bash"&lt;/span&gt; &lt;span class="s2"&gt;"Zsh"&lt;/span&gt; &lt;span class="s2"&gt;"IDK"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

select_option &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;choice&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;

&lt;span class="nv"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$choice&lt;/span&gt;
&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$choice&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt; &lt;span class="k"&gt;in 
  &lt;/span&gt;Bash&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c"&gt;## User selected Bash&lt;/span&gt;
   &lt;span class="nv"&gt;shellrc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;".bashrc"&lt;/span&gt;
   &lt;span class="p"&gt;;;&lt;/span&gt;
  Zsh&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;## User Selected zsh&lt;/span&gt;
   &lt;span class="nv"&gt;shellrc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;".zshrc"&lt;/span&gt;
   &lt;span class="p"&gt;;;&lt;/span&gt;
  IDK&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;## User doesn't know&lt;/span&gt;
   &lt;span class="nv"&gt;shellrc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;".bashrc"&lt;/span&gt;
   &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;

&lt;span class="c"&gt;####################################################################################################&lt;/span&gt;

&lt;span class="c"&gt;# ? Remove Prexisting CLI Script&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'1,/# StackHelper CLI START/p;/# StackHelper CLI END/,$p'&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/&lt;span class="nv"&gt;$shellrc&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/# StackHelper CLI START/d'&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/&lt;span class="nv"&gt;$shellrc&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/# StackHelper CLI END/d'&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/&lt;span class="nv"&gt;$shellrc&lt;/span&gt;

&lt;span class="c"&gt;####################################################################################################&lt;/span&gt;

&lt;span class="c"&gt;# ? Echo the CLI in the user's .shellrc&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'
# StackHelper CLI START
# This function serves to integrate
# the dependency-less CLI for 
# Interactive Events Platform

shelper() {
    if [[ $@ == "build" ]]; then
        command docker exec -i client npm run build
    elif [[ $@ == "serve" ]]; then
        command docker-compose run --rm -p "8081:8081" npm run serve
    elif [[ $@ == "install client" || $@ == "i client" ]]; then
        command docker exec -i client npm install
    elif [[ $@ == "install api" || $@ == "i api" ]]; then
        command docker exec -i backend composer install &amp;amp;&amp;amp;
        command docker exec -i backend composer dump-autoload &amp;amp;&amp;amp;
        command docker exec -i backend php artisan key:generate &amp;amp;&amp;amp;
        command docker exec -i backend php artisan migrate:fresh
    elif [[ $@ == "api migrate" ]]; then
        command docker exec -i backend php artisan migrate
    elif [[ $@ == "api seed" ]]; then
        command docker exec -i backend php artisan db:seed
    elif [[ $@ == "api ms" ]]; then
        command docker exec -i backend php artisan migrate:fresh --seed
    elif [[ $@ == "api refresh" ]]; then
        command docker exec -i backend composer dump-autoload &amp;amp;&amp;amp;
        command docker exec -i backend php artisan migrate:fresh --seed
    elif [[ $@ == "stack refresh" || $@ == "stack r" ]]; then
        command docker-compose down &amp;amp;&amp;amp; command docker-compose up -d
    elif [[ $@ == "-h" || $@ == "--help" ]]; then
        echo " 
$(tput setaf 3)Stack Helper CLI$(tput sgr 0)

$(tput setaf 3)Usage:$(tput sgr 0)
    shelper [options] [arguments]

$(tput setaf 3)Options:$(tput sgr 0)

-h, --help          Displays this help page

$(tput setaf 3)Arguments:$(tput sgr 0)
    $(tput setaf 2)build$(tput sgr 0)                 Builds the Front-end
    $(tput setaf 1)serve$(tput sgr 0)                 Serves the front-end through port $(tput setaf 5)8081$(tput sgr 0)
    $(tput setaf 3)install client$(tput sgr 0)        Installs the npm Dependencies Shorthand -&amp;gt; $(tput setaf 5)i ui$(tput sgr 0)
    $(tput setaf 3)install api$(tput sgr 0)           Installs Laravel Dependencies, Generate Keys &amp;amp; Migrate DB Shorthand -&amp;gt; $(tput setaf 5)i api$(tput sgr 0)
    $(tput setaf 4)api migrate$(tput sgr 0)           Pushes Laravel Migrations to DB
    $(tput setaf 4)api seed$(tput sgr 0)              Seed the Database
    $(tput setaf 4)api ms$(tput sgr 0)                Migrate &amp;amp; Seed
    $(tput setaf 4)api refresh$(tput sgr 0)           Composer dump-autoload, Migrate &amp;amp; Seed
    $(tput setaf 6)stack refresh$(tput sgr 0)         Refresh the docker stack down/up Shorthand -&amp;gt; $(tput setaf 5)stack r$(tput sgr 0)
"
    else
        echo "
$(tput setaf 1)Please Input a Valid Argument$(tput sgr 0)
OR 
Check the Proper Syntax with
$(tput setaf 3)$ shelper -h$(tput sgr 0)
"
    fi
}

# For Tab-Completion (Basic/Rudimentary)
_shelper_completions()
{
  COMPREPLY+=("build")
  COMPREPLY+=("serve")
  COMPREPLY+=("install")
  COMPREPLY+=("api")
  COMPREPLY+=("stack")
}

complete -F _shelper_completions shelper
# StackHelper CLI END
'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/&lt;span class="nv"&gt;$shellrc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now lets add our cli script execution to the &lt;code&gt;init.sh&lt;/code&gt; script by adding the following lines to the script file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ! Install CLI&lt;/span&gt;
red_text_box &lt;span class="s1"&gt;'Installing CLI'&lt;/span&gt;
./tools/scripts/local/cli.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;note: after installing the pseudo cli you'll need to refresh your shell instance with something like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;bash
&lt;span class="nv"&gt;$ &lt;/span&gt;zsh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Create The Repo&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;At this point we're technically done lets create the repo and push it to your favorite repo hosting service (hub,lab,bucket...whatever) run the following command in the project's root directory&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git init
&lt;span class="nv"&gt;$ &lt;/span&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"First commit or whatever commit message you want"&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git remote add origin  &amp;lt;REMOTE_URL&amp;gt; 
&lt;span class="nv"&gt;$ &lt;/span&gt;git push origin &amp;lt;main/master/whatever&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now anyone clones the project, simply runs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;./init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and he's up and running&lt;/p&gt;




&lt;h3&gt;
  
  
  Future Plans &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;With your request I can add a couple of follow up guides that cover the following&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a CI/CD Pipeline for the Project&lt;/li&gt;
&lt;li&gt;Building Production Images&lt;/li&gt;
&lt;li&gt;Deploying Production Builds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;so let me know if you'd like that&lt;/p&gt;




&lt;h3&gt;
  
  
  TL;DR &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;We've successfully create an easy to use development stack that starts up by simply cloning and running &lt;code&gt;./init.sh&lt;/code&gt;, a small pseudo helper cli that helps developers interact with the with the containers&lt;/p&gt;

&lt;p&gt;If you understand everything and would just like a repo that has all this instead of going through all this as a learning experience&lt;br&gt;
you can find it &lt;a href="https://github.com/aeweda/Laravel-Development-Stack-Boilerplate"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;if you find any typos or any problems in the process or having some comments about something that you don't like please let me know so that I can fix it or improve upon it, whichever the case may be&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>docker</category>
      <category>bash</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
