Ghostfolio is a privacy-first, self-hosted portfolio tracker that aggregates your investment data across brokerages, crypto exchanges, and asset classes. It runs on a Node.js API backed by PostgreSQL and Redis — a stack with several potential failure points. If PostgreSQL goes down, your portfolio data is gone from view. If Redis fails, caching breaks and API performance degrades. If the sync job stops running, your balances go stale. Vigilmon gives you an independent external layer to catch all of this before you log in expecting fresh data and find a broken dashboard.
What You'll Set Up
- HTTP uptime monitor for the Ghostfolio web UI
- Health check via the
/api/v1/healthendpoint - PostgreSQL and Redis connectivity validation through the health endpoint
- SSL certificate expiry alerts
- Heartbeat monitor for data sync and import jobs
Prerequisites
- Ghostfolio deployed with a domain or IP (Docker Compose is the most common setup)
- PostgreSQL and Redis running as Ghostfolio's backing services
- A free Vigilmon account
Step 1: Monitor the Ghostfolio Web UI
The Ghostfolio frontend is a Next.js app served at the root URL. Add an uptime monitor to confirm the interface is reachable:
- Log in to vigilmon.online and click Add Monitor.
- Set Type to
HTTP / HTTPS. - Enter your Ghostfolio URL:
https://ghostfolio.yourdomain.com. - Set Check interval to
1 minute. - Set Expected HTTP status to
200. - Click Save.
If Ghostfolio is behind an nginx or Traefik reverse proxy, use the proxied HTTPS URL. This monitors both the application and the proxy layer in a single check.
Step 2: Check the /api/v1/health Endpoint
Ghostfolio exposes a structured health endpoint that reports on backend service connectivity. It's the most informative single URL you can probe:
- Click Add Monitor →
HTTP / HTTPS. - URL:
https://ghostfolio.yourdomain.com/api/v1/health - Check interval:
2 minutes. - Expected HTTP status:
200. - Under Advanced, set Expected response body contains to
"status":"ok". - Click Save.
Check the response shape first:
curl -s https://ghostfolio.yourdomain.com/api/v1/health | jq .
# {
# "status": "ok",
# "version": "2.x.x",
# "commitHash": "abc123"
# }
If Ghostfolio is healthy, the endpoint returns "status":"ok". If PostgreSQL or Redis is unreachable, it returns a non-200 status or an error body — Vigilmon will catch either condition.
Step 3: Validate PostgreSQL and Redis Connectivity
The /api/v1/health endpoint implicitly validates database connectivity because Ghostfolio's health check internally queries PostgreSQL and Redis. But you can add an extra body check for defence-in-depth:
- Open the health endpoint monitor (Step 2).
- Under Advanced, set Expected response body must NOT contain to
"status":"error"andECONNREFUSED. - Click Save.
For deeper database visibility, add a separate monitor that hits a lightweight Ghostfolio API endpoint that requires a database query to serve — such as the accounts list:
https://ghostfolio.yourdomain.com/api/v1/account
This will return 401 (authentication required) when the app is healthy, and 500 or a connection error when the database is down. Set the expected status to 401 — it means the app reached the database layer and correctly rejected an unauthenticated request.
Expected HTTP status: 401
Step 4: SSL Certificate Alerts
Ghostfolio holds sensitive financial data — portfolio allocations, transaction history, account balances. An expired TLS certificate blocks HTTPS access and erodes user trust immediately. Add certificate monitoring:
- Open the web UI monitor (Step 1).
- Enable Monitor SSL certificate.
- Set Alert when certificate expires in less than
21 days. - Click Save.
Ghostfolio's recommended Docker Compose setup often uses a separate reverse proxy container (nginx, Caddy, or Traefik) to handle TLS. Each of these can fail to renew silently. Check renewal logs proactively:
# For Let's Encrypt via certbot
sudo certbot certificates
# For Caddy
docker logs caddy 2>&1 | grep -i "renew\|certificate\|tls" | tail -20
# Inspect the live cert
openssl s_client -connect ghostfolio.yourdomain.com:443 -servername ghostfolio.yourdomain.com \
2>/dev/null | openssl x509 -noout -enddate
Step 5: Heartbeat for Data Sync Jobs
Ghostfolio can import transaction data from broker exports and sync market data prices on a schedule. If these jobs stop running, portfolio valuations go stale without any visible error in the UI. Use Vigilmon heartbeats to confirm sync jobs are executing.
Create the heartbeat:
- In Vigilmon, click Add Monitor → Cron Heartbeat.
- Name it
Ghostfolio data sync. - Set the expected ping interval to match your sync frequency (e.g.
360minutes for a 6-hour sync). - Copy the heartbeat URL:
https://vigilmon.online/heartbeat/abc123.
Add the ping to your sync script or cron:
# Example: daily market data refresh via Ghostfolio's built-in API
0 6 * * * curl -s -X POST \
-H "Authorization: Bearer $GHOSTFOLIO_API_KEY" \
https://ghostfolio.yourdomain.com/api/v1/admin/gather/max \
&& curl -s https://vigilmon.online/heartbeat/abc123
The && ensures Vigilmon is pinged only when the data refresh API call succeeds. A failed refresh leaves the heartbeat silent, triggering a Vigilmon alert within one check window.
Step 6: Alert Routing
Financial data tools warrant prompt alerting. Configure Vigilmon notifications to match the severity:
- Open each Ghostfolio monitor → Notifications.
- Web UI and health monitors: Alert after
2 failed checks(brief container restarts shouldn't page anyone). - Heartbeat monitors: Alert after
1 missed ping(a missed sync means stale data is silently accumulating). - Add your preferred channel: email, Slack, or push notification.
Consider adding a Recovery notification so you know when Ghostfolio comes back up — useful for incidents that wake you at 3 AM.
What You've Built
Vigilmon now provides full external visibility into your Ghostfolio stack: web UI uptime, API health with database and cache validation, SSL certificate monitoring, and heartbeat checks confirming your data sync jobs are running. Your self-hosted portfolio tracker has a reliability layer that matches the sensitivity of the data it holds.
Get started at vigilmon.online.