Setting up a Mailcoach app on AWS with Laravel Forge

I’ve been looking forward to the release of Mailcoach, which is a self-hosted mailing list manager app. I have a few mailing lists, most of which are tiny, but one of which has over 3000 subscribers. This puts it over the threshold of expensive subscription options in MailChimp. MailChimp wants over 70 USD / month to run this single list, whereas a Mailcoach license is a one-off payment of 99 USD. Plus it seems like it would be interesting to self-host the mailing list manager and learn a few things along the way.

I want to manage my Mailcoach app on AWS via Laravel Forge, which is the set-up I use for all my Laravel apps. It was a little bit tricker than I expected to get Mailcoach set up with Forge, though, due to Mailcoach requiring a manual step during composer install. Here are the steps that worked for me.

Deploying Mailcoach with Forge

Create an empty Github repo, e.g. foobar-mailcoach.

Create a new Mailcoach application using the composer installer:

composer create-project spatie/Mailcoach

This will require entering your Mailcoach email address and license key. Hit y when asked if you want to save these in an auth.json file, as that’s essential for the rest of the setup.

Once Composer has created the auth.json file for you, find it by first finding your Composer home:

composer config --list --global | grep home

It’s likely to be something like /home/vagrant/.composer/, if you’re in a vagrant box. Check the auth file contents are there with the Mailcoach details:

cat /home/vagrant/.composer/auth.json

It should look like this:

{
    "bitbucket-oauth": {},
    "github-oauth": {},
    "gitlab-oauth": {},
    "gitlab-token": {},
    "http-basic": {
        "satis.mailcoach.app": {
            "username": "<your@email.com>",
            "password": "<your-mailcoach-license-key>"
        }}
}

Copy that and put it in the equivalent place on your Forge server for the forge user there. Be careful not to overwrite any existing Composer auth details you might have there if this is not a new Forge server.

You can edit the Composer auth file on the Forge server with:

vim /home/forge/.config/composer/auth.json

Now Forge will be able to install your Mailcoach application on the server without needing the manual step, as it already has the auth details available for the forge user.

Note that you’ll want to update the default Forge deployment script to include this:

yarn install
yarn run prod

Also, if you’re hosting the application on an HTTPS URL (which you should be), you need to change the master.blade.php layout file to use secure asset URLs. Just change all calls to asset() to secure_asset().

Then you can hit your new Mailcoach application at the domain you pointed to it.

Setting up Mailcoach scheduler in Forge

Mailcoach makes use of Laravel’s scheduler, so you’ll need to set that up in Forge. Go to the site settings in Forge, then the Scheduler section. You’ll need to set up a scheduler run that looks like this:

php /home/mailcoach/default/artisan schedule:run

Set to run every minute.

Make sure it runs as the appropriate user if you’ve got site isolation enabled for this site.

Setting up Horizon for Mailcoach in Forge

Mailcoach makes use of Laravel Horizon, so you’ll need to set that up in Forge as well. You can follow the instructions for that here:

https://medium.com/@taylorotwell/deploying-horizon-to-laravel-forge-fc9e01b74d84

In short, go to the server settings in Forge, then Daemons. Add a Daemon with this command:

php artisan horizon

And make sure it runs as the appropriate user and in the right directory for the Mailcoach site you have.

Then go to the Site settings, and add this command at the end of the deployment script:

php artisan horizon:terminate

(That restarts the Horizon workers on each deployment.)

After that, follow the Mailcoach docs to finish the rest of the set up.


Tech mentioned