Surviving the Ghost 6 Upgrade on a DigitalOcean Droplet (A DevOps Adventure I Didn’t Ask For)

Surviving the Ghost 6 Upgrade on a DigitalOcean Droplet (A DevOps Adventure I Didn’t Ask For)
Photo by Luca Bravo / Unsplash

Upgrading Ghost should be simple, right?

ghost update → done.

Well, that’s what I thought. My server had other plans.

This is the story of how a simple update turned into a full-blown debugging marathon — involving Node upgrades, broken systemd, file permission purgatory, vanishing routes, and Ghost-CLI repeatedly yelling “You can’t run commands as the root user” at me.

If you’ve ever upgraded Ghost on a DigitalOcean droplet, this may feel painfully familiar. If you haven’t yet… consider this a warning.

The Starting Point

My blog was running:

  • Ghost 5.x
  • Node 18
  • systemd
  • A custom theme (v1.1.1)
  • DigitalOcean’s Ghost One-Click droplet

Everything worked. I was content. And then Ghost announced version 6.

Naturally, I wanted the shiny new version. What could go wrong?

The First Problem: Node Requirements

Running:

ghost update

Immediately failed. Ghost 6 requires:

Node >= 22.13

So I upgraded Node.

Ghost-CLI responded:

The installed node version has changed since Ghost was installed.
Run `ghost update --force` to reinstall binary dependencies.

Reasonable enough.
Until I ran:

ghost update --force

That was the moment everything broke.

When systemd Died

Suddenly, Ghost couldn’t start anymore.

SystemError: systemd process manager has not been set up or is corrupted.

Ghost’s systemd unit file was broken or missing.
Trying to stop Ghost generated:

You can’t run commands as the 'root' user.

Which was strange, because I wasn’t root.

Permission Hell

Ghost-CLI refused to run anything.

It wouldn’t run as root.
It wouldn’t run as a non-root user.
It just refused to run.

This happens on DigitalOcean’s legacy Ghost setup, where the original Ghost installation was done as root. Ghost-CLI now forbids root usage entirely.

Meaning:
Ghost refused to run as root
Ghost refused to run as non-root

A perfect deadlock.

Creating a New User (That Still Didn’t Work)

The official fix recommended:

Create a new sudo-enabled user and run ghost setup.

So I created:

adduser ghostadmin
usermod -aG sudo ghostadmin

Then tried:
sudo ghost setup linux-user
Ghost-CLI responded:

You can't run commands as the 'root' user.

Even though I was not root.

The Real Culprit: A Hidden Ghost Config File

After searching the entire server, I found the issue:

/home/ghost-mgr/.ghost/config

This file was created back when Ghost was installed as root.
Ghost-CLI still thought the entire installation belonged to root, even though I wasn’t using root anymore.

This is why Ghost-CLI kept refusing.

The Breakthrough: Switching To the Local Process Manager

Since systemd was completely broken and Ghost-CLI refused to repair it, the only remaining option was to use the fallback process manager:

ghost config set process local
ghost start

And it worked.

Ghost started.
The website went back online.
Ghost 6.8.1 was now running.

No systemd required.

Fixing Routes Manually (Because Admin Didn’t Work Either)

Ghost 6 changes how pagination works. My theme update required uploading a new routes.yaml.

But in Ghost Admin, the Upload button did nothing.

So I updated it manually with nano:

sudo nano /var/www/ghost/content/settings/routes.yaml

Pasted the new contents from my theme, restarted Ghost, and the archive now uses “Load More” as intended.

The Final State

After hours of debugging:

  • Ghost 6.8.1 running
  • Node 22.21 installed
  • Process manager set to local
  • Updated theme (1.1.2)
  • New routes.yaml in place
  • Website online

Everything works.

What I Learned

1. Check your Node version before upgrading Ghost

Ghost 6 simply won’t run on older Node versions.

2. Ghost-CLI strictly forbids root usage

Even if Ghost was originally installed as root.

3. systemd can fail silently

Using process: local is a perfectly fine fallback.

4. Admin UI file uploads sometimes break after upgrades

Updating routes.yaml manually is often the fastest solution.

5. Keep your theme updated

Ghost 6 introduced breaking helper changes.

6. Debugging makes you stronger

Painful at first, but worth it.

Final Thoughts

This upgrade was messy, frustrating, and weirdly educational.

If you’re planning to upgrade Ghost on a DigitalOcean droplet, hopefully this write-up saves you a few hours of troubleshooting.

If not, at least now you know what to expect when Ghost decides to fight back.

Subscribe to my newsletter

Subscribe to my newsletter to get the latest updates and news

Member discussion