Recipesage is an open-source self-hosted recipe manager with cookbook creation, meal planning, shopping list integration, ingredient scaling, and a headless-browser import engine that can scrape recipes directly from URLs. A Node.js/TypeScript backend with an Angular frontend serves everything on port 3000. When you run it yourself, you own the monitoring too. Vigilmon covers every layer — web server, PostgreSQL database, recipe import service, image processing, push notifications, meal-plan API response times, shopping list sync, email delivery, and TLS certificates.
What You'll Set Up
- HTTP uptime monitor for the Recipesage web interface (port 3000)
- PostgreSQL database connectivity check via a health endpoint
- Recipe import service health check (headless browser / Playwright / Puppeteer)
- Image processing and thumbnail generation monitor
- Push notification relay health check
- Meal plan generation API endpoint response-time monitor
- Shopping list sync service monitor
- User authentication service check
- Cron heartbeat for JPEG/PDF export pipeline jobs
- SMTP email delivery health check
- SSL/TLS certificate expiry alert
Prerequisites
- Recipesage running and accessible (default port 3000)
- PostgreSQL deployed and connected to Recipesage
- A free Vigilmon account
Step 1: Monitor the Recipesage Web Interface
The primary uptime check confirms the Node.js server and Angular SPA are both being served.
- Log in to vigilmon.online and click Add Monitor.
- Set Type to
HTTP / HTTPS. - Enter your Recipesage URL:
https://recipes.yourdomain.com. - Set Check interval to
1 minute. - Set Expected HTTP status to
200. - Click Save.
Step 2: Add a Health Endpoint to the API
Recipesage's Node.js API should expose a /health route for structured dependency checks. If it doesn't have one, add it:
// src/routes/health.ts
import { Router } from "express";
import { getConnection } from "../db";
const router = Router();
router.get("/", async (_req, res) => {
try {
await getConnection().raw("SELECT 1");
res.json({ status: "ok", db: "ok" });
} catch (err) {
res.status(503).json({ status: "error", db: "unreachable" });
}
});
export default router;
Register it in your main Express app:
import healthRouter from "./routes/health";
app.use("/health", healthRouter);
Now add a Vigilmon HTTP monitor for https://recipes.yourdomain.com/health with expected status 200. A 503 means the API process is alive but can't reach PostgreSQL.
Step 3: Monitor PostgreSQL Connectivity
For a direct, application-independent database check:
- Click Add Monitor → TCP Port.
- Enter your PostgreSQL server hostname and port (default
5432). - Set Check interval to
1 minute. - Click Save.
This catches network-level database failures that the health endpoint (running inside the app process) might not surface cleanly.
Step 4: Monitor the Recipe Import Service
Recipesage's recipe import engine uses a headless browser (Playwright or Puppeteer) to scrape recipe data from URLs. This is the most resource-intensive part of the stack — it can crash independently of the main API.
If the import service exposes its own HTTP port or health endpoint (common in Docker Compose deployments where it runs as a separate container), add an HTTP monitor for it:
- Click Add Monitor → HTTP / HTTPS.
- Enter the import service health URL (e.g.
http://recipes.yourdomain.com:3001/healthor your internal address). - Set Expected status to
200. - Label it Recipe import service.
If the import service does not expose a health endpoint, test it indirectly by monitoring the import API endpoint for a known-good response:
POST https://recipes.yourdomain.com/api/import/url
Body: {"url": "https://example.com/recipe"}
Expected status: 200 or 202
Step 5: Check Image Processing and Thumbnail Generation
Recipesage generates thumbnails for recipe images. Broken image processing means recipes display without their cover photos.
- Upload a test recipe image and copy its thumbnail URL from the Recipesage UI.
- Add an HTTP monitor for that thumbnail URL.
- Set Expected status to
200. - Enable Response time alerting with a threshold of
3000 ms— image generation is slower than text responses.
Step 6: Monitor Push Notification Relay Health
Recipesage can send push notifications for shared recipes and meal plan updates. The notification relay is often a Firebase Cloud Messaging (FCM) proxy endpoint. Monitor whether your instance can still reach its notification backend:
- Add an HTTP monitor for
https://recipes.yourdomain.com/api/push/status(or the equivalent endpoint your deployment exposes). - Set Expected status to
200. - Label it Push notification relay.
If FCM credentials expire or the relay process crashes, users stop receiving sharing notifications — a silent failure that's hard to detect without monitoring.
Step 7: Track Meal Plan Generation API Response Times
The meal planning API is a key feature — slow responses here directly affect the planning workflow.
- Add an HTTP monitor for
https://recipes.yourdomain.com/api/mealPlans. - Set Method to
GET. - Add the header
Authorization: Bearer YOUR_TEST_TOKEN. - Set Expected status to
200. - Enable Response time alerting with a threshold of
2000 ms.
Use a dedicated test-account token for this monitor so you're not using a real user's credentials.
Step 8: Monitor Shopping List Sync Service
Shopping list sync keeps shared lists consistent across users. If the sync service falls behind, collaborative shopping lists show stale data.
- Add an HTTP monitor for
https://recipes.yourdomain.com/api/shoppingLists. - Set Method to
GET, Expected status to200. - Add the same test-account
Authorizationheader. - Enable Response time alerting at
2000 ms.
Step 9: Check the Authentication Service
Recipesage's login endpoint must be healthy for any user activity.
- Add an HTTP monitor for
https://recipes.yourdomain.com/api/users/login. - Set Method to
POST. - Add header
Content-Type: application/json. - Set body to
{"email":"test@example.com","password":"wrong"}(an intentionally wrong credential). - Set Expected status to
401— a 401 means the auth service is up and processing requests correctly.
A 500 or timeout on a deliberately wrong login means the auth service itself is broken.
Step 10: Heartbeat for JPEG/PDF Export Pipeline
Recipesage can export cookbooks as PDFs or ZIPs. These jobs run asynchronously and may be scheduled or triggered by a queue worker. Monitor whether export jobs complete:
# Example: trigger a nightly export and ping when done
0 3 * * * /opt/recipesage/scripts/export-backup.sh && curl -s https://vigilmon.online/heartbeat/YOUR_EXPORT_ID
In Vigilmon:
- Click Add Monitor → Cron Heartbeat.
- Set Expected interval to
1440minutes (daily). - Copy the heartbeat URL into your export script.
Step 11: SMTP Email Delivery Health
Recipesage sends transactional emails (password resets, sharing invitations). If SMTP is broken, users can't reset passwords.
- Add an HTTP monitor for your SMTP health endpoint if you run a mail proxy (e.g. Mailhog's
GET /api/v2/messageson its API port). - Alternatively, add a TCP Port monitor to your SMTP server: hostname
mail.yourdomain.com, port587(STARTTLS) or465(SMTPS). - Set Check interval to
5 minutes.
Step 12: SSL/TLS Certificate Expiry Alert
- Open the web-interface monitor from Step 1.
- Enable Monitor SSL certificate.
- Set Alert when certificate expires in less than
21 days. - Click Save.
Step 13: Configure Alert Channels
- Go to Alert Channels in Vigilmon and connect Slack, email, or a webhook.
- Set Consecutive failures before alert to
2on HTTP monitors. - Keep Consecutive failures at
1for heartbeat monitors (export pipeline, import service).
Summary
| Monitor | Target | What It Catches |
|---|---|---|
| Web interface | https://recipes.yourdomain.com | App crash, proxy failure |
| API health | GET /health | DB connectivity from API |
| PostgreSQL TCP | host:5432 | Network-level DB failure |
| Import service | Import health URL | Headless browser crash |
| Image thumbnails | Known thumbnail URL | Image processing broken |
| Push notification relay | /api/push/status | Notification delivery down |
| Meal plan API | GET /api/mealPlans | Meal planning slow/broken |
| Shopping list sync | GET /api/shoppingLists | Sync service degraded |
| Auth service | POST /api/users/login | Login flow broken |
| Export heartbeat | Vigilmon heartbeat URL | Export pipeline not running |
| SMTP | TCP port 587/465 | Email delivery broken |
| SSL certificate | recipes.yourdomain.com | TLS cert expiry |
Recipesage gives you a self-hosted recipe library with real privacy — your recipes never leave your server. With Vigilmon monitoring every layer from the Node.js API to the headless-browser import engine and export pipeline, you catch failures before they interrupt your meal planning.