tutorial

SolidInvoice Monitoring with Vigilmon: Uptime, Database Health & Background Job Alerts

Monitor your self-hosted SolidInvoice instance with Vigilmon — track application availability, catch Symfony database errors, and get alerted when background invoice jobs stall.

Your SolidInvoice recurring invoices quietly stopped going out two weeks ago. The Symfony Messenger worker crashed overnight, no one noticed, and your clients never received their monthly billing. You discovered it when a client asked why their invoice hadn't arrived.

SolidInvoice is a clean, minimal open-source invoicing application built on Symfony — client management, invoices, quotes, recurring billing, payment tracking, and a client-facing portal, all on your own server. Minimal footprint, no SaaS fees, no vendor lock-in. But self-hosted means you're responsible for availability. Vigilmon gives you the external uptime layer that catches downtime, database failures, and stalled background workers before they disrupt your billing.

This tutorial covers monitoring SolidInvoice end-to-end with Vigilmon.

What You'll Build

  • A Vigilmon HTTP monitor on the SolidInvoice login page
  • A keyword monitor confirming correct application identity
  • A keyword monitor that detects Symfony database errors
  • A heartbeat monitor for the recurring invoice background job
  • SSL certificate expiry alerts for HTTPS deployments

Prerequisites

  • A self-hosted SolidInvoice instance (Docker or native PHP/Symfony install)
  • SolidInvoice serving on port 80/443 via nginx or Apache
  • A free account at vigilmon.online

Step 1: Monitor the SolidInvoice Login Page

SolidInvoice does not expose an unauthenticated API health endpoint by default. The most reliable external health check is the login page: a 200 response confirms nginx is routing traffic, PHP-FPM is processing Symfony requests, and the database connection is healthy enough to render the CSRF token and session cookie.

Test it:

curl -I https://invoices.yourdomain.com/login

Expected: HTTP/2 200 with the SolidInvoice login form in the body.

Set up the Vigilmon monitor:

  1. Log in to Vigilmon and click New Monitor → HTTP.
  2. Set URL to https://invoices.yourdomain.com/ (the root redirects to /login).
  3. Set Check interval to 60 seconds.
  4. Set Expected status code to 200.
  5. Under Advanced → Keyword check, add:
    • Keyword present: SolidInvoice
  6. Save the monitor.

The keyword check on SolidInvoice guards against a scenario where your nginx config is serving a different application or a default placeholder page at the same domain — the monitor confirms you're hitting the right app.


Step 2: Confirm Login Form Fields Are Present

A healthy SolidInvoice login page renders an HTML form with username/email and password fields. If the application is partially misconfigured — wrong APP_ENV, missing session store, or a bad template cache — Symfony may serve a blank or partially-rendered page that still returns 200.

Add a second keyword check layer:

  1. Click New Monitor → HTTP in Vigilmon.
  2. Set URL to https://invoices.yourdomain.com/login.
  3. Set Expected status code to 200.
  4. Under Advanced → Keyword check, configure:
    • Keyword present: username (the login form field name)
    • Keyword present: password
  5. Save.

This confirms not just that Symfony is running, but that the login controller is rendering the full form correctly.


Step 3: Keyword Monitor for Symfony Database Errors

The Symfony login page requires a live database connection to generate the CSRF token (stored in the session, backed by the database or cache layer) and to validate credentials. If MySQL or MariaDB becomes unreachable, Symfony throws a 500 error containing a stack trace.

Add a monitor that alerts on database error strings:

  1. Click New Monitor → HTTP in Vigilmon.
  2. Set URL to https://invoices.yourdomain.com/login.
  3. Set Expected status code to 200.
  4. Under Advanced → Keyword check, configure:
    • Keyword absent: SQLSTATE
    • Keyword absent: An error occurred
    • Keyword absent: 500 Internal Server Error
  5. Save.

When the database goes offline, Symfony renders a 500 page containing SQLSTATE[HY000] and An error occurred. Vigilmon detects both the HTTP 500 (via the status code check) and the error string (via the keyword check), firing on either condition.


Step 4: Heartbeat Monitor for the Symfony Messenger Worker

SolidInvoice uses Symfony Messenger for async operations: recurring invoice generation, email notifications for invoice delivery, and payment reminder dispatching. The Messenger worker must be running continuously to process these queued jobs. If the worker crashes or is never started after a server reboot, invoices queue up indefinitely but are never dispatched.

Configure a Vigilmon heartbeat:

  1. In Vigilmon, click New Monitor → Heartbeat.
  2. Name it SolidInvoice Messenger Worker.
  3. Set Expected interval to 86400 seconds (24 hours) — or match your recurring invoice cron schedule.
  4. Set Grace period to 3600 seconds (1 hour) to absorb slight timing variance.
  5. Copy the generated heartbeat URL.
  6. Save the monitor.

Wire it to your cron job:

SolidInvoice's recurring invoices are triggered by a cron-scheduled console command. Add a Vigilmon ping after the command succeeds:

0 6 * * * cd /var/www/solidinvoice && php bin/console solidinvoice:recurring:process >> /dev/null 2>&1 && curl -s https://vigilmon.online/api/heartbeat/<your-token> > /dev/null

For Docker deployments:

0 6 * * * docker exec solidinvoice_app php bin/console solidinvoice:recurring:process >> /dev/null 2>&1 && curl -s https://vigilmon.online/api/heartbeat/<your-token> > /dev/null

The && operator ensures the heartbeat ping only fires when the recurring process command exits cleanly. A failed command means no ping, and Vigilmon fires a missed-heartbeat alert after the grace period.

Also monitor the Messenger worker process separately if you run it as a long-lived service:

*/5 * * * * pgrep -f "messenger:consume" > /dev/null && curl -s https://vigilmon.online/api/heartbeat/<worker-token> > /dev/null

Step 5: SSL Certificate Monitoring

SolidInvoice's client invoice portal must be accessible over HTTPS. Clients receive invoice links by email — if your certificate expires, they see a browser security warning and cannot view or pay their invoices. Payment gateway callbacks also require valid TLS.

  1. Click New Monitor → HTTP in Vigilmon.
  2. Set URL to https://invoices.yourdomain.com/login.
  3. Under Advanced → SSL certificate, enable:
    • Alert when certificate expires in fewer than 30 days
    • Alert when certificate expires in fewer than 7 days
  4. Save.

For Let's Encrypt deployments, the auto-renewal cron (certbot renew) can fail silently if your nginx configuration changes break the ACME challenge. The 30-day warning gives you a full renewal window to diagnose and fix the issue.


Step 6: Alert Channels

Go to Notifications → New Channel in Vigilmon and configure:

  • Email — immediate alerts to your billing team
  • Webhook — post to Slack, Discord, or a PagerDuty integration

A database connectivity alert looks like:

🔴 DOWN: SolidInvoice Login Page
Keyword "SQLSTATE" detected in response body
Region: EU-West | Triggered: 2026-01-15 04:32 UTC
Action required: check MySQL/MariaDB connectivity

A missed heartbeat for the recurring job looks like:

🔴 MISSED: SolidInvoice Messenger Worker
Last ping: 2026-01-14 06:00 UTC (24h+ ago)
Action required: check Symfony Messenger worker process

Step 7: Status Page

Go to Status Pages → New Status Page in Vigilmon. Add all monitors:

  • SolidInvoice Application (login page)
  • SolidInvoice Login Form (keyword check)
  • SolidInvoice Database Check
  • SolidInvoice Messenger Worker (heartbeat)
  • SSL Certificate

Publish the page for your operations team.


What You've Built

| Scenario | How Vigilmon catches it | |---|---| | nginx/Apache proxy down | Login page monitor detects 502 | | PHP-FPM / Symfony process crash | Login page returns non-200 | | Database (MySQL/MariaDB) unreachable | Keyword monitor detects SQLSTATE error | | Login form not rendering (config issue) | Keyword monitor for username/password fields | | Symfony Messenger worker stopped | Heartbeat monitor fires missed-beat alert | | Recurring invoices not dispatching | Same heartbeat surfaces the cron gap | | SSL certificate expiry | Certificate monitor fires 30-day and 7-day warnings | | Let's Encrypt renewal failure | SSL monitor catches expired cert before clients do |


SolidInvoice's minimalist design makes it easy to deploy and maintain — but the Symfony Messenger worker and recurring invoice cron are silent by default when they fail. Vigilmon adds the external monitoring layer that Symfony itself can't provide: an independent check from outside your network that confirms the full stack from TCP through the application to the database.

Start monitoring your SolidInvoice instance today — register free at vigilmon.online.

Monitor your app with Vigilmon

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

Start free →