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:
- Log in to Vigilmon and click New Monitor → HTTP.
- Set URL to
https://invoices.yourdomain.com/(the root redirects to/login). - Set Check interval to 60 seconds.
- Set Expected status code to
200. - Under Advanced → Keyword check, add:
- Keyword present:
SolidInvoice
- Keyword present:
- 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:
- Click New Monitor → HTTP in Vigilmon.
- Set URL to
https://invoices.yourdomain.com/login. - Set Expected status code to
200. - Under Advanced → Keyword check, configure:
- Keyword present:
username(the login form field name) - Keyword present:
password
- Keyword present:
- 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:
- Click New Monitor → HTTP in Vigilmon.
- Set URL to
https://invoices.yourdomain.com/login. - Set Expected status code to
200. - Under Advanced → Keyword check, configure:
- Keyword absent:
SQLSTATE - Keyword absent:
An error occurred - Keyword absent:
500 Internal Server Error
- Keyword absent:
- 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:
- In Vigilmon, click New Monitor → Heartbeat.
- Name it
SolidInvoice Messenger Worker. - Set Expected interval to
86400seconds (24 hours) — or match your recurring invoice cron schedule. - Set Grace period to
3600seconds (1 hour) to absorb slight timing variance. - Copy the generated heartbeat URL.
- 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.
- Click New Monitor → HTTP in Vigilmon.
- Set URL to
https://invoices.yourdomain.com/login. - Under Advanced → SSL certificate, enable:
- Alert when certificate expires in fewer than 30 days
- Alert when certificate expires in fewer than 7 days
- 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.