Laravel
Recipe Features Explained
Let's breakdown the recipe to deploy a new Laravel site.
See Full Deployment Script
source: clear
root: public_html/public
features:
- php latest
- mysql
nginx:
fastcgi: "on"
locations:
- match: /
try_files: $uri $uri/ /index.php$is_args$args
- match: ~ \.[^\/]+(?<!\.php)$
try_files: $uri =404
commands:
- composer create-project laravel/laravel .
- cp .env.example .env
- sed -ri "s/(# )?DB_CONNECTION=.*/DB_CONNECTION=mysql/g" .env
- sed -ri "s/(# )?DB_HOST=.*/DB_HOST=localhost/g" .env
- sed -ri "s/(# )?DB_PORT=.*/DB_PORT=3306/g" .env
- sed -ri "s/(# )?DB_DATABASE=.*/DB_DATABASE=${DATABASE}/g" .env
- sed -ri "s/(# )?DB_USERNAME=.*/DB_USERNAME=${USERNAME}/g" .env
- sed -ri "s/(# )?DB_PASSWORD=.*/DB_PASSWORD=${PASSWORD}/g" .env
- sed -ri "s/APP_URL=.*/APP_URL=https:\/\/${DOMAIN}/g" .env
- php artisan migrate:fresh
- php artisan key:generate
- php artisan storage:link
- npm install
- npm run build
- rm -f public/hot
- chmod 0750 -R storage || true
source: clear
features:
- php latest
- mysql
commands:
- composer create-project laravel/laravel .
This script clears ~/public_html
and changing active PHP version to latest installed and create default mysql database and creates a new blank laravel project via composer create-project
.
When you upload an existing laravel project, the composer create-project
part is omitted.
root: public_html/public
nginx:
fastcgi: "on"
locations:
- match: /
try_files: $uri $uri/ /index.php$is_args$args
- match: ~ \.[^\/]+(?<!\.php)$
try_files: $uri =404
This script declare NGINX Configuration. It means two thing:
-
root: public_html/public
means all static files are put topublic
folder. This is the recommended way to serve Laravel for reverse proxy like NGINX. -
fastcgi: "on"
means PHP processing is turned on. -
match: /
means for all requests, dotry_files: $uri $uri/ /index.php$is_args$args
. It means try static files first then process root/index.php
if nothing found. -
match: ~ \.[^\/]+(?<!\.php)$
means for requests only to URLs ending with.php
, dotry_files: $uri =404
. This disables PHP processing for non PHP URLs, known as FastCGI - Safe Config.
commands:
- cp .env.example .env
- sed -ri "s/(# )?DB_CONNECTION=.*/DB_CONNECTION=mysql/g" .env
- sed -ri "s/(# )?DB_HOST=.*/DB_HOST=localhost/g" .env
- sed -ri "s/(# )?DB_PORT=.*/DB_PORT=3306/g" .env
- sed -ri "s/(# )?DB_DATABASE=.*/DB_DATABASE=${DATABASE}/g" .env
- sed -ri "s/(# )?DB_USERNAME=.*/DB_USERNAME=${USERNAME}/g" .env
- sed -ri "s/(# )?DB_PASSWORD=.*/DB_PASSWORD=${PASSWORD}/g" .env
- sed -ri "s/APP_URL=.*/APP_URL=https:\/\/${DOMAIN}/g" .env
This script copies the sample .env.example
to .env
and changing the database connection to MySQL and sets APP_URL
to https://$DOMAIN
.
commands:
- php artisan migrate:fresh || true
- php artisan key:generate
- php artisan storage:link
- npm install
- npm run build
- rm -f public/hot
- chmod 0750 -R storage || true
This script executes good practices when initializing a laravel project.
-
php artisan migrate:fresh
Migrates your laravel project. It's fine if it fail (hence|| true
), you can rerun migration again in SSH if it fails. -
php artisan key:generate
sets APP_SECRET to.env
-
php artisan storage:link
putstorage
folder link topublic/storage
. -
npm install
&npm run build
install and compile frontend tooling, if any. -
rm -f public/hot
removeshot
file that confuses laravel thinking if it still in development mode. -
chmod 0750 -R storage || true
set 0750 tostorage
folder, making sure that NGINX can really reads them.
Enable Laravel UI
commands:
- composer require laravel/ui
- php artisan ui bootstrap --auth
- npm install
- npm run build
This enables Laravel UI with Bootstrap and authentication.
Fix 404 NGINX Page when opening page other than index
You may have default NGINX settings applied. You need to fix it to suit laravel need.
root: public_html/public
nginx:
fastcgi: "on"
locations:
- match: /
try_files: $uri $uri/ /index.php$is_args$args
- match: ~ \.[^\/]+(?<!\.php)$
try_files: $uri =404
Fix 404 NGINX Page when opening dynamic media
By default the laravel template uses FastCGI Safe routing, which refuses PHP processing for any URLs with dot. To allow it, use FastCGI normal routing.
root: public_html/public
nginx:
fastcgi: "on"
locations:
- match: /
try_files: $uri $uri/ /index.php$is_args$args
Run Development Mode In Server
You need to open VS Code and run php artisan serve
and yarn dev
.
Before that, make sure to unset APP_URL
from .env
. VS Code will set up a local port forwarding so localhost:8000
can be opened directly in your browser.