{"id":81944,"date":"2026-06-18T07:15:00","date_gmt":"2026-06-18T14:15:00","guid":{"rendered":"https:\/\/dhblog.dream.press\/blog\/?p=81944"},"modified":"2026-06-18T07:15:15","modified_gmt":"2026-06-18T14:15:15","slug":"ghost-self-hosted","status":"publish","type":"post","link":"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/","title":{"rendered":"Self-Host Ghost CMS: The Complete Guide"},"content":{"rendered":"<div class=\"tldr-block\" style=\"display: none;\">\n\t<div class=\"svg\">\n\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 119.25 37.8\">\n\t<g>\n\t\t<g>\n\t\t\t<path fill=\"#ffffff\" d=\"M23.4,6.93h-8.1v24.57h-7.2V6.93H0V0h23.4v6.93Z\" \/>\n\t\t\t<path fill=\"#ffffff\" d=\"M45,24.57v6.93h-18.45V0h7.2v24.57h11.25Z\" \/>\n\t\t\t<path fill=\"#ffffff\"\n\t\t\t\td=\"M90.9,15.75c0,8.91-6.61,15.75-15.3,15.75h-12.6V0h12.6c8.68,0,15.3,6.84,15.3,15.75ZM83.97,15.75c0-5.4-3.42-8.82-8.37-8.82h-5.4v17.64h5.4c4.95,0,8.37-3.42,8.37-8.82Z\" \/>\n\t\t\t<path fill=\"#ffffff\"\n\t\t\t\td=\"M105.57,21.15h-3.42v10.35h-7.2V0h12.6c5.98,0,10.8,4.81,10.8,10.8,0,3.87-2.34,7.38-5.81,9.13l6.71,11.56h-7.74l-5.94-10.35ZM102.15,14.85h5.4c1.98,0,3.6-1.75,3.6-4.05s-1.62-4.05-3.6-4.05h-5.4v8.1Z\" \/>\n\t\t<\/g>\n\t\t<path\n\t\t\tfill=\"#0173ec\"\n\t\t\td=\"M53.97,37.8h-5.4l1.8-13.27h7.2l-3.6,13.27ZM49.02,12.55c0-2.34,1.93-4.27,4.27-4.27s4.27,1.94,4.27,4.27-1.93,4.27-4.27,4.27-4.27-1.94-4.27-4.27Z\"\n\t\t \/>\n\t<\/g>\n<\/svg>\n\t<\/div>\n\t<div class=\"tldr-wrap\">\n\t\t\n\n<p class=\"wp-block-paragraph\">Self-hosting Ghost means running the open-source Ghost CMS on a server you control instead of paying Ghost(Pro) or giving Substack 10% of your subscription revenue.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The recommended stack runs on Ubuntu with Node, MySQL 8, and a reverse proxy. A 4 GB VPS is enough for a newsletter with around 10,000 subscribers and 50,000 monthly visits.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Expect to spend about $15\u2013$30 a month for everything: VPS, domain, and Mailgun. That\u2019s cheaper than Ghost(Pro) Publisher at $29 per month or Substack\u2019s 13\u201316% revenue cut once Stripe fees are included.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go the self-hosting route if you&#8217;re comfortable with basic command-line work and server maintenance and have a newsletter generating at least $250 per month.<\/p>\n\n\n\t<\/div>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Since when does \u201cowning your audience\u201d mean owing a SaaS company for every subscriber?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a newsletter pulling $5,000 a month in paid subscriptions, Substack&#8217;s 10% cut is $6,000 a year \u2014 and closer to $8,000 once Stripe fees stack on top.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In January 2024, <a target=\"_blank\" href=\"https:\/\/www.platformer.news\/why-platformer-is-leaving-substack\/\">Casey Newton&#8217;s Platformer left Substack<\/a> for self-hosted Ghost and said the move would save the publication &#8220;tens of thousands of dollars a year.&#8221;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/hosting\/self-managed-vps\/ghost\/\">Self-hosting Ghost<\/a> is the version of &#8220;owning your audience&#8221; you can actually price. You install the <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/open-source-vs-proprietary\/\">open-source software<\/a>, point your domain at it, and the only fees go to your <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/beginners-guide-vps\/\">virtual private server<\/a> (VPS), registrar, and email vendor. No platform takes a cut.<\/p>\n\n\n\n<h2 id=\"h-what-is-self-hosted-ghost\" class=\"wp-block-heading\">What Is Self-Hosted Ghost?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosted Ghost is the open-source version of the Ghost publishing platform installed on a server you own and operate. It&#8217;s the same software that powers Ghost(Pro), Ghost&#8217;s managed hosting service, running on infrastructure you control.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ghost is MIT-licensed, lives on <a target=\"_blank\" href=\"https:\/\/github.com\/TryGhost\/Ghost\">GitHub<\/a>, and has been open source since launch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Three deployment paths exist for Ghost:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Ghost(Pro):<\/strong> Ghost&#8217;s official managed hosting at $15, $29, or $199 a month for annual subscriptions. If you go this route, Ghost handles updates, email infrastructure, and uptime.<\/li>\n\n\n\n<li><strong>Self-hosted on your own VPS:<\/strong> You provision a Linux server, install Ghost, and run it yourself. This guide explains how it works.&nbsp;<\/li>\n\n\n\n<li><strong>Managed self-hosting via third parties:<\/strong> Services like Pikapods or MagicPages run Ghost for you. They\u2019re cheaper than Ghost(Pro) and require less work than self-hosting, but you don\u2019t have root access.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;Self-hosted Ghost&#8221; almost always means option two: Ghost on a VPS you administer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No platform fee, no member cap, no theme constraints, full database access.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The trade-off is that you\u2019ll need to restart the service when MySQL crashes after an Ubuntu kernel update. (<em>Yes, that is English<\/em>.)<\/p>\n\n\n\n<h2 id=\"h-why-self-host-ghost-instead-of-using-substack-or-ghost-pro\" class=\"wp-block-heading\">Why Self-Host Ghost Instead of Using Substack or Ghost(Pro)?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosting Ghost makes financial sense once paid subscription revenue crosses roughly $250 a month.<br><br>Below that, Substack&#8217;s free tier costs nothing absolute, and the 10% bite is small. Above it, Substack&#8217;s revenue share costs more than a VPS, often by a factor of five or more.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Platform<\/strong><\/th><th><strong>Monthly cost (annual plan)<\/strong><\/th><th><strong>Revenue share<\/strong><\/th><th><strong>Member limit<\/strong><\/th><th><strong>Custom domain<\/strong><\/th><th><strong>Custom theme<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Substack<\/td><td>$0<\/td><td>10% + Stripe processing fees (~13\u201316% effective)*<\/td><td>Unlimited<\/td><td>Yes (paid)<\/td><td>No<\/td><\/tr><tr><td>Ghost(Pro) Starter**<\/td><td>$15 (yearly billing)<\/td><td>0%<\/td><td>1,000<\/td><td>Yes<\/td><td>No<\/td><\/tr><tr><td>Ghost(Pro) Publisher<\/td><td>$29 (yearly billing)<\/td><td>0%<\/td><td>1,000<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><tr><td>Ghost(Pro) Business<\/td><td>$199 (yearly billing)<\/td><td>0%<\/td><td>10,000<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><tr><td>Self-hosted Ghost<\/td><td>~$15\u2013$30<\/td><td>0%<\/td><td>Unlimited<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><tr><td colspan=\"6\">* ~2.9% + $0.30 per transaction, plus a 0.7% fee for recurring subscriptions** Ghost(Pro) Starter supports free newsletter subscribers only. Paid memberships and subscription revenue require Publisher or above.&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ghost(Pro) tiers come from <a target=\"_blank\" href=\"https:\/\/ghost.org\/pricing\/\">Ghost&#8217;s pricing page<\/a>. Substack&#8217;s 10% comes from <a target=\"_blank\" href=\"https:\/\/support.substack.com\/hc\/en-us\/articles\/360037607131-How-much-does-Substack-cost\">Substack&#8217;s help center<\/a>. The &#8220;13\u201316% effective&#8221; accounts for Stripe&#8217;s 2.9% + $0.30 card processing, plus the <a target=\"_blank\" href=\"https:\/\/stripe.com\/billing\/pricing\">0.7% Stripe Billing recurring fee<\/a> that lands on every subscription charge.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here\u2019s an <a target=\"_blank\" href=\"https:\/\/ghost.org\/vs\/substack\/\">example from Ghost<\/a>:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A newsletter with 1,000 paying subscribers at $5\/month earns $60,000 a year.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>On Substack, the platform fee alone is $6,000.&nbsp;<\/li>\n\n\n\n<li>On Ghost(Pro) Publisher, it\u2019s $348.&nbsp;<\/li>\n\n\n\n<li>On a self-hosted 4 GB VPS plus Mailgun, it\u2019s roughly $660 a year ($20 VPS + $35 Mailgun \u00d7 12).&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s a $5,300 swing per year on a single newsletter at a modest scale.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Substack is free until you make money. Once you do, the cut grows with your revenue.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ghost inverts that model: you pay a flat monthly rate, and your revenue stays yours no matter how much you earn.<\/p>\n\n\n\n<div class=\"article-newsletter article-newsletter--gradient\">\n\n\n<h2>Get Content Delivered Straight to Your Inbox<\/h2><p>Subscribe now to receive all the latest updates, delivered directly to your inbox.<\/p><form class=\"nwsl-form\" id=\"newsletter_block_\" novalidate><div class=\"messages\"><\/div><div class=\"form-group\"><label for=\"input_newsletter_block_\"><input type=\"email\"name=\"email\"id=\"input_newsletter_block_\"placeholder=\"Enter your email address\"novalidatedisabled=\"disabled\"\/><\/label><button type=\"submit\"class=\"btn btn--brand\"disabled=\"disabled\"><span>Sign Me Up!<\/span><svg width=\"21\" height=\"14\" viewBox=\"0 0 21 14\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n<path d=\"M13.8523 0.42524L12.9323 1.34521C12.7095 1.56801 12.7132 1.9304 12.9404 2.14865L16.7241 5.7823H0.5625C0.251859 5.7823 0 6.03416 0 6.3448V7.6573C0 7.96794 0.251859 8.2198 0.5625 8.2198H16.7241L12.9405 11.8535C12.7132 12.0717 12.7095 12.4341 12.9323 12.6569L13.8523 13.5769C14.072 13.7965 14.4281 13.7965 14.6478 13.5769L20.8259 7.39879C21.0456 7.17913 21.0456 6.82298 20.8259 6.60327L14.6477 0.42524C14.4281 0.205584 14.0719 0.205584 13.8523 0.42524Z\" fill=\"white\"\/>\n<\/svg>\n<\/button><\/div><\/form><\/div>\n\n\n<h2 id=\"h-what-are-the-system-requirements-for-self-hosting-ghost\" class=\"wp-block-heading\">What Are the System Requirements for Self-Hosting Ghost?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The software runs on Ubuntu with Node.js, MySQL 8, and a reverse proxy. <a href=\"https:\/\/docs.ghost.org\/install\" target=\"_blank\">Ghost&#8217;s official install docs<\/a> put the floor at a Linux server with at least 1 GB of RAM, though the <a href=\"https:\/\/docs.ghost.org\/install\/docker\" target=\"_blank\">Docker Compose preview docs<\/a> use a 2 GB \/ 1 CPU droplet as their baseline example.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Treat that as the <em>real<\/em> minimum, not the marketed one.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s how those requirements break down and what they mean in practice:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Component<\/strong><\/th><th><strong>Required<\/strong><\/th><th><strong>Notes<\/strong><\/th><\/tr><\/thead><tbody><tr><td>OS<\/td><td>Ubuntu 22.04 or 24.04 LTS<\/td><td>Ghost-CLI is Ubuntu-only<\/td><\/tr><tr><td>Node.js<\/td><td>Per Ghost&#8217;s current install docs<\/td><td>Ghost pins the version per release<\/td><\/tr><tr><td>MySQL<\/td><td>8.0<\/td><td>No MariaDB, no SQLite, no PostgreSQL<\/td><\/tr><tr><td>Reverse proxy<\/td><td>Nginx (Ghost-CLI) or Caddy (Docker)<\/td><td>Handles HTTPS and routing<\/td><\/tr><tr><td>Email<\/td><td>Mailgun (bulk) + SMTP (transactional)<\/td><td>Mandatory if you send<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A reverse proxy is the public front door to your server. It accepts HTTPS traffic, terminates encryption, and hands requests off to Ghost on a private port.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The &#8220;1 GB minimum&#8221; is true for a Ghost site that only serves posts. Add a newsletter, Mailgun, ActivityPub, Web Analytics, and RAM goes up.<br><br>Our <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/hosting\/self-managed-vps\/nextcloud\/\">Self-Managed VPS line<\/a> features NVMe storage, full root access, unmetered bandwidth, and predictable pricing. For most Ghost installs, we recommend starting with Stack 4 and scaling up only when your traffic or subscriber count demands it; most newsletters never need more.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Stack 8 is there when you&#8217;re running higher-traffic publications or have ActivityPub federation turned on.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now let\u2019s see how DreamHost Stack tiers map to real-world Ghost workloads:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Scenario<\/strong><\/th><th><strong>RAM<\/strong><\/th><th><strong>DreamHost tier<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Personal blog, no newsletter<\/td><td>1\u20132 GB<\/td><td>Stack 4&nbsp;<\/td><\/tr><tr><td>Newsletter under 10,000 subscribers, ~50,000 monthly visits<\/td><td>4 GB<\/td><td>Stack 4<\/td><\/tr><tr><td>10,000+ subscribers, multiple publications, or ActivityPub*&nbsp;<\/td><td>8 GB<\/td><td>Stack 8<\/td><\/tr><tr><td colspan=\"3\">* Full ActivityPub self-hosting requires the Docker Compose install path, not Ghost-CLI<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">CPU matters far less than RAM for Ghost \u2014 newsletters are write-light and read-cacheable. NVMe only becomes relevant when MySQL is under pressure, typically past 25,000 subscribers.<\/p>\n\n\n\n<h2 id=\"h-how-do-you-install-ghost-on-a-vps\" class=\"wp-block-heading\">How Do You Install Ghost on a VPS?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There are two ways to install Ghost on a VPS.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The go\u2011to option for production setups is <a target=\"_blank\" href=\"https:\/\/docs.ghost.org\/ghost-cli\">Ghost\u2011CLI<\/a>; it\u2019s stable and well\u2011supported. The newer <a target=\"_blank\" href=\"https:\/\/docs.docker.com\/compose\/\">Docker Compose setup<\/a> is still in preview, but it\u2019s expected to become the default soon.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Before getting started, double\u2011check the official Ghost install docs, as major version updates often introduce breaking changes.<\/p>\n\n\n\n<h3 id=\"h-method-1-ghost-cli-the-established-path\" class=\"wp-block-heading\">Method 1: Ghost-CLI (the Established Path)<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1600\" height=\"1845\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_simple_ghost_cli_installation.webp\" alt=\"Simple Ghost-CLI Installation\" class=\"wp-image-81947 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_simple_ghost_cli_installation.webp 1600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_simple_ghost_cli_installation-260x300.webp 260w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_simple_ghost_cli_installation-888x1024.webp 888w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_simple_ghost_cli_installation-768x886.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_simple_ghost_cli_installation-1332x1536.webp 1332w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_simple_ghost_cli_installation-600x692.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_simple_ghost_cli_installation-1200x1384.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_simple_ghost_cli_installation-730x842.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_simple_ghost_cli_installation-1460x1684.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_simple_ghost_cli_installation-784x904.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_simple_ghost_cli_installation-1568x1808.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01_simple_ghost_cli_installation-877x1011.webp 877w\" data-sizes=\"(max-width: 1600px) 100vw, 1600px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1600px; --smush-placeholder-aspect-ratio: 1600\/1845;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ghost-CLI has been the official install method since Ghost 1.0 and is still what Ghost recommends in mid-2026.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Provision an Ubuntu 22.04 or 24.04 server with at least 2 GB of RAM. At DreamHost, we recommend provisioning at least 4 GB of RAM if you&#8217;re planning to send newsletters.&nbsp;<\/li>\n\n\n\n<li>Point your domain&#8217;s A record at the server&#8217;s IP address.<\/li>\n\n\n\n<li>SSH into the server. SSH (Secure Shell) is the encrypted command-line connection to your VPS.<\/li>\n\n\n\n<li>Install Node.js, MySQL 8, and Nginx via apt.<\/li>\n\n\n\n<li>Create a non-root user. Ghost-CLI won&#8217;t install as root, and that&#8217;s a good thing.<\/li>\n\n\n\n<li>Run <code>`npm install ghost-cli@latest -g.`<\/code><\/li>\n\n\n\n<li>Run <code>`ghost install`<\/code> and answer the prompts (domain, MySQL password, and email).<\/li>\n\n\n\n<li>Visit \u201chttps:\/\/yourdomain.com\/ghost\/\u201d and create your admin account.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Ghost-CLI handles the <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/your-connection-is-not-private\/\">Secure Sockets Layer (SSL) certificate<\/a> via Let&#8217;s Encrypt, configures Nginx, and starts Ghost as a systemd service. Most installs take 15 to 30 minutes.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For the apt commands, Nginx setup, and systemd config, follow the <a target=\"_blank\" href=\"https:\/\/docs.ghost.org\/install\/ubuntu\/\">official Ghost install guide<\/a>.<\/p>\n\n\n\n<h3 id=\"h-method-2-docker-compose-ghost-s-preview-path\" class=\"wp-block-heading\">Method 2: Docker Compose (Ghost&#8217;s Preview Path)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ghost is currently testing a &#8220;batteries-included&#8221; Docker Compose stack that bundles Ghost, MySQL 8, and Caddy into one <code>`docker compose up -d`<\/code> command. This is expected to become the default install method, but it&#8217;s not quite there yet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s how to get it running:&nbsp;<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Provision an Ubuntu server with Docker 20.10.13 or higher.<\/li>\n\n\n\n<li>Clone Ghost&#8217;s reference Docker Compose configuration.<\/li>\n\n\n\n<li>Generate strong MySQL passwords with <code>`openssl rand -hex 32`<\/code>. <strong>Ghost&#8217;s docs warn that database environment variables can&#8217;t be changed after the first boot, so set them carefully the first time.<\/strong><\/li>\n\n\n\n<li>Edit the Caddyfile to point at your domain.<\/li>\n\n\n\n<li>Run <code>`docker compose pull &amp;&amp; docker compose up -d.`<\/code><\/li>\n\n\n\n<li>Visit \u201chttps:\/\/yourdomain.com\/ghost\/\u201d to create the admin user.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/what-is-docker\/\">Docker path<\/a> is faster to spin up and easier to upgrade in place.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A potential drawback is that you\u2019ll find fewer community troubleshooting guides, and since it\u2019s still in preview, you might run into edge cases that break in ways the Ghost\u2011CLI install wouldn\u2019t.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Both methods handle HTTPS through Let\u2019s Encrypt and automatically renew certificates on a cron job. Automatic doesn&#8217;t mean guaranteed, though, so confirm renewal is working around day 60, well before the 90-day expiration.<\/p>\n\n\n\n<h2 id=\"h-how-do-you-set-up-email-for-a-self-hosted-ghost-newsletter\" class=\"wp-block-heading\">How Do You Set Up Email for a Self-Hosted Ghost Newsletter?<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1600\" height=\"1274\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_two_email_paths_in_ghost.webp\" alt=\"Two email paths in Ghost\" class=\"wp-image-81948 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_two_email_paths_in_ghost.webp 1600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_two_email_paths_in_ghost-300x239.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_two_email_paths_in_ghost-1024x815.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_two_email_paths_in_ghost-768x612.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_two_email_paths_in_ghost-1536x1223.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_two_email_paths_in_ghost-600x478.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_two_email_paths_in_ghost-1200x956.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_two_email_paths_in_ghost-730x581.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_two_email_paths_in_ghost-1460x1163.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_two_email_paths_in_ghost-784x624.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_two_email_paths_in_ghost-1568x1249.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02_two_email_paths_in_ghost-877x698.webp 877w\" data-sizes=\"(max-width: 1600px) 100vw, 1600px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1600px; --smush-placeholder-aspect-ratio: 1600\/1274;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosted Ghost needs two separate email setups. Bulk newsletters <a target=\"_blank\" href=\"https:\/\/docs.ghost.org\/faq\/mailgun-newsletters\/\">run through Mailgun<\/a>, the only bulk provider Ghost integrates with.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Transactional emails like password resets, signup confirmations, and welcome messages can use any standard SMTP provider. This is the part most install guides skim over. Get it wrong, and your subscribers will notice before you do.<\/p>\n\n\n\n<h3 id=\"h-bulk-newsletter-email-mailgun\" class=\"wp-block-heading\">Bulk Newsletter Email (Mailgun)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Connecting Mailgun is mostly a <a href=\"https:\/\/help.dreamhost.com\/hc\/en-us\/articles\/218672058-Configuring-DNS-for-your-domains\" target=\"_blank\">DNS configuration<\/a> job. Set it up once, and you won&#8217;t need to touch it again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Simply follow these steps:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create a Mailgun account and add a sending subdomain (`mail.yourdomain.com` is conventional).<\/li>\n\n\n\n<li>Add the SPF, DKIM, and DMARC records from Mailgun to your DNS provider. These three records tell email providers like Gmail and Outlook that your messages are legitimate.<\/li>\n\n\n\n<li>Wait for DNS to propagate so Mailgun can verify the domain.<\/li>\n\n\n\n<li>Drop your Mailgun API key and sending domain into Ghost Admin under <em>Settings<\/em> &gt; <em>Email newsletter<\/em>.<\/li>\n\n\n\n<li>Send a test newsletter and check Gmail headers to confirm SPF\/DKIM\/DMARC pass.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Mailgun&#8217;s 2026 pricing is straightforward.&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Foundation:<\/strong> $35\/month, 50,000 sends, $1.30 per additional 1,000 emails.<\/li>\n\n\n\n<li><strong>Scale:<\/strong> $90\/month, 100,000 sends, $1.10 per additional 1,000 emails.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A newsletter that goes out twice a week to 5,000 subscribers lands at 40,000 sends, which fits well within the Foundation tier. At 10,000 subscribers, that doubles to 80,000 sends \u2014 at which point you&#8217;re either paying $74 on Foundation with overage or moving to Scale at $90 flat.<\/p>\n\n\n\n<h3 id=\"h-transactional-email-smtp\" class=\"wp-block-heading\">Transactional Email (SMTP)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For transactional email, add your SMTP credentials to your Ghost environment variables (or config.production.json for Ghost-CLI installs) by setting mail__transport=SMTP.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Any provider with a port 587 endpoint works, including Mailgun, SendGrid, Postmark, or Amazon Simple Email Service (SES). Most creators just reuse Mailgun for both, since transactional volume is a fraction of newsletter sends.&nbsp;<\/p>\n\n\n\n<h2 id=\"h-how-much-does-it-really-cost-to-self-host-ghost\" class=\"wp-block-heading\">How Much Does It Really Cost to Self-Host Ghost?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A typical self-hosted Ghost newsletter costs $15 to $30 a month. That covers your VPS, domain, and Mailgun.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By comparison, Ghost(Pro) Publisher runs $29 a month flat, while Substack takes around 13\u201316% of every paid subscription.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With self-hosting, your costs scale with <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/grow-your-email-list\/\">your subscriber count<\/a>. Ghost(Pro) and Substack scale with revenue.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s what self-hosting typically costs, broken down by component:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Component<\/strong><\/th><th><strong>Monthly cost<\/strong><\/th><th><strong>Notes<\/strong><\/th><\/tr><\/thead><tbody><tr><td>VPS (4 GB, e.g., Stack 4)<\/td><td>Confirm with your provider<\/td><td>Comparable 4 GB VPS services run $12\u2013$25\/month.DreamHost Self-Managed VPS pricing to be confirmed.<\/td><\/tr><tr><td>Domain<\/td><td>~$1<\/td><td>~$9.99\/year for .com domains<\/td><\/tr><tr><td>Mailgun (Foundation)<\/td><td>$35<\/td><td>50,000 emails\/monthFirst month free<\/td><\/tr><tr><td>Backups + monitoring<\/td><td>$0\u2013$5<\/td><td>Provider-dependent<\/td><\/tr><tr><td><strong>Total typical<\/strong><\/td><td><strong>$15\u2013$30<\/strong> before newsletters<strong>$50\u2013$80<\/strong> at scale<\/td><td>For a newsletter under 10,000 subscribers<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The $15\u2013$30 figure covers a Ghost site with <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/how-to-write-blog-posts\/\">blog posts<\/a> and a free-tier newsletter. A paid newsletter sending two weekly issues to thousands of subscribers lands closer to $50 to $80 a month, which is still cheaper than Substack at the same revenue.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here\u2019s where the cost differences between platforms become most noticeable:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Under $250\/month MRR (monthly recurring revenue):<\/strong> Substack&#8217;s free tier is structurally cheaper than running anything yourself.&nbsp;<\/li>\n\n\n\n<li><strong>$250\u2013$1,500\/month MRR:<\/strong> Self-hosted breaks even quickly. The 10% Substack take is now bigger than your VPS bill.<\/li>\n\n\n\n<li><strong>Over $1,500\/month MRR or 10,000+ subscribers:<\/strong> Self-hosted saves real money. Ghost(Pro) Business at $199 is a reasonable middle path if you want managed hosting without the revenue cut.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A $20\/month VPS is less than the Stripe processing fee on a single $200 paid subscription. <em>That<\/em>\u2019s what you trade away by staying on Substack.<\/p>\n\n\n\n<h2 id=\"h-when-is-self-hosting-ghost-the-wrong-call\" class=\"wp-block-heading\">When Is Self-Hosting Ghost the Wrong Call?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosting Ghost is the wrong call if you&#8217;ve never used a command line, your newsletter earns under $250 a month, or you&#8217;d rather focus on writing than maintaining a server. Sometimes the right answer is a managed service, and pretending otherwise just wastes your time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Below are some specific situations where self-hosting fails the cost-benefit test:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>First-time website owner.<\/strong> Start with Ghost(Pro) at $15\/month or stay on Substack until you have revenue worth defending. The skills you don&#8217;t have yet won&#8217;t surface during launch week.<\/li>\n\n\n\n<li><strong>Newsletter under $250\/month MRR.<\/strong> Until your 10% bite is bigger than a $20-a-month VPS, stay where you are.<\/li>\n\n\n\n<li><strong>Not comfortable with SSH and basic Linux.<\/strong> Self-hosting means you&#8217;re the person at 11 PM on a Saturday running <code>`journalctl -u ghost`<\/code> because subscribers can&#8217;t log in.<\/li>\n\n\n\n<li><strong>You won&#8217;t tolerate occasional outages.<\/strong> MySQL can run out of memory after a kernel patch, and Caddy updates can break admin routes. These things don&#8217;t happen often, but they do happen \u2014 and none of them are your problem on Ghost(Pro).<\/li>\n\n\n\n<li><strong>You need phone support during a crisis.<\/strong> <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/best-vps-hosting\/\">VPS hosting<\/a> typically includes ticket and callback support, but not a 24\/7 phone line. If &#8220;I need a human right now&#8221; is your stress response, managed hosting was built for you.<\/li>\n\n\n\n<li><strong>You&#8217;re approaching 50,000 sends a month and have never configured SPF, DKIM, or DMARC. <\/strong>Deliverability issues can easily cost more than Ghost(Pro) Business&#8217;s $199 plan. A fresh Mailgun IP takes weeks to season into Gmail&#8217;s good graces, and Ghost(Pro) is the better call for a launch that can\u2019t survive that delay.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If you earn more than $250\/month in paid subscriptions, want full control over the database and themes, and are comfortable enough with a terminal that <code>`ghost update`<\/code> doesn&#8217;t trigger anxiety, <a href=\"https:\/\/www.dreamhost.com\/blog\/self-hosting\/\" target=\"_blank\">self-hosting<\/a> pays for itself the day you finish the install.<\/p>\n\n\n\n<h2 id=\"h-how-do-you-migrate-a-substack-newsletter-to-self-hosted-ghost\" class=\"wp-block-heading\">How Do You Migrate a Substack Newsletter to Self-Hosted Ghost?<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1600\" height=\"1481\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_cancel_substack_last.webp\" alt=\"Cancel Substack Last\" class=\"wp-image-81949 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_cancel_substack_last.webp 1600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_cancel_substack_last-300x278.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_cancel_substack_last-1024x948.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_cancel_substack_last-768x711.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_cancel_substack_last-1536x1422.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_cancel_substack_last-600x555.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_cancel_substack_last-1200x1111.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_cancel_substack_last-730x676.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_cancel_substack_last-1460x1351.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_cancel_substack_last-784x726.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_cancel_substack_last-1568x1451.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03_cancel_substack_last-877x812.webp 877w\" data-sizes=\"(max-width: 1600px) 100vw, 1600px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1600px; --smush-placeholder-aspect-ratio: 1600\/1481;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ghost includes a built-in Substack importer that moves posts, members, paid subscriptions, and Stripe billing to your self-hosted Ghost site without breaking payment continuity. The migration takes most creators a weekend.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here\u2019s how to do it:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Export your Substack archive from publication settings. You\u2019ll get a CSV of members and a ZIP of posts.<\/li>\n\n\n\n<li>Open Ghost Admin and go to <em>Settings<\/em> &gt; <em>Migration<\/em> &gt; <em>Import\/Export <\/em><em><br><\/em><a target=\"_blank\" href=\"https:\/\/docs.ghost.org\/migration\/substack\/\">Select Substack<\/a> from the list of options.<\/li>\n\n\n\n<li>Reconnect your Stripe account inside Ghost. Subscriptions transfer automatically, and paying subscribers won\u2019t be re\u2011billed. Note that Substack continues collecting its 10% fee on those existing subscriptions until each subscriber\u2019s billing cycle renews under Ghost.<\/li>\n\n\n\n<li>Update DNS to point your custom domain to the Ghost server.<\/li>\n\n\n\n<li>Cancel Substack only after you&#8217;ve sent at least one newsletter from Ghost and confirmed deliverability.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Ghost&#8217;s <a target=\"_blank\" href=\"https:\/\/docs.ghost.org\/migration\/substack\/\">Substack migration docs<\/a> cover edge cases, and Molly White&#8217;s <a target=\"_blank\" href=\"https:\/\/www.citationneeded.news\/substack-to-self-hosted-ghost\/\"><em>Citation Needed <\/em>walkthrough<\/a> explains the gotchas of a midweek production migration.&nbsp;<\/p>\n\n\n\n<h2 id=\"h-should-you-ghost-substack\" class=\"wp-block-heading\">Should You Ghost Substack?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosting Ghost makes sense once paid subscription revenue crosses about $250 a month. Below that, Substack costs nothing. Above it, the platform fee is often the most expensive line item in the business. Ghost erases that line.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you choose to self\u2011host, you\u2019ll be the one patching Ubuntu and watching MySQL memory usage. In return, you keep every dollar your subscribers pay. Whether that trade\u2011off is worth it is up to you.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Multiply the platform fee by 12 and decide.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Then get back to writing instead of procrastinating by reading this article.<\/em><\/p>\n\n\n\n\n<div class=\"article-cta-shared article-cta-small article-cta--product\">\n\t<div class=\"tr-img-wrap-outer jsLoading\"><img decoding=\"async\" class=\"js-img-lazy \" src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/themes\/blog2018\/assets\/img\/lazy-loading-transparent.webp\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/cta_image_a-877x522.webp 1x, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/cta_image_a.webp 2x\"  \/><\/div>\n\n\t<a href='https:\/\/www.dreamhost.com\/hosting\/self-managed-vps\/' class='link-top' target='_blank' rel='noopener noreferrer'>\n\t\t<span>Self-Managed VPS<\/span>\n\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 384 512\" width=\"15\"><path d=\"M342.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-192 192c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L274.7 256 105.4 86.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l192 192z\"\/><\/svg>\n\t<\/a>\n\n\t<div class=\"content-btm\">\n\t\t<h2 class=\"h2--md\">\n\t\t\tOwn Your Entire Stack. Apps, AI, Databases, and More.\n\t\t<\/h2>\n\t\t<p class=\"p--md\">\n\t\t\tKeep every credential and conversation on a server you control, with NVMe speed and unmetered bandwidth built in.\n\t\t<\/p>\n\n\t\t        <a\n            href=\"https:\/\/www.dreamhost.com\/hosting\/self-managed-vps\/\"\n                        class=\"btn btn--white-outline btn--sm btn--round\"\n                                    target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            >\n                            Explore Self-Managed VPS Plans                    <\/a>\n\n\t<\/div>\n<\/div>\n\n\n<h2 id=\"h-frequently-asked-questions-about-self-hosting-ghost\" class=\"wp-block-heading\">Frequently Asked Questions About Self-Hosting Ghost<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Still on the fence? Here are some questions most creators have before switching to self-hosted Ghost.<\/p>\n\n\n\n<h3 id=\"h-is-ghost-cms-free-to-self-host\" class=\"wp-block-heading\">Is Ghost CMS free to self-host?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, Ghost is free and open source under the MIT license. Self-hosting costs only the server, domain, and email service you choose, typically $15 to $80 a month, depending on subscriber count.<\/p>\n\n\n\n<h3 id=\"h-how-much-ram-does-self-hosted-ghost-need\" class=\"wp-block-heading\">How much RAM does self-hosted Ghost need?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosted Ghost needs at least 1 GB of RAM for a personal blog and 4 GB for a newsletter with 10,000+ subscribers. DreamHost Self-Managed VPS Stack 4 (4 GB) covers the newsletter baseline. Stack 8, on the other hand, handles high-traffic publications or ActivityPub federation.<\/p>\n\n\n\n<h3 id=\"h-should-i-use-docker-compose-or-ghost-cli\" class=\"wp-block-heading\">Should I use Docker Compose or Ghost-CLI?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use Ghost-CLI for production. It&#8217;s the established path Ghost recommends and has the most community troubleshooting content.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Docker\u202fCompose remains Ghost\u2019s preview install method as of\u202f2026. Choose it only if you\u2019re comfortable experimenting on the leading edge.<\/p>\n\n\n\n<h3 id=\"h-does-self-hosted-ghost-include-email\" class=\"wp-block-heading\">Does self-hosted Ghost include email?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No, self-hosted Ghost requires bringing your own email. Mailgun is the only bulk provider Ghost integrates with for newsletters (Foundation tier $35\/month for 50,000 sends). Transactional mail uses any SMTP provider.<\/p>\n\n\n\n<h3 id=\"h-how-does-ghost-compare-to-substack-on-cost\" class=\"wp-block-heading\">How does Ghost compare to Substack on cost?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ghost takes 0% of subscription revenue versus Substack&#8217;s 10% (effectively 13\u201316% after Stripe fees). A newsletter earning $60,000 a year keeps roughly $5,000 more on Ghost. Break-even versus a self-hosted server lands around $250\/month MRR.<\/p>\n\n\n\n<h3 id=\"h-can-i-migrate-from-substack-to-self-hosted-ghost\" class=\"wp-block-heading\">Can I migrate from Substack to self-hosted Ghost?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, Ghost has a built-in Substack importer that moves posts, members, paid subscriptions, and Stripe billing to a self-hosted Ghost site. Paying subscribers keep their Stripe cards intact during migration.<\/p>\n\n\n\n<h3 id=\"h-is-self-hosting-ghost-worth-it\" class=\"wp-block-heading\">Is self-hosting Ghost worth it?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Self-hosting Ghost is worth it if you have basic command-line comfort and a paid newsletter earning more than $250\/month. Below that line, Substack&#8217;s free tier or Ghost(Pro) Starter at $15 costs less time and roughly the same amount of money.<\/p>\n\n\n<p><script type=\"application\/ld+json\"><br \/>\n{<br \/>\n  \"@context\": \"https:\/\/schema.org\",<br \/>\n  \"@graph\": [<br \/>\n    {<br \/>\n      \"@type\": \"FAQPage\",<br \/>\n      \"mainEntity\": [<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"Is Ghost CMS free to self-host?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Yes, Ghost is free and open source under the MIT license. Self-hosting costs only the server, domain, and email service you choose, typically $15 to $80 a month, depending on subscriber count.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"How much RAM does self-hosted Ghost need?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Self-hosted Ghost needs at least 1 GB of RAM for a personal blog and 4 GB for a newsletter with 10,000+ subscribers. DreamHost Self-Managed VPS Stack 4 (4 GB) covers the newsletter baseline. Stack 8 handles high-traffic publications or ActivityPub federation.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"Should I use Docker Compose or Ghost-CLI?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Use Ghost-CLI for production. It's the established path Ghost recommends and has the most community troubleshooting content. Docker Compose remains Ghost's preview install method as of 2026. Choose it only if you're comfortable experimenting on the leading edge.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"Does self-hosted Ghost include email?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"No, self-hosted Ghost requires bringing your own email. Mailgun is the only bulk provider Ghost integrates with for newsletters (Foundation tier $35\/month for 50,000 sends). Transactional mail uses any SMTP provider.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"How does Ghost compare to Substack on cost?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Ghost takes 0% of subscription revenue versus Substack's 10% (effectively 13\u201316% after Stripe fees). A newsletter earning $60,000 a year keeps roughly $5,700 more on Ghost. Break-even versus a self-hosted server lands around $250\/month MRR.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"Can I migrate from Substack to self-hosted Ghost?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Yes, Ghost has a built-in Substack importer that moves posts, members, paid subscriptions, and Stripe billing to a self-hosted Ghost site. Paying subscribers keep their Stripe cards intact during migration.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"Is self-hosting Ghost worth it?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Self-hosting Ghost is worth it if you have basic command-line comfort and a paid newsletter earning more than $250\/month. Below that line, Substack's free tier or Ghost(Pro) Starter at $15 costs less time and roughly the same amount of money.\"<br \/>\n          }<br \/>\n        }<br \/>\n      ]<br \/>\n    },<br \/>\n    {<br \/>\n      \"@type\": \"HowTo\",<br \/>\n      \"name\": \"How to Install Ghost on a VPS Using Ghost-CLI\",<br \/>\n      \"step\": [<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"name\": \"Provision a Ubuntu server\",<br \/>\n          \"text\": \"Provision an Ubuntu 22.04 or 24.04 server with at least 2 GB of RAM. If you're planning to send newsletters, provision at least 4 GB.\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"name\": \"Point your domain at the server\",<br \/>\n          \"text\": \"Point your domain's A record at the server's IP address.\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"name\": \"SSH into the server\",<br \/>\n          \"text\": \"SSH into the server. SSH (Secure Shell) is the encrypted command-line connection to your VPS.\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"name\": \"Install dependencies\",<br \/>\n          \"text\": \"Install Node.js, MySQL 8, and Nginx via apt.\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"name\": \"Create a non-root user\",<br \/>\n          \"text\": \"Create a non-root user. Ghost-CLI won't install as root, and that's a good thing.\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"name\": \"Install Ghost-CLI\",<br \/>\n          \"text\": \"Run npm install ghost-cli@latest -g.\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"name\": \"Run the Ghost installer\",<br \/>\n          \"text\": \"Run ghost install and answer the prompts (domain, MySQL password, and email).\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"name\": \"Create your admin account\",<br \/>\n          \"text\": \"Visit https:\/\/yourdomain.com\/ghost\/ and create your admin account.\"<br \/>\n        }<br \/>\n      ]<br \/>\n    }<br \/>\n  ]<br \/>\n}<br \/>\n<\/script><\/p>","protected":false},"excerpt":{"rendered":"<p>Self-host Ghost on a VPS to skip Substack&#8217;s 10% cut and own your subscriber list. Here&#8217;s how to set it up, what it costs, and when self-hosting isn&#8217;t worth it.<\/p>\n","protected":false},"author":2,"featured_media":81946,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"toc_headlines":"[[\"h-what-is-self-hosted-ghost\",\"What Is Self-Hosted Ghost?\"],[\"h-why-self-host-ghost-instead-of-using-substack-or-ghost-pro\",\"Why Self-Host Ghost Instead of Using Substack or Ghost(Pro)?\"],[\"h-what-are-the-system-requirements-for-self-hosting-ghost\",\"What Are the System Requirements for Self-Hosting Ghost?\"],[\"h-how-do-you-install-ghost-on-a-vps\",\"How Do You Install Ghost on a VPS?\"],[\"h-how-do-you-set-up-email-for-a-self-hosted-ghost-newsletter\",\"How Do You Set Up Email for a Self-Hosted Ghost Newsletter?\"],[\"h-how-much-does-it-really-cost-to-self-host-ghost\",\"How Much Does It Really Cost to Self-Host Ghost?\"],[\"h-when-is-self-hosting-ghost-the-wrong-call\",\"When Is Self-Hosting Ghost the Wrong Call?\"],[\"h-how-do-you-migrate-a-substack-newsletter-to-self-hosted-ghost\",\"How Do You Migrate a Substack Newsletter to Self-Hosted Ghost?\"],[\"h-should-you-ghost-substack\",\"Should You Ghost Substack?\"],[\"h-frequently-asked-questions-about-self-hosting-ghost\",\"Frequently Asked Questions About Self-Hosting Ghost\"]]","hide_toc":false,"footnotes":""},"categories":[550,804],"tags":[],"class_list":["post-81944","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","category-web-hosting"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.3 (Yoast SEO v27.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Self-Host Ghost CMS: The Complete Guide - DreamHost<\/title>\n<meta name=\"description\" content=\"Self-host Ghost on a VPS to skip Substack&#039;s 10% cut and own your subscriber list. Here&#039;s how to set it up, what it costs, and when self-hosting isn&#039;t worth it.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Self-Host Ghost: Skip Substack&#039;s Cut and Own Your List\" \/>\n<meta property=\"og:description\" content=\"Running Ghost on your own VPS costs $15\u2013$30 a month. Substack takes 10% of every dollar your subscribers pay. Here&#039;s how to set up a self-hosted Ghost, what it actually costs, and when managed hosting is the smarter call.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/\" \/>\n<meta property=\"og:site_name\" content=\"DreamHost Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/DreamHost\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-18T14:15:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-18T14:15:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1220x628_ogimage_your_newsletter_your_server.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Dallas Kashuba\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Self-Host Ghost: Skip Substack&#039;s Cut and Own Your List\" \/>\n<meta name=\"twitter:description\" content=\"Running Ghost on your own VPS costs $15\u2013$30 a month. Substack takes 10% of every dollar your subscribers pay. Here&#039;s how to set up a self-hosted Ghost, what it actually costs, and when managed hosting is the smarter call.\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/dallas\" \/>\n<meta name=\"twitter:site\" content=\"@dreamhost\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dallas Kashuba\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Self-Host Ghost CMS: The Complete Guide - DreamHost","description":"Self-host Ghost on a VPS to skip Substack's 10% cut and own your subscriber list. Here's how to set it up, what it costs, and when self-hosting isn't worth it.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/","og_locale":"en_US","og_type":"article","og_title":"Self-Host Ghost: Skip Substack's Cut and Own Your List","og_description":"Running Ghost on your own VPS costs $15\u2013$30 a month. Substack takes 10% of every dollar your subscribers pay. Here's how to set up a self-hosted Ghost, what it actually costs, and when managed hosting is the smarter call.","og_url":"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/","og_site_name":"DreamHost Blog","article_publisher":"https:\/\/www.facebook.com\/DreamHost\/","article_published_time":"2026-06-18T14:15:00+00:00","article_modified_time":"2026-06-18T14:15:15+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1220x628_ogimage_your_newsletter_your_server.webp","type":"image\/webp"}],"author":"Dallas Kashuba","twitter_card":"summary_large_image","twitter_title":"Self-Host Ghost: Skip Substack's Cut and Own Your List","twitter_description":"Running Ghost on your own VPS costs $15\u2013$30 a month. Substack takes 10% of every dollar your subscribers pay. Here's how to set up a self-hosted Ghost, what it actually costs, and when managed hosting is the smarter call.","twitter_creator":"@http:\/\/twitter.com\/dallas","twitter_site":"@dreamhost","twitter_misc":{"Written by":"Dallas Kashuba","Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/#article","isPartOf":{"@id":"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/"},"author":{"name":"Dallas Kashuba","@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/person\/f6a12ad459538e8e418cf31b8b603814"},"headline":"Self-Host Ghost CMS: The Complete Guide","datePublished":"2026-06-18T14:15:00+00:00","dateModified":"2026-06-18T14:15:15+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/"},"wordCount":2870,"publisher":{"@id":"https:\/\/www.dreamhost.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460x1095_blog_hero_your_newsletter_your_server.webp","articleSection":["Tutorials","Web Hosting"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/","url":"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/","name":"Self-Host Ghost CMS: The Complete Guide - DreamHost","isPartOf":{"@id":"https:\/\/www.dreamhost.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/#primaryimage"},"image":{"@id":"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460x1095_blog_hero_your_newsletter_your_server.webp","datePublished":"2026-06-18T14:15:00+00:00","dateModified":"2026-06-18T14:15:15+00:00","description":"Self-host Ghost on a VPS to skip Substack's 10% cut and own your subscriber list. Here's how to set it up, what it costs, and when self-hosting isn't worth it.","breadcrumb":{"@id":"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/#primaryimage","url":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460x1095_blog_hero_your_newsletter_your_server.webp","contentUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460x1095_blog_hero_your_newsletter_your_server.webp","width":1460,"height":1095,"caption":"Self-Host Ghost CMS: The Complete Guide"},{"@type":"BreadcrumbList","@id":"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.dreamhost.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Self-Host Ghost CMS: The Complete Guide"}]},{"@type":"WebSite","@id":"https:\/\/www.dreamhost.com\/blog\/#website","url":"https:\/\/www.dreamhost.com\/blog\/","name":"DreamHost Blog","description":"","publisher":{"@id":"https:\/\/www.dreamhost.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dreamhost.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.dreamhost.com\/blog\/#organization","name":"DreamHost","url":"https:\/\/www.dreamhost.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/dhblog.dream.press\/blog\/wp-content\/uploads\/2019\/01\/dh_logo-blue-2.png","contentUrl":"https:\/\/dhblog.dream.press\/blog\/wp-content\/uploads\/2019\/01\/dh_logo-blue-2.png","width":1200,"height":168,"caption":"DreamHost"},"image":{"@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/DreamHost\/","https:\/\/x.com\/dreamhost","https:\/\/www.instagram.com\/dreamhost\/","https:\/\/www.linkedin.com\/company\/dreamhost\/","https:\/\/www.youtube.com\/user\/dreamhostusa"]},{"@type":"Person","@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/person\/f6a12ad459538e8e418cf31b8b603814","name":"Dallas Kashuba","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/05ab6fb1606be97d16c74efb0fba01b3c11e91501dc5f9661bdfbb5c5b0cd113?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/05ab6fb1606be97d16c74efb0fba01b3c11e91501dc5f9661bdfbb5c5b0cd113?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/05ab6fb1606be97d16c74efb0fba01b3c11e91501dc5f9661bdfbb5c5b0cd113?s=96&d=mm&r=g","caption":"Dallas Kashuba"},"sameAs":["http:\/\/www.idallas.com\/","https:\/\/x.com\/http:\/\/twitter.com\/dallas"],"url":"https:\/\/www.dreamhost.com\/blog\/author\/dallas\/"}]}},"lang":"en","translations":{"en":81944},"pll_sync_post":{},"_links":{"self":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts\/81944","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/comments?post=81944"}],"version-history":[{"count":5,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts\/81944\/revisions"}],"predecessor-version":[{"id":81956,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts\/81944\/revisions\/81956"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/media\/81946"}],"wp:attachment":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/media?parent=81944"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/categories?post=81944"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/tags?post=81944"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}