You’ve been developing your new Laravel project locally for some time, you’ve hit your feature milestones and the app has passed testing. Everything is checked in to your git master branch, so now it’s time to deploy it to a live server and let your end customers access it.
Whilst there are a number of tools to help automate or simplify the deployment process, such as Laravel Forge, we believe it’s beneficial to go through the process of manually deploying a Laravel project at least once, as it helps with understanding the architecture and can make for smoother updates and easier troubleshooting in the future.
In this guide we’ll be doing just that, we’re not going to focus heavily on the server configuration side of things as this can vary depending on your host but instead on the steps required to get your app from your local environment into your production environment.
We’ll assume you have access to a web server configured with the LAMP (Linux, Apache, MySQL, PHP) or LEMP (Linux, Nginx, MySQL, PHP) stack, with (at time of writing for Laravel 5.8), the following specs:
- PHP >= 7.1.3
- BCMath PHP Extension
- Ctype PHP Extension
- JSON PHP Extension
- Mbstring PHP Extension
- OpenSSL PHP Extension
- PDO PHP Extension
- Tokenizer PHP Extension
- XML PHP Extension
You’ll also need SSH access to run terminal commands as part of the deployment process.
We like DigitalOcean for quickly spinning up a server instance and getting everything configured (use this link to get a 30 day free trial with $50 credit to get you up and running). There’s some good guides on their site explaining these setup steps, and an example server configuration for Nginx in the Laravel docs.
Finally, we’ll assume you’ve checked your code into your git repository and you have all the necessary credentials to access it from your server.
Putting your Laravel app into production
Using the example server config file from the Laravel docs above, on your web server you will have an
/example.com/ directory with a
/public/ directory inside (depending on your specific server configuration this could be a
/public_html/ directory or something else).
So first of all we’ll clone our project into the
/example.com/ directory from our git repository. That directory is not publicly accessible and therefore maintains the security of the project files. Then we’ll create a symlink between our project’s
/public/ directory and the
So from inside the
/example.com/ directory, run
git clone http://[GIT_SERVER]/your-app.git
You should see your project files in the
/example.com/your-app/ directory now.
To link the
/example.com/your-app/public/ directory to your
/example.com/public/ directory run the following commands:
mv public public_bak ln -s your-app/public public
Check that the paths in the following two lines in your
/your-app/public/ are correct relative to the location of your project files:
require __DIR__.'/../bootstrap/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php';
If your app requires a database make sure you have a suitable database set up and have the credentials to hand.
Now we need to update the project’s
.env file. These are usually not checked into git repositories by default as they can contain sensitive password information and local and production deployments will require different settings.
There should be an
.env.example file in your project which you can rename to
.env. The key areas to edit now are the database settings if a database is being used, and this section:
APP_NAME=Laravel APP_ENV=local APP_KEY= APP_DEBUG=true APP_URL=http://localhost
production, and update the
APP_URL accordingly. If you leave
true, in the event of errors you’ll be displaying sensitive debug information to the world (see our Seaborne Freight article), so make sure you change it!
We need to set some folder permissions so they are writeable, specifically the
/bootstrap/cache/ folders. These commands may vary depending on your server configuration, but the following commands should set the necessary folder permissions:
chmod -R o+w storage chmod -R o+w bootstrap/cache
Now we need to install Composer, so run the following:
composer install — optimize-autoloader — no-dev
We need to generate an application key (the
APP_KEY setting from the
.env file above), to do this, run:
php artisan key:generate
Laravel uses this key for (amongst other things) encrypting cookies.
If you have any database migrations that need to be run to structure your tables, then run the following:
php artisan migrate
If you have seed data to populate your tables with, then run:
php artisan db:seed
See our article on dummy data for more about seeding databases.
That’s basically it! You should be able to go to your new site and see your Laravel project default page. Test out some of your app’s features and make sure the database is working as expected.
Optionally at this stage you can optimise your site’s performance with cache commands (see our article on improving the performance of your Laravel app).
To cache the site config, run:
php artisan config:cache
To cache the routes, run:
php artisan route:cache
We hope this article has been a helpful overview of what’s involved with deploying Laravel based websites and web apps. If you need help with a deployment don’t hesitate to get in touch.