Self-hosted Ghost 6.0 Notes

Posted Wednesday, August 20, 2025 by Sri. Tagged EXPEDITION, OPENWEB
EDITING PHASE:gathering info...

These are notes on getting Ghost 6.0 to run on an Opalstack shared webserverThese guys are the spiritual successor to WebFaction, but with better support!. The Ghost installer they have is already version 6.0.4. However, there are a few things that just aren't working.

Goals for Using Ghost 6.0

I'm really interested in using it as a way to federate content written on my Ghost instance. There is a new Network Panel which is supposed to allow you to interact with other people. As they describe it, it makes it possible for people to follow and comment from Mastodon, Bluesky, and Threads. This theoretically integrates commenting and discovery across decentralized social networks and NOT Disqus, Instagram, Twitter.

Ghost uses ActivityPub, a message passing bidirectional protocol that allows peer-to-peer connections for leisurely distribution from each destination over the HTTP protocol. Ghost apparently implements itself as an endpoint for the protocol, and the Network Panel can be

Ghost requires that you install it in the root level of a domain ...no subdirectory installs! The Network Panel simply won't appear otherwise!

Broken: No Image Uploading from Dashboard

‼️ The Ghost admin panel throws error when uploading an image for backgrounds, user avatars

While Ghost seems to install fine, attempting to use any image uploading to set an Avatar image fails. On Opalstack, I've tracked in the Opalstack shell in the Ghost Log Files (located at ~/logs/apps/[appname]/https___[sitename]_production.log)

{
"name": "Log",
"hostname": "[redacted]",
"pid": 3112296,
"level": 50,
"version": "6.0.4",
"req": {
"meta": {
"requestId": "[redacted]",
"userId": "[redacted]"
},
"url": "/images/upload/",
"method": "POST",
"originalUrl": "/ghost/api/admin/images/upload/",
"params": {},
"headers": { redacted },
"query": {}
},
"res": {
"_headers": {
"x-powered-by": "Express",
"content-version": "v6.0",
"vary": "Accept-Version, Origin, Accept-Encoding",
"cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0",
"access-control-allow-origin": "[redacted]",
"content-type": "application/json; charset=utf-8",
"content-length": "317",
"etag": "W/\"[redacted]\""
},
"statusCode": 400,
"responseTime": "15ms"
},
"err": {
"id": "106e3ce1-7e0d-11f0-90e8-db666a42321e",
"domain": "[redacted]",
"code": null,
"name": "BadRequestError",
"statusCode": 400,
"level": "normal",
"message": "Image processing failed",
"context": "\"Sharp wasn't installed\"",
"help": "\"Please verify that the image is valid\"",
"stack": "BadRequestError: Image processing failed\n
at Object.query ([redacted]/versions/6.0.4/core/server/api/endpoints/images.js:43:27)\n
at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n
at async getResponse ([redacted]/versions/6.0.4/node_modules/@tryghost/api-framework/lib/pipeline.js:259:34)\n
at async ImplWrapper ([redacted]/versions/6.0.4/node_modules/@tryghost/api-framework/lib/pipeline.js:264:30)\n
at async Http ([redacted]/versions/6.0.4/node_modules/@tryghost/api-framework/lib/http.js:70:28)",
"hideStack": false
},
"msg": "Image processing failed",
"time": "2025-08-20T21:31:42.383Z",
"v": 0
}

The error is Sharp wasn't installed, which is thrown by the API endpoint images.js. This turns out to rely on a SDK module called transform.js which specifies an optionalDependency of sharp. It doesn't appear to be installed by default for Ghost v6.0, though in this case their own admin panel requires it but the installer didn't take care of it.

I'm not sure if I should just install optional dependency myself.

Broken: Ghost Doctor

‼️ The ghost doctor command reports a bogus(?) permissions error?

There's a command called ghost doctor which you run from inside the ghost folder, but when I run it it just says there was an error. I was hoping that this command would show me the error logs for Ghost to debug the above. I can not tell if it just stopped checking or if this was the only issue it found:

prompt> cd [ghost_app_directory]
prompt> source setenv
prompt> cd ghost
prompt> ghost doctor

✔ Checking system Node.js version - found v22.18.0
ℹ Ensuring user is not logged in as ghost user [skipped]
ℹ Checking if logged in user is directory owner [skipped]
✖ Checking current folder permissions
Instance is currently running
ℹ Validating config [skipped]
✔ Checking memory availability
✔ Checking binary dependencies
✔ Checking free space
One or more errors occurred.

1) SystemError

Message: The directory [redacted] is not readable by other users on the system.
This can cause issues with the CLI, you must either make this directory readable
by others or run `ghost install` in another location.

Debug Information:
    OS: AlmaLinux, v9.6
    Node Version: v22.18.0
    Ghost Version: 6.0.4
    Ghost-CLI Version: 1.28.3
    Environment: production
    Command: 'ghost doctor'

Try running ghost doctor to check your system for known issues.

You can always refer to https://ghost.org/docs/ghost-cli/ for troubleshooting.

This ambiguous error reporting is pretty typical of Ghost error messages...verbose but not helpful. What are "issues with the CLI"? Does that mean Ghost isn't working right? I was able to run the ghost command so it's unclear.

On Opalstack, our user directories are sandboxed from each other, but you can still set the permissions of your home directory with chmod despite not being able to see what the permissions are. Which I did, doing a chmod 755 and this ended up breaking my entire website. I only noticed this hours later, and thought something else had happened. Opalstack Support quickly fixed it, thankfully.

This might just be an annoyance error report, so I could ignore it. But I'm irritated by ambiguous debugging tools.

Broken: Network Panel

‼️ Network Panel works once on first setup, then afterwards just throws errors and doesn't work.

I had installed Ghost in a subdirectory, so I reassigned the application instance to an unused domain on / using the Opalstack Site tool, which allows you to map a particular application to a particular path on a domain. The Network Panel appears! I could click on it and saw for a brief shining moment what it could do! Then it promptly broke and refused to work anymore. It showed a unhelpful dialogs about "oops there was a problem".

At the time of this writing on August 20, 2025, it appears that a lot of people are having this exact problem with self-hosted installs. On the Ghost Forums there are multiple threads like this one trying to figure out what's going on, but it's beyond me to diagnose or fix on Opalstack, as this seems to get deep into the nginx configuration.

As this is the main feature I want to explore, it's a showstopper.