# Meezi uptime monitoring (Uptime Kuma)

Self-hosted uptime + TLS-expiry monitoring with alerting. Runs as a separate
compose stack so it stays up independently of app deploys.

## Stand it up (one time, on the prod host)
```bash
cd /path/to/meezi
docker compose -f docker-compose.monitoring.yml up -d
```
Then either:
- add a DNS A record `status.meezi.ir → server IP` and reload Caddy
  (`docker exec meezi-caddy caddy reload` or restart the caddy stack) — the
  `status.{$DOMAIN}` block is already in the Caddyfile, **or**
- reach it directly at `http://SERVER:3201` for the initial setup.

First visit creates the admin account — set a strong password.

## Monitors to add (in the Uptime Kuma UI)
Add one **HTTP(s)** monitor per public surface, interval 60s, accept 2xx/3xx:

| Name | URL | Notes |
|------|-----|-------|
| Website | https://meezi.ir/fa | marketing |
| Dashboard | https://app.meezi.ir/fa/login | merchant panel |
| API health | https://api.meezi.ir/api/public/security-config | returns JSON 200 |
| Koja | https://koja.meezi.ir/fa | public discovery |
| Admin | https://admin.meezi.ir | internal panel |
| Guest menu | https://app.meezi.ir/q/healthcheck | should be 200 (not 500) |

For each HTTPS monitor enable **"Certificate Expiry Notification"** — this
catches the recurring ~90-day Let's Encrypt cert-chain breakages early
(see the mirror-cert runbook). Set the threshold to 14 days.

## Alerts
Settings → Notifications → add a channel (Telegram bot or email/SMTP), then
attach it to every monitor. Telegram is simplest: create a bot via @BotFather,
get the chat id, paste both into Uptime Kuma.

## What this does NOT replace
- **Backups** — see `scripts/backup/RESTORE.md`.
- **Crash auto-recovery** — Docker `restart: unless-stopped` already restarts
  crashed containers; Uptime Kuma tells you when one is flapping or down.

## Status page (optional)
Uptime Kuma can publish a public status page (Settings → Status Pages) at
`status.meezi.ir/status/meezi` if you want customers to see uptime.
