Deploying a Laravel application to DreamHost shared hosting, 2018 edition

Unfortunately, this sort of information changes regularly. Google “dreamhost laravel” and you’ll get some articles from a few years ago which, while helpful, were not sufficient for me. A few examples:

Shockingly, DH’s Knowledge Base is silent about Laravel. Here’s what ended up working for me. If you’re trying to follow these instructions and something is unclear or does not work, please reach out.

Step 1: Add a domain

In the DH panel, click Manage Domains and Add Hosting to a Domain/Sub-domain. I bet it’s possible to get this working in a directory of an existing domain, but DH lets you add unlimited subdomains so why not create a new one for your app? Under Web directory, add /public to the end of the domain name. Set PHP mode to 7.1 FastCGI. You’ll probably also want to select HTTPS and Create a New User.

Step 2: Create a database

Click Goodies and MySQL Databases. Scroll to the bottom of the page to Create a new MySQL database. Type in a database name. Note down the name, the hostname, and the user. Click Add new database. Then find the database in the list (or any other database in there that has the same user) and click on the user’s name. Click Show and note down the password. While you’re in there, you should add your current computer’s IP address to the list of allowable hosts; that’ll allow you to inspect your database from your local machine with something like Sequel Pro.

Step 3: Upload your files

You can’t run Composer on a DH shared hosting plan, so upload your complete project from your local development environment, vendor folder and all. (Do not upload any files or folders that starts with a dot, like .env or .git. Also don’t upload your node_modules folder, if you have one.)

Step 4: Set up .env

Copy the .env file from your project folder to a place you can edit it. (To see hidden files on a Mac, type Command-Shift-. in the Finer. Repeat the command when you’re done.) Edit the lines for DB_HOST, DB_DATABASE, DB_USERNAME, and DB_PASSWORD with the info from step 2. Upload the file to the project root folder.

Step 5: Migrate your tables

SSH into your DH server: from your local command line, type ssh -l [user] [domain]. The user and domain are the ones you created in step 1, which is separate from the database user! CD into the root of the project folder. At this point, if you run php -v you will not get version 7.1 even though you selected it for the domain, go figure!

Type php-7.1 artisan migrate. This may work, but in my case, I got an error to the effect that 1071 Specified key was too long. This issue can be solved by updating your AppServiceProvider file by adding Schema::defaultStringLength(191); to the boot() function and use Illuminate\Support\Facades\Schema; to the top. Now when you run php-7.1 artisan migrate you’ll get a different error message, because you’re trying to re-create tables that were created last time before the error?

You can probably do php-7.1 artisan migrate:refresh but this is where I logged into Sequel Pro and just deleted all the existing tables. At that point, php-7.1 artisan migrate worked, creating all my tables, and my application was working!

Done!

Again, if you’re trying to follow these instructions and something is unclear or does not work, please let me know.

Update: Lots of good details about this at the Laracasts thread for this post.