Ghost on Heroku

by frederic2ec


Ghost 3.X on Heroku

Ghost is a free, open, simple blogging platform. Visit the project's website at, or read the docs on

GitHub issues GitHub forks GitHub stars Deploy to Heroku


This is a fork with some improvements from I have forked and improved this repository. In this repository I have remove the default mailgun and cloudinary and give access to add custom SMTP server and S3 endpoint for third-party S3 provider (like digitalocea).

Ghost version 3.X

The latest release of Ghost is now supported! Changes include:

  • Requires MySQL database, available through either of two add-ons:
  • PUBLIC_URL config var renamed to APP_PUBLIC_URL to give it alphabetical precedence
  • Dark Mode on casper theme! Please make sure to activate your system's dark-mode first.



If the above button does not work for you, disable anything that might be blocking Heroku from inferring the referrer (e.g. Brave shield), or try this: (if you're using a fork, make sure to point the template link to your repo).

NOTE: we do not support deploying by downloading the source file or by copying over a cloned folder. Downloading/copying folders tends to break symlinks, so we recommend that you deploy by clicking the button in this repository or your fork on GitHub.

step-by-step tutorial

The following video is a step by step tutorial:


Things you should know

After deployment,

  • First, visit Ghost at to set up your admin account
  • The app may take a few minutes to come to life
  • Your blog will be publicly accessible at
  • If you subsequently set up a custom domain for your blog, you’ll need to update your Ghost blog’s APP_PUBLIC_URL environment variable accordingly
  • If you create a lot of content or decide to scale-up the dynos to support more traffic, a more substantial, paid database plan will be required.

🚫🔻 Do not scale-up beyond a single dyno

Ghost does not support multiple processes.

If your Ghost app needs to support substantial traffic, then use a CDN add-on:

Configuring S3 file uploads

The blog is configured to use Cloudinary file storage by default. If you want to configure S3 file storage, create an S3 bucket on Amazon AWS, and then specify the following details as environment variables on the Heroku deployment page (or add these environment variables to your app after deployment via the Heroku dashboard):

  • S3_ACCESS_KEY_ID and S3_ACCESS_SECRET_KEY: Required if using S3 uploads. These fields are the AWS key/secret pair needed to authenticate with Amazon S3. You must have granted this keypair sufficient permissions on the S3 bucket in question in order for S3 uploads to work.

  • S3_BUCKET_NAME: Required if using S3 uploads. This is the name you gave to your S3 bucket.

  • S3_BUCKET_REGION: Required if using S3 uploads. Specify the region the bucket has been created in, using slug format (e.g. us-east-1, eu-west-1). A full list of S3 regions is available here.

  • S3_ASSET_HOST_URL: Optional, even if using S3 uploads. Use this variable to specify the S3 bucket URL in virtual host style, path style or using a custom domain. You should also include a trailing slash (example https://my.custom.domain/). See this page for details.

  • S3_BUCKET_ENDPOINT: Optional, even if using S3 uploads. Use this variable to specify the S3 bucket endpoint of your S3 provider.

Once your app is up and running with these variables in place, you should be able to upload images via the Ghost interface and they’ll be stored in Amazon S3. ✨

Provisioning an S3 bucket using an add-on

If you’d prefer not to configure S3 manually, you can provision the Bucketeer add-on to get an S3 bucket (Bucketeer starts at $5/mo).

To configure S3 via Bucketeer, leave all the S3 deployment fields blank and deploy your Ghost blog. Once your blog is deployed, run the following commands from your terminal:

# Provision an Amazon S3 bucket
heroku addons:create bucketeer --app YOURAPPNAME

# Additionally, the bucket's region must be set to formulate correct URLs
# (Find the "Region" in your Bucketeer Add-on's web dashboard.)
heroku config:set S3_BUCKET_REGION=us-east-1 --app YOURAPPNAME

Setting up SMTP service

When you spin up your heroku dyno for the first time, no mail server is configured. Alternatively you can use solution like Mailgun or use your own SMTP server.

  • SMTP_FROM : Email from the message are sent

  • SMTP_HOST: Host of the SMTP server

  • SMTP_PORT: Port of the SMTP server

  • SMTP_LOGIN: Login of the SMTP server

  • SMTP_PASSWORD: Password of the SMTP server

Dark Mode is now available

As of version 3.0.0 Dark mode is available on Ghost Casper theme. Please make sure your's system's dark mode is enabled first to activate dark mode.

How this works

This repository is a Node.js web application that specifies Ghost as a dependency, and makes a deploy button available.

  • Ghost and Casper theme versions are declared in the Node app's package.json
  • Versions are locked and managed using npm
  • Scales across processor cores in larger dynos via Node cluster API

Updating source code

Optionally after deployment, to push Ghost upgrades or work with source code, clone this repo (or a fork) and connect it with the Heroku app:

git clone
cd ghost-on-heroku

heroku git:remote -a YOURAPPNAME
heroku info

Then you can push commits to the Heroku app, triggering new deployments:

git add .
git commit -m "Important changes"
git push heroku master

Watch the app's server-side behavior to see errors and request traffic:

heroku logs -t

See more about deploying to Heroku with git.

Upgrading Ghost

This repository locks Ghost to the "last tested good version" using the standard package-lock.json file. If you want to upgrade Ghost on your own, you will need to clone or fork this repo as described above. You will then be able to run:

npm upgrade ghost
git add package.json package-lock.json
git commit -m 'Update dependencies'
git push heroku master

If you're worried about packages beyond the root ghost server being outdated, you can check using npm outdated.


If you have problems using your instance of Ghost, you should check the official documentation or open an issue on the official issue tracker. If you discover an issue with the deployment process provided by this repository, then open an issue here.


Released under the MIT license, just like the Ghost project itself.