How to quickly deploy your Laravel website or app on Heroku
Tags: laravel, devops, heroku, tutorial
Published: 2019-08-09 08:09:43

*Our developers have been through a lot. These are their stories. This one is told by Alin, one of our senior app-crafters.*

A few weeks ago I had to deploy a website on Heroku. We built it on Laravel with the help of our handy open source admin panel [Backpack for Laravel](https://backpackforlaravel.com?ref=updivision). Sounds like a simple job, right? Wrong. I started at 5 pm and worked well past midnight. Of course, the client had a launch event next day in the morning.

Because I don't want to repeat this horrible experience on future app launches, I wrote this practical guide on how to deploy Laravel apps on Heroku. Maybe it will also save you hours of frustration.

**Note! This applies mostly to Laravel 5.4**

**Also note! This guide assumes you will use a pipeline for deploy that automatically builds and deploys every push in the master branch of your repo.**

##The essential steps to swiftly deploy your Laravel app on Heroku##

1.) Create the Procfile and add it to your repo. The content should look like this: **web: vendor/bin/heroku-php-apache2 public/**

2.) Set up the ENV variables. You can do this using Heroku cli and entering this command line: 
**heroku config:add APP_KEY="base64:enter_your_key" --app**
Or from Heroku interface by selecting the app and going to Settings -> Config Variables -> Reveal.  

3.) Update the log setting to errorlog. Put this in the app config file:
**'log' => 'errorlog'**
Pro tip: Add [Papertrail add-on](https://elements.heroku.com/addons/papertrail) to your app to see the log in real time.

4.) Trusting the Load Balancer. Add and configure the [fideloper/proxypackage](https://github.com/fideloper/TrustedProxy) (this is [built in Laravel 5.5](https://laravel-news.com/trusted-proxy))

For more detailed info on how to get started with Laravel on Heroku you can go trough this [official guide](https://devcenter.heroku.com/articles/getting-started-with-laravel).

##Now for the real gold nuggets I learned the hard way##

1.) The Heroku database is usually in Postgres. And there are a few differences from MySql: char fields, enum fields etc. So you better build the project directly on Postgres. 

2.) The database config file on Larvel should look like this: 

![scr1](https://thepracticaldev.s3.amazonaws.com/i/e5eqnzp9cq2egot69fex.jpg)

3.) Heroku relies on composer.lock to build the environment and pull the required packages. So if you need some libraries or extensions that are not built-in (e.g. gd library for images) and you cannot add them to your composer.json you can add them manually to the composer.lock file. Here is a [step by step guide](https://getcomposer.org/doc/01-basic-usage.md#platform-packages). Also, here you can find a list of available [extensions for Heroku](https://devcenter.heroku.com/articles/php-support#extensions). 

4.) Symlinks do not work. So don't use the storage folder to save resources, better use a CDN.

5.) You can add a free app in Heroku to test you project.

6.) You can use iseed package to create seed files in order to populate your database.

7.) You can run commands with [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli). For example, Artisan commands can be called like this:
**heroku run "php artisan migrate" --app heroku-app-name**

That's all folks! I wish you easy deployment.

We really appreciate feedback and any code contributions. And if you have any questions, don't hesitate to contact us.