tutorial

Monitoring Recipesage with Vigilmon

Recipesage is a self-hosted recipe manager and meal planner with headless-browser recipe import and PDF export. Here's how to monitor its Node.js API, PostgreSQL database, import service, push notifications, and SMTP with Vigilmon.

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.

  1. Log in to vigilmon.online and click Add Monitor.
  2. Set Type to HTTP / HTTPS.
  3. Enter your Recipesage URL: https://recipes.yourdomain.com.
  4. Set Check interval to 1 minute.
  5. Set Expected HTTP status to 200.
  6. 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:

  1. Click Add MonitorTCP Port.
  2. Enter your PostgreSQL server hostname and port (default 5432).
  3. Set Check interval to 1 minute.
  4. 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:

  1. Click Add MonitorHTTP / HTTPS.
  2. Enter the import service health URL (e.g. http://recipes.yourdomain.com:3001/health or your internal address).
  3. Set Expected status to 200.
  4. 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.

  1. Upload a test recipe image and copy its thumbnail URL from the Recipesage UI.
  2. Add an HTTP monitor for that thumbnail URL.
  3. Set Expected status to 200.
  4. 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:

  1. Add an HTTP monitor for https://recipes.yourdomain.com/api/push/status (or the equivalent endpoint your deployment exposes).
  2. Set Expected status to 200.
  3. 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.

  1. Add an HTTP monitor for https://recipes.yourdomain.com/api/mealPlans.
  2. Set Method to GET.
  3. Add the header Authorization: Bearer YOUR_TEST_TOKEN.
  4. Set Expected status to 200.
  5. 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.

  1. Add an HTTP monitor for https://recipes.yourdomain.com/api/shoppingLists.
  2. Set Method to GET, Expected status to 200.
  3. Add the same test-account Authorization header.
  4. Enable Response time alerting at 2000 ms.

Step 9: Check the Authentication Service

Recipesage's login endpoint must be healthy for any user activity.

  1. Add an HTTP monitor for https://recipes.yourdomain.com/api/users/login.
  2. Set Method to POST.
  3. Add header Content-Type: application/json.
  4. Set body to {"email":"test@example.com","password":"wrong"} (an intentionally wrong credential).
  5. 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:

  1. Click Add MonitorCron Heartbeat.
  2. Set Expected interval to 1440 minutes (daily).
  3. 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.

  1. Add an HTTP monitor for your SMTP health endpoint if you run a mail proxy (e.g. Mailhog's GET /api/v2/messages on its API port).
  2. Alternatively, add a TCP Port monitor to your SMTP server: hostname mail.yourdomain.com, port 587 (STARTTLS) or 465 (SMTPS).
  3. Set Check interval to 5 minutes.

Step 12: SSL/TLS Certificate Expiry Alert

  1. Open the web-interface monitor from Step 1.
  2. Enable Monitor SSL certificate.
  3. Set Alert when certificate expires in less than 21 days.
  4. Click Save.

Step 13: Configure Alert Channels

  1. Go to Alert Channels in Vigilmon and connect Slack, email, or a webhook.
  2. Set Consecutive failures before alert to 2 on HTTP monitors.
  3. Keep Consecutive failures at 1 for 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.

Monitor your app with Vigilmon

Free plan — 5 monitors, no credit card required. Up and running in 60 seconds.

Start free →