writing-skills
writing-skills
Use when creating new skills, editing existing skills, or verifying skills work before deployment
uptime-kumaMonitor service uptime with Uptime Kuma — HTTP, TCP, DNS, Docker, and keyword checks, multi-channel alerts (Slack, email, webhook, Telegram, Discord), status pages, maintenance windows, and API automation. Use when tasks involve monitoring website or service availability, setting up alerting, creating public status pages, or tracking SLA metrics.
Independent GitHub snapshot · Automated classification · Original documentation governs
Self-hosted monitoring tool for tracking service availability with alerts and status pages. Checked against release 2.5.5 (September 2026): the stable Docker tag is louislam/uptime-kuma:2 — :1 is the older 1.x line and no longer gets new monitor types or fixes.
docker run -d --name uptime-kuma --restart unless-stopped \
-p 3001:3001 \
-v uptime-kuma-data:/app/data \
louislam/uptime-kuma:2
services:
uptime-kuma:
image: louislam/uptime-kuma:2
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- uptime-kuma-data:/app/data
- /var/run/docker.sock:/var/run/docker.sock:ro # Optional: Docker monitoring
volumes:
uptime-kuma-data:
Dashboard at http://localhost:3001. Set admin credentials on first visit.
URL: https://billing.northwind-labs.com/health
Method: GET
Expected status: 200
Interval: 60 seconds
Timeout: 10 seconds
Retries: 3 # Retry before alerting (avoids false positives)
Accepted status codes: 200-299
More reliable than status-code-only — verifies the response body contains expected content:
URL: https://billing.northwind-labs.com/health
Expected keyword: "status":"ok"
Catches cases where a reverse proxy returns 200 but the actual application is down.
Host: db-server.internal
Port: 5432
Interval: 60 seconds
Good for databases, Redis, SMTP, and any TCP service.
Hostname: northwind-labs.com
Record type: A
Expected value: 76.76.21.142
DNS server: 8.8.8.8
Detects DNS hijacking or propagation issues.
Requires Docker socket mounted (/var/run/docker.sock):
Container name: my-api
Expected status: running
Monitors container health status directly — catches OOM kills, restart loops, and crashes.
Host: 192.168.1.1
Interval: 60 seconds
URL: grpc://billing.northwind-labs.com:50051
Service name: health.v1.HealthService
SMTP Host: smtp.gmail.com
Port: 587
Security: TLS
Username: monitoring@northwind-labs.com
Password: app-specific-password
From: Uptime Kuma <monitoring@northwind-labs.com>
To: oncall@northwind-labs.com
Bot Token: from @BotFather
Chat ID: your chat/group ID
Webhook URL: from channel settings → Integrations → Webhooks
URL: https://ops.northwind-labs.com/webhooks/uptime-kuma
Method: POST
Content-Type: application/json
Body: {
"monitor": "{{ monitorJSON }}",
"message": "{{ msg }}",
"heartbeat": "{{ heartbeatJSON }}"
}
Use the webhook notification type with the provider's event API endpoint.
Public-facing pages showing service health:
Point status.northwind-labs.com to the Uptime Kuma server. Configure reverse proxy:
status.northwind-labs.com {
reverse_proxy localhost:3001
}
Create incidents manually from the status page:
Incidents show on the status page with timestamps and updates — customers see you're aware and working on it.
Prevent false alerts during planned downtime:
0 2 * * 0 (every Sunday at 2 AM)During maintenance:
Uptime Kuma has a Socket.IO-based API. For HTTP API, use the community REST API wrapper or automate via the dashboard:
// Programmatic monitor management via Socket.IO
const { io } = require("socket.io-client");
const socket = io("http://localhost:3001");
socket.emit("login", { username: "admin", password: "secret" }, (res) => {
if (res.ok) {
// Add a new monitor
socket.emit("add", {
type: "http",
name: "New API",
url: "https://billing.northwind-labs.com/health",
interval: 60,
retryInterval: 30,
maxretries: 3,
accepted_statuscodes: ["200-299"],
notificationIDList: { 1: true }, // Link to notification channel ID
}, (res) => {
console.log("Monitor added:", res);
});
}
});
Data stored in SQLite database at /app/data/kuma.db:
# Backup
docker cp uptime-kuma:/app/data/kuma.db ./kuma-backup-$(date +%F).db
# Restore
docker stop uptime-kuma
docker cp ./kuma-backup.db uptime-kuma:/app/data/kuma.db
docker start uptime-kuma
Switch the checkout API's monitor from a plain HTTP status check to HTTP with Keyword (Step: HTTP with Keyword), checking for "status":"ok" in the health response body. A reverse proxy or load balancer in front of a crashed app can still answer with 200, so a status-code-only check misses exactly this case; the keyword check fails as soon as the body stops matching.
Set Retries: 3 and a 60s interval on the production API monitor (fewer false positives from transient network blips), add a Slack notification with the team's Incoming Webhook URL, and create a recurring maintenance window (Strategy: Recurring, cron 0 2 * * 0) over the Sunday 2 AM deploy window so planned restarts don't page anyone.
kuma.db regularly — all configuration, history, and uptime data is in one SQLite file. Easy to back up, easy to lose.