tutorial

Monitoring Maybe Finance with Vigilmon: Health, Sync Jobs & SSL Alerts

Keep your self-hosted Maybe Finance instance reliable — monitor the health endpoint, web UI, background sync jobs, and SSL certificate expiry with Vigilmon.

Maybe Finance is a beautifully designed open-source personal finance app you can host on your own server. That ownership is its biggest selling point — but it also means that when a background sync job silently fails or the database crashes, there's no SaaS team to page. Vigilmon fills that gap. In this tutorial you'll set up layered monitoring for a self-hosted Maybe instance: the Rails health endpoint, web UI availability, background job heartbeats, and SSL certificate alerts.

What You'll Build

  • A Vigilmon HTTP monitor for Maybe's health endpoint
  • A web UI availability check that validates the login page
  • A heartbeat monitor for Maybe's background sync jobs
  • SSL certificate expiry alerts
  • Email/Slack alert routing

Prerequisites

  • A running Maybe Finance instance (Docker or bare-metal)
  • Maybe exposed at a public or VPN-accessible URL
  • A free Vigilmon account

Step 1: Monitor the Health Endpoint

Maybe Finance is a Ruby on Rails application and ships with Rails' built-in health controller. By default it responds at /up with a 200 OK when the app is healthy and raises an exception (returning 500) when the database is unreachable.

Log in to Vigilmon and create a new HTTP Monitor:

| Field | Value | |---|---| | URL | https://maybe.yourdomain.com/up | | Method | GET | | Check interval | 60 seconds | | Expected status | 200 | | Timeout | 10 seconds | | Regions | 2–3 for redundancy |

This single check catches app crashes, database connection failures, and deployment regressions. If you have Maybe behind a reverse proxy (nginx, Caddy), the monitor validates the entire network path including your proxy config.


Step 2: Web UI Availability Check

The health endpoint confirms the Rails process is alive, but it doesn't verify that users can actually reach the login page. Create a second HTTP monitor that checks the UI:

| Field | Value | |---|---| | URL | https://maybe.yourdomain.com | | Method | GET | | Expected status | 200 | | Keyword match | Maybe | | Check interval | 5 minutes |

The keyword match (Maybe) ensures the page content is correct — a misconfigured reverse proxy that returns an nginx placeholder page would still return 200, but the keyword check catches it. Adjust the keyword to match a string that only appears in Maybe's actual UI.


Step 3: Heartbeat Monitor for Background Sync Jobs

Maybe's most critical background operation is syncing account balances from financial institutions (Plaid, manual imports). If the Sidekiq worker process crashes, transactions stop updating silently. The heartbeat pattern makes that silence loud.

In Vigilmon, go to Heartbeat Monitors → New and configure:

| Field | Value | |---|---| | Name | Maybe Sync Worker | | Expected interval | 5 minutes | | Grace period | 2 minutes |

Copy the generated ping URL:

https://vigilmon.online/api/heartbeats/YOUR-UUID/ping

Now add a Sidekiq job that pings this URL after every successful sync cycle. Create a file in your Maybe installation's custom jobs directory (or add to an existing initializer if you're running the Docker image with mounted volumes):

# app/jobs/vigilmon_heartbeat_job.rb
class VigilmonHeartbeatJob < ApplicationJob
  queue_as :default

  def perform
    url = ENV['VIGILMON_HEARTBEAT_URL']
    return unless url.present?

    uri = URI.parse(url)
    Net::HTTP.get(uri)
  rescue StandardError => e
    Rails.logger.error("[VigilmonHeartbeat] ping failed: #{e.message}")
  end
end

Schedule it in config/schedule.rb (via whenever gem) or your Sidekiq-cron config:

# config/sidekiq_cron.yml
vigilmon_heartbeat:
  cron: "*/5 * * * *"
  class: VigilmonHeartbeatJob

Set the environment variable:

VIGILMON_HEARTBEAT_URL=https://vigilmon.online/api/heartbeats/YOUR-UUID/ping

If you're using Maybe's official Docker Compose setup, add this to the environment: block of the worker service. Vigilmon alerts you the moment the 7-minute window (interval + grace) passes without a ping — meaning your Sidekiq worker has stopped processing jobs.


Step 4: SSL Certificate Expiry Alerts

A lapsed SSL certificate locks every user out of their financial data. Vigilmon monitors certificate expiry automatically when you use HTTPS monitors. To add a dedicated certificate alert:

In Vigilmon, edit your health endpoint monitor and enable SSL Certificate Monitoring:

| Field | Value | |---|---| | Alert when expiry < | 21 days | | Alert again at | 7 days |

This gives you time to renew before users see browser warnings. If you're using Let's Encrypt with Certbot or acme.sh, your cert auto-renews at 30 days — this alert fires only if auto-renewal fails.


Step 5: Alert Routing

Email

Vigilmon → Alert Channels → Email. Add your address and assign it to all three monitors (health endpoint, web UI, heartbeat).

Slack

  1. Create a Slack incoming webhook in your workspace
  2. Vigilmon → Alert Channels → Add Channel → Webhook → paste the URL
  3. Assign to all monitors

A typical alert looks like:

🔴 *maybe.yourdomain.com/up* is DOWN
Status: 500 | Duration: 3m 45s
Check your Sidekiq worker and database connection.

Production Checklist

  • [ ] /up health monitor is active with 60-second polling
  • [ ] Web UI keyword check covers the login page
  • [ ] VIGILMON_HEARTBEAT_URL set in the Sidekiq worker's environment
  • [ ] Heartbeat job only pings on successful completion
  • [ ] SSL expiry alert configured for 21-day advance warning
  • [ ] Alert channels tested end-to-end

Wrapping Up

Self-hosting Maybe Finance gives you full control over your financial data, but full control also means full responsibility for uptime. With Vigilmon you now have:

  • App health: /up polled every 60 seconds
  • UI validation: login page checked every 5 minutes
  • Sync worker: heartbeat confirms jobs are running
  • SSL: automatic expiry alerts before certs lapse

All three layers together mean a silent failure anywhere in the stack triggers an alert within minutes.

Sign up for Vigilmon — free tier covers multiple monitors with no credit card required.

Monitor your app with Vigilmon

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

Start free →