Why Ghost Beats Substack on Your Own Terms
Ghost is an open-source publishing platform built specifically for newsletters and blogs – no algorithmic feed, no platform cut on paid subscriptions, no landlord. When you self-host it, you own the data, the domain, and the revenue relationship with your readers entirely.

What You Need Before You Start
Self-hosting Ghost requires a Linux server – a VPS from a provider like DigitalOcean, Linode, or Vultr works well. The minimum recommended spec is 1GB RAM, though 2GB is more comfortable once traffic picks up and background jobs like email delivery start running. You will also need a domain name pointed at your server and a working mail service for sending newsletters. Ghost supports SMTP directly, or you can plug in a provider like Mailgun or Postmark.
Ghost’s official installation method uses ghost-cli, a command-line tool that handles the full setup including Nginx configuration, SSL certificates via Let’s Encrypt, and systemd service registration. Before running the installer, your server needs Ubuntu 20.04 or 22.04 LTS (Ghost’s officially supported OS), Node.js 18.x, MySQL 8.0, and Nginx already installed. Running the installer on an unsupported environment tends to produce confusing errors that are hard to debug, so sticking to the recommended stack saves time.
Set up a non-root user with sudo privileges before proceeding. Ghost’s installer actively refuses to run as root, which is a sensible security measure. Create a user, grant it sudo access, and log in as that user for the remainder of the process. If you are managing multiple self-hosted services alongside Ghost, keeping user permissions clean from the start prevents headaches later.
Install the prerequisites in order: Node.js via NodeSource (not the default Ubuntu package, which is often outdated), then MySQL, then Nginx. Once those are running, install ghost-cli globally with npm install ghost-cli@latest -g. Create a directory for your Ghost install – typically something like /var/www/ghost – set the correct ownership to your non-root user, navigate into it, and run ghost install. The CLI walks you through the rest interactively, asking for your domain, database credentials, and mail settings.

Configuring Ghost for Real-World Use
After installation, Ghost is accessible at your domain with a default theme called Casper. The admin panel lives at yourdomain.com/ghost, where you complete the initial setup wizard: site title, your admin account, and an optional invite for additional staff. This takes about two minutes and immediately gives you a working blog with a subscription form already built in.
The newsletter configuration is worth spending time on before publishing anything. Under Settings > Email newsletter, you define the sender name, reply-to address, and the default header and footer content that appears in every email. Ghost sends newsletters automatically whenever you publish a post – or you can decouple the two, publishing to the web without sending an email, which is useful for evergreen content you are adding to the archive. The email preview tool inside the editor shows exactly how the message renders before it goes out, which catches formatting issues that only appear in email clients.
Paid memberships are built into Ghost natively through Stripe. Connect your Stripe account under Settings > Memberships, define your monthly and annual pricing tiers, and Ghost handles the subscription logic, payment processing, and access control automatically. Free members see public posts; paid members unlock anything you mark as members-only. There is no middleware or third-party plugin required. Ghost takes no cut of your subscription revenue beyond Stripe’s standard processing fees.
Custom themes follow a Handlebars templating format and can be uploaded as a zip file through the admin panel. Ghost’s theme marketplace has both free and commercial options, and the documentation for building custom themes is thorough if you want full design control. Swapping themes on a live site is non-destructive – your content and member data stay intact. The only thing that changes is the front-end presentation.
For ongoing maintenance, ghost update handles version upgrades through the CLI, and ghost backup exports your content, settings, and member list as a JSON file. That backup file is portable – you can import it into another Ghost instance if you ever migrate servers. Set up a cron job or a simple shell script to run backups on a schedule and copy the output to off-site storage. Ghost does not manage this for you automatically, so it falls entirely on the administrator.
The Practical Trade-Off Nobody Mentions
Self-hosted Ghost gives you complete control, but email deliverability is not automatic. Your server’s IP address has no sending reputation by default, and newsletters sent from a cold IP land in spam folders at a high rate. The standard fix is routing outbound email through a transactional mail service – Mailgun, Postmark, or Amazon SES all work – rather than sending directly from your server. Each service has its own SMTP credential format; Ghost’s mail settings accept them all through the same configuration field.

The other trade-off is support. Ghost(Pro), the managed hosting version, comes with a support team. Self-hosted Ghost comes with the Ghost Forum and your own debugging skills. For most technical users that is a reasonable exchange for not paying platform fees on subscription revenue – but it means that when something breaks at 11pm, you are the one reading error logs. Ghost’s logs live at content/logs/ inside your install directory, and ghost doctor runs a diagnostic check that catches most common configuration problems before they become serious.





