Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Deploy a Ghost website with Provose

Provose is the easiest way to manage your Amazon Web Services infrastructure.

Ghost is a modern, open-source, and easy-to-use platform for building a website, blog, or subscription newsletter.

Installation requirements

This is a summary of the installation details in the official Provose tutorial.

  1. Make sure your local system has Terraform 0.13 or newer and the AWS CLI v2.
  2. Make sure your system has AWS credentials that Terraform can find. On a local machine, you can use environment variables or a ~/.aws/credentials file. On an AWS EC2 instance, Terraform can use the instance's IAM instance profile.
  3. You will need a domain name to host your Ghost website. Provose requires a second domain name for the purpose of issuing TLS certificates and routing internal traffic in the Virtual Private Cloud (VPC) that Provose creates.

Run Terraform

Then clone this repository with

git clone
cd provose-ghost-website-example

Then set up your workspace with

terraform init

Then run

terraform apply

If you have multiple AWS profiles on your system, you may need to specify the profile with an environment variables as follows:

AWS_PROFILE=my_profile_2 terraform apply

Terraform will interactively prompt you for your two domain names. You can also set these Terraform variables as command line arguments or environment variables.

It will take several minutes for your infrastructure to deploy. At the end, Terraform should print a message that starts with Apply complete!.

If you have set up this infrastructure for testing and now want to destroy it, you can run:

terraform destroy

Make sure to disable Deletion Protection on the MySQL database if you are sure that you want to delete it.

Exercises for the reader

Adding a Content Delivery Network (CDN)

This example sets up a single Docker container running on AWS Fargate, sitting behind an Application Load Balancer (ALB). For further scalability, the ALB should be behind a Content Delivery Network (CDN) like Cloudflare or AWS CLoudFront.

Enabling email

This example sets up Ghost, but without any credentials for sending transactional emails--for example, in case the admin forgets their password.

It is possible to configure Amazon Simple Email Service (SES) and pass those credentials to Ghost. More details can be found here.

Using a SQLite3 database

Typically the Ghost blogging platform is backed via a MySQL database, but SQLite is another option. Switching to SQLite might be a way for blogs with low traffic to save on their cloud costs.


An example showing how to use Provose to deploy a blog on AWS.



Code of conduct





No releases published


No packages published