Ghost is a powerful headless CMS and blogging platform used by developers, newsletters, and media teams worldwide. Whether you're running it for a high-traffic publication or a member-supported newsletter, downtime means missed readers, failed email sends, and lost revenue.
This tutorial walks you through setting up comprehensive monitoring for a self-hosted Ghost instance using Vigilmon — free tier, no credit card.
Why Ghost needs dedicated monitoring
Ghost's architecture has several independently-failing layers:
- Web UI goes down — readers can't access your content; existing members get a 502 or blank page
- Admin panel unavailable — writers and editors can't publish posts, manage members, or send newsletters
- Content API broken — if you use Ghost headlessly (feeding a Next.js or Gatsby frontend), the Content API failing means your entire frontend returns empty content
- SSL certificate expires — Ghost requires HTTPS; an expired cert blocks all member logins and purchase flows
- Ghost process crashes silently — Node.js processes can crash and leave a zombie port; the TCP port appears open but HTTP requests hang
External monitoring from Vigilmon catches all of these before your readers or team members report them.
What you'll need
- A running Ghost instance (self-hosted via Ghost CLI or Docker)
- A free Vigilmon account
Step 1: Verify the Ghost admin site health endpoint
Ghost exposes an admin health endpoint that returns the site's operational status. Check it from your terminal:
curl https://yourdomain.com/ghost/api/v4/admin/site/
# Expect: {"site":{"title":"Your Blog","description":"...","url":"https://yourdomain.com",...}}
This endpoint returns 200 with site metadata when Ghost is running correctly. It doesn't require authentication and exercises the Node.js application layer, making it ideal for health monitoring.
Step 2: Monitor the admin health endpoint
- Log in to vigilmon.online and go to Monitors → New Monitor
- Choose HTTP / HTTPS
- URL:
https://yourdomain.com/ghost/api/v4/admin/site/ - Check interval: 1 minute
- Expected status code:
200 - Response body contains:
"title"(present in all valid Ghost admin/site responses) - Save the monitor
This is your primary health signal — if Ghost's Node.js process crashes, is restarting, or can't connect to its MySQL database, this endpoint will return a non-200 status or fail to respond.
Step 3: Monitor web UI availability for readers
The admin endpoint confirms the backend is alive. A separate check on the public homepage confirms that readers can actually access your content.
- Monitors → New Monitor → HTTP / HTTPS
- URL:
https://yourdomain.com - Check interval: 1 minute
- Expected status code:
200 - (Optional) Response body contains: a keyword from your homepage — your blog name or a navigation link like
Subscribe - Save the monitor
Keeping this separate from the admin check lets you pinpoint the failure layer: if the admin endpoint is up but the homepage is down, the issue is likely in your theme rendering or nginx config — not the Ghost process itself.
Step 4: Add a Content API keyword check
If you use Ghost as a headless CMS feeding a frontend, the Content API is critical. A keyword check confirms the API returns your actual content — not an empty response or error payload.
- Monitors → New Monitor → HTTP / HTTPS
- URL:
https://yourdomain.com/ghost/api/content/posts/?key=YOUR_CONTENT_API_KEY&limit=1 - Check interval: 5 minutes (Content API calls count against your API limits)
- Expected status code:
200 - Response body contains:
"posts"(the key in every valid Ghost Content API response) - Save the monitor
Replace YOUR_CONTENT_API_KEY with a key from Ghost Admin → Integrations → Custom Integrations. The limit=1 parameter keeps the response small and the check lightweight.
Step 5: Monitor SSL certificate expiry
Ghost requires HTTPS for member logins, subscription flows, and secure email links. An expired certificate immediately breaks all of these.
- Monitors → New Monitor → SSL Certificate
- Domain:
yourdomain.com - Alert when expiring in fewer than: 14 days
- Save the monitor
Ghost CLI manages Let's Encrypt certificates automatically, but renewal can fail if your server's cron jobs are disrupted or if Ghost is running behind a misconfigured proxy. A 14-day window gives you time to renew manually before users are affected.
Step 6: Configure alert channels
When Ghost goes down, every minute costs readers and potential subscribers.
- Alert Channels → Add Channel
- Choose Slack, email, Discord, or webhook
- Assign the channel to all Ghost monitors
For a newsletter publication, routing alerts to both the technical operator and the editorial team means no one publishes a promotional campaign while the site is down.
Sample alert:
[DOWN] Ghost Admin API
https://yourdomain.com/ghost/api/v4/admin/site/
Status: 502 Bad Gateway
Down for: 4 minutes
Step 7: Build a public status page
A status page gives your audience a reliable answer to "is the site down?" instead of social media complaints.
- Status Pages → New Status Page
- Name: "Publication Status"
- Add monitors: Admin endpoint, Homepage, Content API, SSL
- Publish and link from your site footer or
status.yourdomain.com
Monitoring summary
| Monitor | Type | What it catches |
|---------|------|-----------------|
| https://yourdomain.com/ghost/api/v4/admin/site/ | HTTP | Ghost process crash, DB failure, 5xx errors |
| https://yourdomain.com | HTTP | Public site down, theme error, nginx failure |
| https://yourdomain.com/ghost/api/content/posts/?key=... | HTTP | Content API broken, headless frontend empty |
| yourdomain.com | SSL | Certificate expiry before member logins break |
What's next
- Heartbeat monitoring — Ghost sends scheduled newsletters via its email system; a heartbeat monitor can verify your newsletter cron jobs are firing on schedule
- Response time history — Ghost sites with large post archives can slow significantly as the database grows; Vigilmon tracks response time trends so you can optimize before readers notice
Get started free at vigilmon.online — no credit card, your first monitor is live in under two minutes.