Ghost Tips: My Experiences Running a Self-Hosted Newsletter
When I started the Obsidian Roundup, I had two primary motivations. First, I wanted to help out people who had a lot to contribute to the Obsidian community but didn’t have time to keep up with the firehose of (very useful!) information in the community Discord, for example plugin developers. Second, I wanted to check out Ghost, which I heard about during a period of controversy surrounding Substack. I was never going to join Substack (I like controlling my own “branding” too much), but it seemed like a nice alternative to MailerLite, which was what I had settled on for my Monday Morning Research Roundup (which has since been rebranded to The Iceberg) but caps out at 1k subscribers for the free tier.
A bunch of people told me Ghost was great, super easy, so nice–but those people were using the managed hosting option, and at $9/mo for up to 1k members, it looked to be significantly more expensive than Mailerlite (which was free). Some other folks said they self-hosted it and it was great, but these are also the same people who think nothing of using git or pandoc or any other command line interface tool that I had never heard of six months ago. Self-hosting, though, would be cheaper than any other option if I ever had more than 1k subscribers, and for the Roundup that seemed likely.
I like saving money, though, and I figured if I ran into too much trouble somebody would help me, so I dove in. Here’s a compilation of what I learned, compiled for your reading pleasure and in hopes that it helps someone else out who has been thinking about trying out Ghost.
Mục Lục
Step 1: Finding a Host
I spent a hilarious amount of time reaching out to various webhosts to do price comparisons and most regular web hosts don’t really do server hosting too. So the first thing to realize when deciding to go with Ghost is that you aren’t going to be able to use a normal webhost like GoDaddy or whatever, you need someone that will let you have a whole server thing.
Not many services have a one-click-install for Ghost, and of the ones that do, I prefer DigitalOcean. Most people I know use it, and it’s reasonably priced, and they have a nice little referral program that lets you have plenty of seed money to mess around with. This link will give you a $100 credit that you have 60 days to spend, which is more than enough time to figure out whether you like it.
Step 2: Setting Up
The big thing I didn’t know when I was setting up my ghost installation on DigitalOcean was that a digital ocean droplet is an entire server, not just a widget or app or program or whatever like I was used to from places like SiteGround, so I accidentally paid for two droplets (one for my wordpress site, one for my ghost blog) which is totally unnecessary (less work but more money). At $6/mo (of free money) this isn’t a crisis, but nonetheless, I felt kind of silly (which in retrospect I shouldn’t have: you can’t use the one-click installer, you have to use a docker image, which I don’t know how to do).
I followed this step by step guide that, shockingly, was actually pretty good. The most fraught part is waiting for the DNS stuff to take effect, but that’s true whenever you’re doing anything with domain names, and since Digital Ocean doesn’t handle domain names for you, you’ll need to purchase one elsewhere and point it to your new server. I recommend Gandi.net mostly because it’s no frills, their customer service people are very patient, and they don’t try to sell you any unnecessary crap.
There were two main things that I don’t think that guide called enough attention to, though, probably because they assumed it was obvious. The number of times I have tried to follow a technical guide on the internet and run into trouble because of something that would have been obvious to a professional programmer but was very much not obvious to me (sudo bash commands are only for Linux, but sudo bash commands are being provided in Windows installation directions, wut? whyyyyy). Anyway:
In order to set up mailgun (resources here & here) so that your ghost blog actually functions as a newsletter and not just a blog, you need root access to the config.production.json
(or, I don’t know, maybe you don’t, but this was the method I found and I needed help from my husband for this part) which is fine and dandy and you can do that through the ghost command line tool, but you can also use a program called WinSCP to access the file system.
PS: For the command line tool, when you’re reloading your ghost installation (which you have to do a terrifying number of times, messing with live servers is terrifying, it’s my least favorite part of Ghost), you have to navigate to var/www/ghost
before you reload.
Also, if you run into trouble not being able to change the reply-to email address for your newsletter, double-check your .mx records and check the mailgun logs to see if your email is being suppressed.
Reaction to Setting Up
So, for context, I am a neophyte developer with one hacked together Obsidian theme and one plugin that a lot of people helped me with under my belt. I’ve technically got a ghost installation running on my local machine (more on that in a moment) and that’s a “developers-only” tool, so, sure, fine, we can call me a developer in the technical sense. But my day job is middle school teacher and my hobby is writing fiction; I’m not even an experienced hobbyist coder.
Rolling my own ghost blog was not easy, at least partially because it’s impossible to test most of the complicated parts on a development machine because it’s the mail settings that are tricky. Self-hosting WordPress is a breeze by comparison. I’m pretty sure that publishing a website using a static site generator like Hugo using git would have been easier… although that wouldn’t have gotten me a newsletter.
Email is the hard part.
Digging through the mailgun documentation, figuring out the ghost CLI stuff, etc took me like three days of constant poking, and I never would have succeeded without my husband’s intervention at critical moments. If you’re a non-technical user just trying to run a newsletter that doesn’t make money, and you aren’t worried about customization, use Substack. If you object to Substack’s business model or ethics, check out Buttondown. If you really, really want your newsletter emails to come from your own custom domain on the cheap, while also being able to control what it looks like, and want them to be available through RSS and available on the web, and it matters to you a lot that you can do paid subscriptions?
Ghost is the best way to go.
But! It’s not easy. If I knew then what I knew now, I probably would have just gone with managed hosting via Midnight — it’s slightly more expensive than Ghost official managed hosting for the lower tiers but way cheaper for more subscribers and for tech support.
💚
Update: I wound up in a position where it actually makes sense to me to migrate to
I wound up in a position where it actually makes sense to me to migrate to Ghost (Pro) , since it’s roughly the same price as the Midnight price would be for me, and I prefer to have direct access to the development team for feature requests and stuff. Plus, the concierge service is awesome.
The VS
Though it often gets billed as a WordPress replacement, I think those claims are a little overblown. Ghost’s “managed hosting” is cheaper than WordPress’ technically, but only if you count “managed hosting” to mean literally hosted by WordPress.org. Hosts like Siteground will manage your WordPress installation for way cheaper (and still super easy) than $10/mo, and actually using “self-hosted” WordPress is so much easier than doing updates and such with self-hosted Ghost.
When comparing self-hosted Ghost to self-hosted WordPress, WordPress comes out on top for complex stuff that needs to work “out of the box,” in my opinion. There are way more free themes, there are plugins instead of API integrations, the plugins are actually easy to use, and the search and comments work without a lot of fiddling. You don’t have to fight with APIs or read obscure documentation to do every little thing, and when you search for stuff online, the answers you get are usually pretty straightforward.
The downside is that the WordPress is bloated and can feel really slow. Unbearably slow. Especially if you get a big traffic spike because your article hits the front page of a popular aggregator.
But there have been some little things where I get frustrated at all the hype. I know it’s FOSS software and I can just submit a pull request or “fix it myself,” so I’m not trying to complain at the developers (don’t look a gift horse in the mouth! Ghost is a nonprofit company and deserves a lot of love), I just find it frustrating how it gets shilled as this amazing perfect modern thing with no drawbacks, when really, it’s a great option but different because it prioritizes different things than other apps.
Because there’s basically no way to run a Ghost site for free, its target audience is generally willing to spend money, which means that even something as commenting software usually costs money and is a headache to set up. But in other ways it’s almost impossible to customize, because there are really strong defaults.
In WordPress, I can get a nice overview of recent comments, draft right into an empty textbox, click to open my recent drafts, etc. Ghost currently gives me a chart of member signups and membership information, and a bunch of marketing articles that I can’t get rid of. It’s basically one big advertisement for the “correct” way to run a newsletter, with helpful examples that nonetheless are less helpful after I’ve finished reading them. It also insists on telling me whether someone signed up or unsubscribed and what my growth is looking like.
I agree with Craig Mod: Those kinds of stats can be depressing, even though I get that most people would find these things useful. I’m a weird edge case because I just want to write, not be beat over the head with metrics. You can dig into the code to get rid of it, but you would have to fix it every time you update, which is very annoying. I would much prefer to have a little “x” to clear the nagging lessons on branding that I don’t want to read.
A lot of people really do seem to love it, and with reason: it’s very good at being the thing it’s very good at.
The Good
It’s harder to use than Substack or Buttondown and costs more–so why am I using it?
It lets me control everything, and that matters to me a lot. I wanted a custom domain and to be able to edit my themes and to get help when I needed it.
Self-hosted ghost is pretty good at its one specific niche: being a highly customizable cheap newsletter solution for technically skilled users who want to own their own data, have paid memberships, a bunch of API options (do not make the mistake of confusing the “integrations” with plugins), and a clean interface that doesn’t let you get “bloated” but also isn’t going to hold your hand for things like keyword density or version control or anything really.
It’s not horrible or anything, I just feel like it’s a bit overhyped (and am moderately salty at all the people who call WordPress sites antiquated and imply that everyone should be using Ghost, etc.). I would not embark upon the self-hosting path unless you are a developer, are very close with someone with a lot of development experience who will hold your hand.
Step 3: Local Development
If you’re planning to roll a self-hosted option on your local computer just to try it out (or, you know, play around with editing themes somewhere other than your live server environment that has to be restarted every time you want to look at your updated CSS), beware that the developer version is pretty limited.
You can’t experiment with what the newsletters will look like because you need to be hooked up to mailgun before they’ll even let you preview a newsletter, for example. Also: the documentation currently says that it will work with NodeJS version 14.x.x but this is outdated: you actually need 14.17 – 14.15 didn’t work when I tried to do this, and I spent a fair amount of time banging my head against Google search results trying to figure out how to get npm to let me upgrade NodeJS before I my husband realized that NodeJS can be upgraded on Windows with a one-click-install GUI option.
Anyway. It’s been a wild ride and I’m not sorry I did it, but a couple of people have asked me how using Ghost has been going for me and which guides I used to get it started, and I don’t want to give a false impression that it’s easy for nontechnical users to self-host just because my reputation in the Obsidian community is more on the academic side than the programmer side of things.
I eventually had to stop self-hosting after I ran into a weird edge case that caused billing errors and corrupted databases that took me a week to fix. Ghost Pro got me all fixed up in no time, and the relief I’ve felt every time I ran into a small problem and just… emailed them for support? Instead of having to do everything myself? Has been incredible.