Self-Host Ghost CMS on Vultr for Under $6/Month (2026)

Ghost Pro’s Starter plan went up to $18/month. That’s $216/year for a plan that doesn’t even support paid memberships. Meanwhile, you can self-host Ghost 6.0 on Vultr‘s $6 High Performance VPS, add a cheap domain and email sending, and run the whole thing for around $7-$10/month. Most people don’t do this because the 1 GB RAM setup requires a specific MySQL fix that nobody tells you about. This guide covers that fix and every other step you need.

This post contains affiliate links. If you purchase through our links, we may earn a commission at no extra cost to you.

🎁 Try Vultr with up to $300 in promo credit (new customers, select products): Claim your credit →
Self-host Ghost CMS on Vultr for under $6/month — 2026 setup guide
Self-host Ghost CMS on a $6/month Vultr plan: 2026 setup guide

Ghost Pro vs self-hosting on Vultr: the cost math

Ghost Pro’s pricing is straightforward to understand but painful to look at:

Plan Price (billed yearly) Paid Memberships?
Starter $18/mo No
Publisher $29/mo Yes
Business $199/mo Yes

The Starter plan’s biggest gotcha: you can’t accept paid subscriptions on it. If you want to monetize your newsletter (the whole point of Ghost for most creators), you need Publisher at $29/month, billed yearly.

Self-hosting on Vultr changes the math entirely:

Component Monthly Cost
Vultr High Performance $6 plan (1 vCPU AMD EPYC-Genoa, 1 GB RAM, 25 GB NVMe, 2 TB transfer) $6.00
Domain (~$12/yr amortized) ~$1.00
Email sending via Mailgun Flex (<1,000 emails/mo) ~$2.00
Total for a no-newsletter blog ~$7/mo
Total with newsletter (<1k subscribers, monthly sends) ~$9-$10/mo

Versus Ghost Pro Starter at $18/mo or Publisher at $29/mo, you’re saving $96-$228/year. And on self-hosted Ghost, paid subscriptions are supported with no extra platform fee: Ghost takes 0%, same as Ghost Pro.

Prices last verified: October 19, 2026. Ghost Pro pricing from ghost.org/pricing.

For a deeper look at how Vultr’s $6 plan compares to other entry-level VPS options, see our best cheap VPS under $10 roundup.


What you’ll need before you start

Ghost 6.0 (released August 4, 2025) has specific requirements. Many older tutorials reference Node.js 12 or 16, and those will fail.

Requirement Spec Note
OS Ubuntu 22.04 or 24.04 LTS No other distros supported by ghost-cli
RAM 1 GB minimum Requires MySQL tuning + swap (covered below)
Node.js v22 LTS only v18 and v20 dropped in Ghost 6.0
Database MySQL 8 SQLite is development-only in Ghost 5+
Web server Nginx ghost-cli configures it automatically
Domain Registered + DNS A-record Required for SSL (Let’s Encrypt)

The Node.js version is the most common trap. Ghost 6 requires exactly v22 LTS (not v20, v21, or v23+). Most guides from 2022-2024 reference outdated versions.


Step by step: installing Ghost on Vultr’s $6 plan

Step 1: deploy your Vultr instance

Start with Vultr‘s $6 High Performance plan: 1 vCPU AMD EPYC-Genoa, 1 GB RAM, 25 GB NVMe SSD, 2 TB transfer, IPv4 included. Select Ubuntu 22.04 LTS as the OS.

New Vultr accounts get $300 in free credit valid for 30 days, enough to run this setup for that first month before you pay a cent.

Point your domain’s A-record at the Vultr server IP before continuing. ghost-cli’s SSL setup (Let’s Encrypt) will fail if DNS hasn’t propagated yet.

Step 2: initial server setup

SSH in as root, then create a non-root sudo user. Do not name this user “ghost”, because it conflicts with ghost-cli.

adduser yourname
usermod -aG sudo yourname
# Log out and back in as yourname

Step 3: install Nginx

sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install nginx -y
sudo ufw allow 'Nginx Full'
sudo ufw allow OpenSSH
sudo ufw enable

💡 Tip: Prefer a visual approach? You can build these rules with our free Firewall Rule Builder. It generates ufw and iptables commands right in your browser.

Step 4: install MySQL 8

sudo apt-get install mysql-server -y
sudo mysql_secure_installation

Then switch MySQL root from socket auth to password auth, which ghost-cli requires:

sudo mysql -u root
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
FLUSH PRIVILEGES;
EXIT;

Step 5: install Node.js v22 LTS (critical)

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
node --version  # Must show v22.x.x

If this shows anything other than v22, stop and fix it before continuing.

Step 6: install ghost-cli and run the installer

sudo npm install ghost-cli@latest -g

sudo mkdir -p /var/www/yourblog
sudo chown yourname:yourname /var/www/yourblog
sudo chmod 775 /var/www/yourblog
cd /var/www/yourblog
ghost install

The installer will prompt you through: blog URL, MySQL credentials, database name, Nginx setup, SSL (Let’s Encrypt), systemd setup, and start. Answer yes to all the automated setup prompts. When it finishes, Ghost is running, but you’re not done yet.

Ghost 6.0 installation steps on Ubuntu 22.04 — 6-step guide with MySQL memory fix
Ghost 6.0 installation steps on Ubuntu 22.04: 6-step guide with MySQL memory fix

The 1 GB RAM problem and the fix

This is the part that most tutorials skip. After a fresh Ghost + MySQL + Nginx install on a 1 GB VPS, the system sits at 80-90% RAM usage at idle. That leaves roughly 100-200 MB of headroom. It’s not enough for:

  • Running ghost update (npm spikes memory)
  • Sending newsletter blasts
  • Any traffic burst above a trickle

The root cause is MySQL 8’s default config, which assumes it’s running on a much larger server. The fix requires two parts.

Part 1: tune MySQL (edit /etc/mysql/mysql.conf.d/mysqld.cnf):

[mysqld]
innodb_buffer_pool_size = 32M
innodb_log_file_size = 16M
max_connections = 25
key_buffer_size = 16M

After saving:

sudo systemctl restart mysql

This alone drops idle RAM usage from 80-90% down to roughly 60-70%.

Part 2: add a 2 GB swap file:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

💡 Tip: Unsure how much swap your server needs? Our free Linux Swap Calculator recommends a size based on your RAM.

Vultr’s NVMe SSD is fast enough that swap doesn’t feel sluggish the way it does on traditional disk. With both fixes in place, npm has room to spike during ghost update, which is the step most likely to get OOM-killed on 1 GB.

With MySQL tuning + 2 GB swap, Ghost runs stably on Vultr’s $6 plan for a low-to-medium traffic blog or newsletter. It’s not a setup I’d recommend for more than ~50 concurrent visitors, but for a personal site or newsletter with up to a few thousand subscribers, it works.


Common pitfalls and solutions

Problem Cause Fix
Ghost crashes after install MySQL eating 80-90% RAM Tune innodb_buffer_pool_size + add 2 GB swap
ghost install fails at SSL DNS not yet propagated Set A-record before install; run ghost setup ssl separately after DNS resolves
User “ghost” conflict Reserved username in ghost-cli Never name your sudo user “ghost”
MySQL socket auth error Ubuntu default auth method Change root to mysql_native_password before install (Step 4)
Wrong Node.js version Old tutorial instructions Install via NodeSource setup_22.x specifically; verify with node --version
ghost update fails / OOM Insufficient RAM for npm Ensure swap is active and MySQL is tuned before updating
403 permissions error Ghost directory ownership sudo chown -R yourname:yourname /var/www/yourblog
MariaDB instead of MySQL Some VPS control panels default to MariaDB Ghost officially supports MySQL 8.0+ only; MariaDB is unsupported

Ghost 6 features: what you get on self-hosted

Ghost 6.0 (August 2025) added ActivityPub/Fediverse support and native analytics. One thing to know: these features work differently on self-hosted vs Ghost Pro.

  • ActivityPub: Full self-hosting requires the experimental Docker Compose install method. The ghost-cli method (used in this guide) connects to Ghost’s hosted ActivityPub relay, so you get followable profiles, but through Ghost’s infrastructure.
  • Native analytics: Requires Docker preview + a free Tinybird account on self-hosted. Not available on ghost-cli installs yet.
  • Everything else (paid memberships, multiple newsletters, custom themes, the Lexical editor, custom integrations) works fully on ghost-cli self-hosted.

If ActivityPub and native analytics are your primary reason for upgrading to Ghost 6, you’ll need the Docker install path. For everyone else running a blog or newsletter, ghost-cli gets you 95% of what Ghost 6 offers.


Ghost runs on $6 with MySQL tuning and swap

Self-hosting Ghost on Vultr’s $6 plan works if you do the MySQL memory tuning and add the swap file. Skip those steps and you’ll run into crashes within days. Do them, and you have a stable publishing platform for $7-$10/month, versus $18-$29/month on Ghost Pro.

The setup is worth it if you’re building a newsletter or membership site and want to control your costs from day one. It’s overkill if you want zero ops work. In that case, Ghost Pro’s managed hosting removes every headache covered in this guide, and the $18/month is fair for what you get.

For most bootstrapped creators starting out: self-host on Vultr $6, upgrade to 2 GB RAM when you can afford it or when traffic demands it, and revisit Ghost Pro later if server management becomes a time burden.

Sign up and deploy your $6 instance: new accounts get $300 in free credit, valid for 30 days.


System requirements verified as of June 22, 2026; Ghost Pro pricing checked October 19, 2026. Ghost version 6.0 (August 4, 2025). Ghost Pro pricing from ghost.org/pricing.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top