tutorial

Monitoring Chevereto with Vigilmon

Chevereto is a self-hosted image hosting platform similar to Imgur — here's how to monitor its homepage, API layer, upload workflow, SSL certificate, and MySQL database health with Vigilmon.

Chevereto is an open-source self-hosted image hosting platform: a PHP/MySQL application that provides a full image hosting service with user accounts, albums, social features, and direct image links — essentially a self-hosted Imgur alternative for communities, content creators, and developers. Because Chevereto relies on PHP rendering dynamic pages with MySQL-backed settings and user data, outages can be subtle: the web server may respond while PHP is failing, or PHP may render while MySQL is too slow to serve image queries. Vigilmon monitors Chevereto across all layers: the gallery homepage, the PHP API layer, the core upload workflow, SSL certificate validity, and independent MySQL database health via a TCP probe.

What You'll Set Up

  • HTTP monitor for the Chevereto homepage (port 80/443)
  • HTTP monitor for the Chevereto API layer availability (/api/1/upload)
  • HTTP monitor for the Chevereto upload form (/upload)
  • SSL certificate expiry alerts for HTTPS Chevereto deployments
  • Heartbeat monitor combining a keyword check and a MySQL TCP probe for database health

Prerequisites

  • Chevereto deployed and accessible (Apache or Nginx serving PHP on port 80 or 443)
  • MySQL running on port 3306 (the default Chevereto database)
  • A free Vigilmon account

Step 1: Monitor the Chevereto Homepage

The Chevereto homepage is served by Apache or Nginx. A GET / returns the gallery homepage or login page — a 200 response confirms PHP has bootstrapped successfully and the web server is running. Chevereto queries MySQL for site settings during page render, so a successful homepage confirms the database connection is functional.

  1. Log in to vigilmon.online and click Add Monitor.
  2. Set Type to HTTP / HTTPS.
  3. Enter your Chevereto URL: http://your-server or https://images.yourdomain.com.
  4. Set Check interval to 1 minute.
  5. Set Expected HTTP status to 200.
  6. Under Response body check, enter your site name or Upload to confirm the Chevereto application rendered a real page rather than a PHP error or database connection failure message.
  7. Click Save.

If Chevereto is configured to require login before viewing the gallery, the homepage will redirect to a login form — enable Follow redirects and check for Login or Sign in to confirm the application is serving correctly.


Step 2: Monitor the Chevereto API Layer

Chevereto's v1 REST API endpoint at /api/1/upload is the core programmatic interface. Sending a GET request to this endpoint (without a valid API key) should return a 4xx error (typically 400 Bad Request or 403 Forbidden) rather than a 5xx server error — a 4xx response confirms the PHP API layer is running, MySQL is accessible, and the Chevereto application can handle API requests. A 5xx response indicates a PHP or database failure.

  1. Click Add Monitor in Vigilmon.
  2. Set Type to HTTP / HTTPS.
  3. Enter the API URL: http://your-server/api/1/upload
  4. Set Expected HTTP status to any 4xx code — use 400 or set the monitor to accept 4xx as a valid "up" response.
    • In Vigilmon, set Expected status code to 400 and enable Treat 4xx as up if your instance returns 400 for unauthenticated requests.
  5. Under Response body check, enter error or "status_code" to confirm a Chevereto JSON error response rather than a PHP fatal error page.
  6. Set Check interval to 5 minutes.
  7. Click Save.

A healthy unauthenticated request returns something like:

{
  "status_code": 400,
  "error": {
    "message": "Empty upload request",
    "code": 310
  },
  "status_txt": "Bad Request"
}

The key distinction: a Chevereto-formatted JSON error means the application layer is healthy. A generic PHP error page or an nginx 502 means something deeper has failed.


Step 3: Monitor the Upload Form

The upload page at /upload is the primary user-facing workflow for anonymous and authenticated image uploads. A GET /upload returns the upload form — a 200 response confirms the upload workflow is accessible and that Chevereto has rendered the core functionality page successfully.

  1. Click Add Monitor in Vigilmon.
  2. Set Type to HTTP / HTTPS.
  3. Enter the upload URL: http://your-server/upload
  4. Set Expected HTTP status to 200.
  5. Under Response body check, enter Upload to confirm the upload form rendered correctly.
  6. Set Check interval to 5 minutes.
  7. Click Save.

If Chevereto's routing breaks (for example, after an .htaccess misconfiguration or a Nginx rewrite rule change following an update), /upload may return a 404 while the homepage still works — this monitor catches that partial routing failure.


Step 4: SSL Certificate Alerts for HTTPS Deployments

Chevereto is commonly served over HTTPS via Apache with mod_ssl or Nginx with Let's Encrypt. An expired certificate immediately breaks all image uploads via the API, prevents browser access, and breaks any external services embedding Chevereto images.

  1. Open the HTTPS monitor for your Chevereto domain (created in Step 1).
  2. Enable Monitor SSL certificate under the SSL settings.
  3. Set Alert when certificate expires in less than 21 days.
  4. Click Save.

Verify your certificate renewal setup:

# Check current certificate expiry
openssl s_client -connect images.yourdomain.com:443 -servername images.yourdomain.com \
  </dev/null 2>/dev/null | openssl x509 -noout -enddate

# For Apache + certbot
certbot renew --dry-run

# For Nginx + certbot
nginx -t && certbot renew --dry-run

A 21-day window gives you three weeks to manually renew if the automatic renewal process fails.


Step 5: Heartbeat Monitoring for Database and Application Health

The homepage loading confirms MySQL was reachable at the moment of the check — but a TCP probe to MySQL port 3306 gives you an independent, lightweight signal that the database process is accepting connections, separate from PHP's ability to render pages. Combining a homepage keyword check (which confirms PHP rendered content from MySQL) with a MySQL TCP probe gives you precise fault isolation: if the homepage keyword check fails but the MySQL TCP probe succeeds, the problem is in PHP; if both fail, MySQL is down.

Create the heartbeat monitor first:

  1. In Vigilmon, click Add MonitorCron Heartbeat.
  2. Set Expected ping interval to 60 minutes.
  3. Copy the heartbeat URL (e.g. https://vigilmon.online/heartbeat/abc123).

Add a separate TCP monitor for MySQL:

  1. Click Add Monitor in Vigilmon.
  2. Set Type to TCP.
  3. Enter your server address: your-server
  4. Set Port to 3306.
  5. Set Check interval to 2 minutes.
  6. Click Save.

Then set up a cron job for the heartbeat on the Chevereto host:

#!/bin/bash
# /etc/cron.hourly/chevereto-heartbeat

CHEVERETO_URL="http://localhost"
VIGILMON_HEARTBEAT="https://vigilmon.online/heartbeat/abc123"

# Fetch the homepage and check for the Upload button or site name
RESPONSE=$(curl -s -o /tmp/chev_health.html -w "%{http_code}" \
  --max-time 15 \
  "${CHEVERETO_URL}/")

if [ "$RESPONSE" = "200" ] && grep -qi "upload" /tmp/chev_health.html; then
  curl -s "${VIGILMON_HEARTBEAT}" > /dev/null
else
  echo "Chevereto homepage check failed (HTTP ${RESPONSE})" >&2
fi

rm -f /tmp/chev_health.html

Make the script executable:

chmod +x /etc/cron.hourly/chevereto-heartbeat

For Docker-based Chevereto deployments:

docker exec chevereto curl -s http://localhost/ \
  | grep -qi "upload" && curl -s "https://vigilmon.online/heartbeat/abc123"

If Chevereto's PHP layer fails to query MySQL for site settings, the homepage will return a database connection error instead of the gallery UI — the keyword check for "Upload" will fail, the heartbeat will not fire, and Vigilmon will alert you after the interval passes.


Step 6: Configure Alert Channels

  1. Go to Alert Channels in Vigilmon and add Slack, email, or a webhook.
  2. For the homepage monitor, set Consecutive failures before alert to 2 — PHP-FPM process recycling can cause a single brief failure.
  3. For the MySQL TCP probe, set Consecutive failures before alert to 1 — database loss warrants immediate alerting.
  4. For the heartbeat, set Grace period to 0.

Summary

| Monitor | Target | What It Catches | |---|---|---| | Homepage | http://your-server/ | PHP/web server down, MySQL connection failure | | API layer | /api/1/upload | PHP API broken, Chevereto not bootstrapping | | Upload form | /upload | Routing broken, upload workflow inaccessible | | MySQL TCP | your-server:3306 | MySQL process down, independent of PHP | | SSL certificate | Chevereto domain | Let's Encrypt certificate expiry | | Cron heartbeat | Heartbeat URL | Full-stack PHP + MySQL health confirmation |

Chevereto stores and serves images that other websites, posts, and users may depend on — a broken image host means broken embeds across the internet and lost user-uploaded content. With Vigilmon monitoring the gallery homepage, the API layer, the upload workflow, MySQL independently, and a heartbeat that confirms PHP rendered real content from the database, you'll catch outages in seconds rather than discovering them in your support queue hours later.

Monitor your app with Vigilmon

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

Start free →