How to Monitor Your Self-Hosted Mealie Instance with Vigilmon
Mealie turns scattered bookmarks and recipe screenshots into a clean, searchable meal planning system. Self-hosting it gives you full data ownership — but it also means you're responsible for keeping it running. When Mealie's background jobs silently fail, your scheduled meal plans don't generate, recipe imports get stuck, and there's nothing in the UI to tell you anything went wrong.
This guide sets up monitoring for the Mealie API health endpoint, web UI availability, background job processing, and SSL certificate expiry using Vigilmon.
What can go wrong with a self-hosted Mealie
Mealie runs a FastAPI backend with an SQLite or PostgreSQL database and an async background job system. Common failure modes:
- API process crash — the FastAPI process exits; the web UI won't load and API calls from apps fail
- Database corruption or lock — especially with SQLite on shared storage; the API process stays up but all requests fail with 500 errors
- Background job failures — recipe URL scraping, scheduled meal plan generation, or recipe imports stop working without any visible error in the UI
- SSL expiry — Let's Encrypt renewal fails silently; browsers block access
Step 1: Monitor the /api/app/about health endpoint
Mealie exposes a dedicated health endpoint at /api/app/about that returns application metadata and version information. It's a clean signal: if the API is up and the database is accessible, this returns 200.
curl https://mealie.yourdomain.com/api/app/about
# {"production":true,"version":"v1.x.x","demoStatus":false,...}
In Vigilmon:
- Click New Monitor → HTTP
- URL:
https://mealie.yourdomain.com/api/app/about - Expected status:
200 - Check interval: 5 minutes
- Save
This is your primary signal. A 200 here means the API process is running and the database is reachable.
Step 2: Monitor the web UI
The web UI is a Vue.js SPA served separately from the API. Add a second monitor for the root URL:
- Click New Monitor → HTTP
- URL:
https://mealie.yourdomain.com - Expected status:
200 - Check interval: 5 minutes
- Save
| Monitor | URL | What it catches |
|---|---|---|
| API health | /api/app/about | FastAPI crash, DB failure |
| Web UI | / | Frontend serving failure |
Step 3: Heartbeat monitoring for background jobs
Mealie runs background tasks for recipe URL scraping and meal plan generation. These jobs can fail silently — the process stays alive, the health endpoint returns 200, but no background work is being done.
The heartbeat pattern solves this: your job pings a unique URL after each successful run. If Vigilmon stops seeing pings within the expected interval, it fires an alert.
Setting up the heartbeat in Vigilmon
- Click New Monitor → Heartbeat
- Set the expected interval (e.g., 25 hours for a daily job)
- Copy the unique ping URL
Pinging from Mealie's container or host
If you run Mealie via Docker Compose, add a sidecar script or a cron job on the host that pings the heartbeat URL after verifying Mealie's background queue is healthy:
#!/bin/bash
# /opt/mealie/healthcheck.sh — runs via cron every 24h
# Check that the background worker hasn't stalled
QUEUE_STATUS=$(curl -sf https://mealie.yourdomain.com/api/app/about)
if [ $? -eq 0 ]; then
curl -sf "$MEALIE_HEARTBEAT_URL" > /dev/null
echo "Mealie heartbeat pinged"
else
echo "Mealie API unreachable — not pinging heartbeat"
fi
Add to crontab:
0 6 * * * /opt/mealie/healthcheck.sh >> /var/log/mealie-heartbeat.log 2>&1
Set MEALIE_HEARTBEAT_URL to the Vigilmon heartbeat URL. If the API goes down, the heartbeat stops — triggering an alert before any user notices.
Step 4: Monitor SSL certificate expiry
In Vigilmon:
- Click New Monitor → SSL Certificate
- Domain:
mealie.yourdomain.com - Alert threshold: 14 days before expiry
- Save
Self-hosted SSL setups are especially vulnerable to renewal failures when the instance is rarely accessed directly (you mostly use it from your phone app). An expiring cert will break both the web UI and any app integrations without any warning inside Mealie itself.
Step 5: Set up alert notifications
Go to Notifications → New Channel and add Slack, Discord, or email. Enable the channel on all monitors.
Sample alert when the Mealie API goes down:
🔴 DOWN: mealie.yourdomain.com/api/app/about
Status: 502 Bad Gateway
Regions: EU-West
Started: 4 minutes ago
Sample heartbeat miss alert:
🔴 MISSED: mealie-background-jobs heartbeat
Expected every: 25 hours
Last ping: 26 hours ago
The distinction matters: an API down alert tells you the server is unreachable, while a heartbeat miss tells you the server is up but jobs are silently failing.
Step 6: Add a public status page (optional)
Even for a personal tool, a Vigilmon status page gives you a quick "is it me or the server?" reference:
- Status Pages → New Status Page
- Add all monitors
- Save and bookmark the URL
What you're monitoring
| Monitor | Type | Catches |
|---|---|---|
| API health /api/app/about | HTTP | FastAPI crash, DB failure |
| Web UI | HTTP | Frontend not loading |
| Background jobs | Heartbeat | Silent job failures |
| SSL Certificate | SSL | Cert expiry before outage |
With these four monitors, your Mealie instance is covered end-to-end. You'll know within minutes if anything stops working — not when you open the app for dinner planning and find it broken.
Get started free at vigilmon.online — your first monitor is live in under a minute.