Surviving the Ghost 6 Upgrade on a DigitalOcean Droplet (A DevOps Adventure I Didn’t Ask For)
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 to get the latest updates and news
Member discussion