new
هذا الالتزام موجود في:
113
README.md
Normal file
113
README.md
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
# Uptime Kuma POC — Monitoring & Alerting on Ghaymah Cloud
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
|
||||||
|
Deploy Uptime Kuma as a containerized app on Ghaymah Cloud, prove out
|
||||||
|
HTTP monitoring + Telegram alerting, and expose a public status page —
|
||||||
|
without building a monitoring system from scratch.
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
Internet
|
||||||
|
|
|
||||||
|
v
|
||||||
|
+-------------------+
|
||||||
|
| Ghaymah Cloud |
|
||||||
|
+-------------------+
|
||||||
|
| |
|
||||||
|
v v
|
||||||
|
+------------------+ +------------------+
|
||||||
|
| Uptime Kuma | | demo-web-server |
|
||||||
|
| (container) |-->| (nginx) |
|
||||||
|
| port 3001 | | port 80 |
|
||||||
|
+------------------+ +------------------+
|
||||||
|
| |
|
||||||
|
HTTP check Alert on
|
||||||
|
every 60s Down/Up
|
||||||
|
| |
|
||||||
|
v v
|
||||||
|
Public Status Telegram
|
||||||
|
Page
|
||||||
|
```
|
||||||
|
|
||||||
|
## What was deployed
|
||||||
|
|
||||||
|
| App | Image | Port | Instances | Volume |
|
||||||
|
|--------------------|----------------------------|------|-----------|--------------|
|
||||||
|
| `uptime-kuma` | `louislam/uptime-kuma:2` | 3001 | 1 | `/app/data` |
|
||||||
|
| `demo-web-server` | `nginx` | 80 | 1 | none |
|
||||||
|
|
||||||
|
Both run as single-instance Ghaymah Apps. Uptime Kuma is intentionally
|
||||||
|
kept at **1 instance** — it stores its data in a local SQLite database,
|
||||||
|
so scaling it out would split monitor history across separate,
|
||||||
|
inconsistent instances.
|
||||||
|
|
||||||
|
`demo-web-server` (plain nginx) was added as a self-owned target to
|
||||||
|
monitor, so the POC watches infrastructure we actually control rather
|
||||||
|
than a third-party test endpoint.
|
||||||
|
|
||||||
|
## Monitoring setup
|
||||||
|
|
||||||
|
- **Monitor:** `test app`
|
||||||
|
- **Type:** HTTP(s)
|
||||||
|
- **Target:** `https://demo-web-server-web-9b9b121d.hosted.cumin.dev/`
|
||||||
|
- **Check interval:** every 60 seconds
|
||||||
|
- **Retries:** 0 (flags Down immediately — good for fast POC testing)
|
||||||
|
- **Timeout:** 48 seconds
|
||||||
|
|
||||||
|
During setup the monitor was pointed first at `httpstat.us/200` (found
|
||||||
|
unstable, frequent 502s) and then `httpbin.org/status/200` for
|
||||||
|
stability testing, before finally being switched to the team's own
|
||||||
|
nginx instance.
|
||||||
|
|
||||||
|
## Alerting
|
||||||
|
|
||||||
|
- **Channel:** Telegram
|
||||||
|
- Created via `@BotFather`, bot token and chat ID configured as an
|
||||||
|
Uptime Kuma notification, linked to the `test app` monitor.
|
||||||
|
- **Tested:** forced a Down state (pointed the monitor at an endpoint
|
||||||
|
returning HTTP 502) and confirmed a Telegram alert arrived; then
|
||||||
|
restored a healthy endpoint and confirmed the recovery (Up) alert
|
||||||
|
arrived as well.
|
||||||
|
|
||||||
|
## Public Status Page
|
||||||
|
|
||||||
|
- **URL:** https://uptime-kuma-web-3aa83c30.hosted.cumin.dev/status/ghaymah-status
|
||||||
|
- **Access:** public, no login required
|
||||||
|
- Shows overall status ("All Systems Operational"), the `test app`
|
||||||
|
monitor grouped under **Services**, its uptime percentage, and a
|
||||||
|
recent heartbeat history bar.
|
||||||
|
|
||||||
|
## Data persistence
|
||||||
|
|
||||||
|
Uptime Kuma stores its SQLite database and configuration under
|
||||||
|
`/app/data` inside the container, which is mounted to a persistent
|
||||||
|
Ghaymah volume. Restarting or redeploying the container does not lose
|
||||||
|
monitors, notification settings, or status page configuration.
|
||||||
|
|
||||||
|
## Export / configuration snapshot
|
||||||
|
|
||||||
|
This Uptime Kuma version (2.5.4) does not currently expose a
|
||||||
|
Settings > Backup/Export screen, so `uptime-kuma-config-export.json`
|
||||||
|
in this folder was assembled by hand from the live dashboard to
|
||||||
|
document every setting used in this POC (monitor config, notification
|
||||||
|
setup, status page config, deployment parameters). Secrets (bot
|
||||||
|
token, chat ID) are intentionally redacted from that file.
|
||||||
|
|
||||||
|
## How to verify it yourself
|
||||||
|
|
||||||
|
1. Open the [status page](https://uptime-kuma-web-3aa83c30.hosted.cumin.dev/status/ghaymah-status) — no login needed.
|
||||||
|
2. To test alerting: edit the `test app` monitor's URL to point at any
|
||||||
|
endpoint that returns a non-2xx status, save, and wait up to 60
|
||||||
|
seconds for the next heartbeat. A Down alert should arrive on
|
||||||
|
Telegram. Point it back at a healthy URL to see the Up recovery
|
||||||
|
alert.
|
||||||
|
|
||||||
|
## Next steps (not yet done)
|
||||||
|
|
||||||
|
- Put Uptime Kuma behind a custom domain / HTTPS via reverse proxy
|
||||||
|
(Ghaymah already terminates HTTPS on its own subdomains, so this is
|
||||||
|
optional for the POC).
|
||||||
|
- Consider Telegram bot token rotation before handing this off, since
|
||||||
|
the token was shared in a chat during setup.
|
||||||
102
uptime-kuma-config-export.json
Normal file
102
uptime-kuma-config-export.json
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
{
|
||||||
|
"export_info": {
|
||||||
|
"note": "Manual configuration export. This Uptime Kuma version (2.5.4) does not expose a Settings > Backup/Export screen, so this file was assembled by hand from the live dashboard to document the POC exactly as deployed.",
|
||||||
|
"exported_by": "Mahmoud",
|
||||||
|
"export_date": "2026-09-16",
|
||||||
|
"uptime_kuma_version": "2.5.4"
|
||||||
|
},
|
||||||
|
"infrastructure": {
|
||||||
|
"platform": "Ghaymah Cloud",
|
||||||
|
"deployment_type": "Containerized App",
|
||||||
|
"apps": [
|
||||||
|
{
|
||||||
|
"app_name": "uptime-kuma",
|
||||||
|
"container_image": "louislam/uptime-kuma:2",
|
||||||
|
"size": "Starter",
|
||||||
|
"instances": 1,
|
||||||
|
"port": {
|
||||||
|
"name": "web",
|
||||||
|
"container_port": 3001
|
||||||
|
},
|
||||||
|
"volume": {
|
||||||
|
"mount_path": "/app/data",
|
||||||
|
"purpose": "Persist SQLite database, monitors, notification settings and status page config across restarts"
|
||||||
|
},
|
||||||
|
"sleep_when_idle": false,
|
||||||
|
"run_once": false,
|
||||||
|
"public_url": "https://uptime-kuma-web-3aa83c30.hosted.cumin.dev"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"app_name": "demo-web-server",
|
||||||
|
"container_image": "nginx",
|
||||||
|
"size": "Starter",
|
||||||
|
"instances": 1,
|
||||||
|
"port": {
|
||||||
|
"name": "web",
|
||||||
|
"container_port": 80
|
||||||
|
},
|
||||||
|
"purpose": "Simple, self-owned target service to monitor (replacing the public httpbin.org test endpoint)",
|
||||||
|
"public_url": "https://demo-web-server-web-9b9b121d.hosted.cumin.dev/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"database": {
|
||||||
|
"type": "SQLite",
|
||||||
|
"reason": "Single instance deployment, no concurrent-write requirements, uses the persistent volume already mounted at /app/data"
|
||||||
|
},
|
||||||
|
"monitors": [
|
||||||
|
{
|
||||||
|
"friendly_name": "test app",
|
||||||
|
"monitor_type": "HTTP(s)",
|
||||||
|
"url": "https://demo-web-server-web-9b9b121d.hosted.cumin.dev/",
|
||||||
|
"heartbeat_interval_seconds": 60,
|
||||||
|
"retries": 0,
|
||||||
|
"request_timeout_seconds": 48,
|
||||||
|
"resend_notification_if_down_x_times": 0,
|
||||||
|
"method": "GET",
|
||||||
|
"notes": "Originally pointed at https://httpstat.us/200 (unstable, returned intermittent 502s), then https://httpbin.org/status/200 for stability testing, finally switched to the self-owned nginx demo server above."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"notifications": [
|
||||||
|
{
|
||||||
|
"friendly_name": "My Telegram Alert (1)",
|
||||||
|
"type": "Telegram",
|
||||||
|
"linked_to_monitors": ["test app"],
|
||||||
|
"bot_token": "REDACTED - stored securely in Uptime Kuma, not included in this export",
|
||||||
|
"chat_id": "REDACTED - stored securely in Uptime Kuma, not included in this export",
|
||||||
|
"tested": true,
|
||||||
|
"test_result": "Down and Up alerts both confirmed delivered to Telegram during failover testing"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"status_page": {
|
||||||
|
"slug": "ghaymah-status",
|
||||||
|
"title": "Ghaymah Services Status",
|
||||||
|
"public_url": "https://uptime-kuma-web-3aa83c30.hosted.cumin.dev/status/ghaymah-status",
|
||||||
|
"access": "Public, no login required",
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"name": "Services",
|
||||||
|
"monitors": ["test app"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"refresh_interval_seconds": 300,
|
||||||
|
"theme": "Auto"
|
||||||
|
},
|
||||||
|
"testing_performed": [
|
||||||
|
{
|
||||||
|
"test": "DOWN detection",
|
||||||
|
"method": "Pointed monitor at an endpoint returning HTTP 502",
|
||||||
|
"result": "Monitor correctly flagged as Down, event logged with message 'Request failed with status code 502'"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"test": "UP recovery",
|
||||||
|
"method": "Switched monitor URL to a stable 200-returning endpoint",
|
||||||
|
"result": "Monitor correctly recovered to Up status, uptime percentage began climbing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"test": "Telegram alerting",
|
||||||
|
"method": "Observed notifications during the Down -> Up transition above",
|
||||||
|
"result": "Alerts received on Telegram bot for both state changes"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
المرجع في مشكلة جديدة
حظر مستخدم