Best self -Hosting for Ghost (outside of Ghost Pro)

Hi everyone!

Looking to host our ghost blog self hosted (away from Ghost Pro) - ideally we are going to want to combine our Webflow landing page and general pages with Ghost for our blogging and need to find the fastest / best hosting. What are some that have worked for y’all?


While I can only answer in regards to hosting, a Digital Ocean droplet starting at $6 / month works fine (I got almost 1 000 posts). If you want “more speed”, go with a $20 droplet. I get a load time of give or take 500ms and I am not done optimizing it.

Heroku is the best option according to me. You need to make data sources on different platform and hence it increases the scalability and speed.
You can deploy latest ghost version on Heroku with one click from here

If you need any help regarding custom deployment or anything leave a question here

Be careful because depending on how it’s done this can decrease speed rather than increase it. Also be aware that unless the external system is mounted on your host in a way that will work with the local file storage engine you’ll lose all automated image resizing and srcset/sizes support.

I don’t want to discourage different types of hosting setups, just be aware that the further you go from the standard the more attention you have to pay to implementing details, managing performance, and having limited support options.

Thanks @Kevin for noticing that. Ghost is smart enough to handle the operations. I am using AWS S3 and AWS RDS more than a year now. Everything is smooth to me yet :star_struck:

If you’re using the S3 storage engine then you’re missing out on some recent image optimisation features. S3 is also not the best for serving content quickly although you may get around that with a caching proxy or cdn in front.

It may be possible to mount your s3 bucket as a drive with s3fs and then use the built-in local file storage engine to get image optimisation back but I don’t know if that’s doable on Heroku.

As this topic was about the “best” self-hosting options it would be good to point out when options are workable but not optimal.

Just out of curiosity what S3 plugin are you using? I’ve had issues with GCS at least when loading the favicon. I think the subscribe also is giving me problems but i’m not 100% sure that it’s related to the external storage system or not.

I am using S3 storage adapter which is recommended by Ghost.

Thanks for that. I updated my base image to support GCS and S3 now. At least now I can figure out if the issue with the favicon and subscribe is because of a ghost bug or the gcs plugin I’m using.

If anyone is wants to use it: GitHub - OSAlt/gb-docker-ghost: Ghost GB image.

Now I just need to write a tool to migrate the media from local → cloud and cloud → local.

It looks like the GCS adapter does have the saveRaw method used by image resizing but unless it saves and serves images from content/images/ I think it will likely suffer from the same problem of not supporting the srcset and sizes image optimisations. Likely fine for small sites or ones where you’re not too worried about optimising.

As noted above if you want the best/most supported optimisation experience then using the built-in local storage is the way to go.

1 Like

@Kevin Thanks for your input. I’m not too worried about optimizations though that’s a fair concern. At the very least I’d like to make sure it’s functional. I had issues where the favicon isn’t being loaded correctly.

For example:

beta_site_1  | GhostGCSAdapterError: Ghost GCS Adapter Error: No such object: gb-www-geekbeacon/https:/
beta_site_1  |     at PassThrough.<anonymous> (/var/lib/ghost/content/adapters/storage/gcs/index.js:277:24)
beta_site_1  |     at PassThrough.emit (events.js:314:20)
beta_site_1  |     at PassThrough.EventEmitter.emit (domain.js:483:12)
beta_site_1  |     at emitErrorNT (internal/streams/destroy.js:92:8)
beta_site_1  |     at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
beta_site_1  |     at processTicksAndRejections (internal/process/task_queues.js:84:21)

I’m happy to attempt a patch but would you have any guidance on what is missing the causes the URI to be built inaccurately?

@Jared_Austin_Robin sorry for the tangent on this thread. I hope your original question was answered?

I like the digital ocean marketplace app.
Setup was smooth and DO is good and fair priced.

If you’re happy with running your own VPS, I find OVH pretty cost effective. I run Debian stable on several VPS in the UK, Europe and Oceania, with about a dozen Ghost sites. If you are familiar with basic Linux, Ghost is a dream to run and keep updated. Performance has never been an issue. I do keep wondering if I should just hire rack-space from Global Switch and bang in some Dells.

I was self hosting on Heroku for awhile, but with a number of websites and the need for a paid SQL service fund that it was starting to get a bit pricey.

These days I use ghost stack on bitnami with EC2. Like anything there are somethings to be on the look out for which you can read more about here How to organise and get a Bitnami Ghost instance started on Amazon EC2.

I’ve personally just used a VPS on DigitalOcean or Linode and then just use nginx in front of it.

I wrote a blog post a while ago about how to setup SSL LetsEncrypt using lego and used nginx + ghost as the example web service. If it’s useful you can look over it here


Self host in a docker on unraid. Then use cloudflare for dynamic DNS

If I’m already using Cloudflare and a droplet on DigitalOcean for a self-hosted Ghost website, is there any point in me setting up nginx as well? I’m not exactly sure what nginx does?

If you want SSL, additional caching layer then nginx can wrap all request with an SSL layer, proxy, forwarding, etc. It’s a webserver similar to apache, caddy, Lighthttpd, etc.

I don’t know what you’d get that ghost can’t do out of the box. Caching and SSL are the two main features I’d add. Sometimes I like adding a static routes which is nice.

For example, I have an issue with a plugin I’m using with ghost where it can’t find the favicon. So I got around it by fixing it in nginx.

	location /favicon.png {
	  alias /var/www/html/beta/favicon.png;
          allow all;

I would say it’s not needed but it’s a nice to have, IMO.

vhost routing is another one, I’m hosting 12 different websites on the same server and I wouldn’t be able to do that without nginx or a similar tool.

1 Like

I’m using an Ubuntu instance hosted on Google Compute Engine (GCE). The Ubuntu instance is running Apache2 and the PageSpeed module. MySQL as DB manager. Images are stored in a Google Bucket using a Ghost Storage Adapter . This setup works fine for my small sites.