diff --git a/server/api/auth_routes.py b/server/api/auth_routes.py index 3fc799a..0d32f42 100644 --- a/server/api/auth_routes.py +++ b/server/api/auth_routes.py @@ -1,3 +1,5 @@ +from datetime import datetime, timedelta + from fastapi import APIRouter, HTTPException, Request from fastapi.responses import RedirectResponse, JSONResponse @@ -49,3 +51,74 @@ async def update_settings(update: SettingsUpdate, request: Request): settings[key] = val save_settings(settings) return {"status": "ok"} + + +# Mute alerts +mute_until: datetime | None = None + + +@router.post("/api/mute") +async def mute_alerts(request: Request): + global mute_until + require_auth(request) + body = await request.json() + hours = body.get("hours", 2) + mute_until = datetime.now() + timedelta(hours=hours) + return {"status": "ok", "muted_until": mute_until.isoformat()} + + +@router.post("/api/unmute") +async def unmute_alerts(request: Request): + global mute_until + require_auth(request) + mute_until = None + return {"status": "ok"} + + +@router.get("/api/mute/status") +async def mute_status(request: Request): + require_auth(request) + if mute_until and datetime.now() < mute_until: + return {"muted": True, "until": mute_until.isoformat()} + return {"muted": False} + + +@router.get("/api/overview") +async def overview(request: Request): + """Full overview for Telegram Mini App.""" + require_auth(request) + from server.config import load_servers + from server.services.monitor import get_all_metrics + + servers = load_servers() + metrics = get_all_metrics() + + srv_list = [] + online_count = 0 + for s in servers: + m = metrics.get(s["host"], {}) + is_online = m.get("online", False) + if is_online: + online_count += 1 + srv_list.append({ + "id": s.get("id", ""), + "name": s["name"], + "host": s["host"], + "online": is_online, + "cpu": m.get("cpu_percent", 0), + "ram": m.get("ram_percent", 0), + "disk": m.get("disk_percent", 0), + "uptime": m.get("uptime", ""), + "load": m.get("load_average", ""), + }) + + is_muted = mute_until and datetime.now() < mute_until + + return { + "servers": srv_list, + "total": len(servers), + "online": online_count, + "offline": len(servers) - online_count, + "muted": is_muted, + "muted_until": mute_until.isoformat() if is_muted else None, + } diff --git a/server/services/alerter.py b/server/services/alerter.py index 54ee0c7..06859dd 100644 --- a/server/services/alerter.py +++ b/server/services/alerter.py @@ -13,6 +13,11 @@ previous_states: Dict[str, bool] = {} async def check_alerts(): """Check metrics against thresholds and send alerts.""" from server.services.telegram_bot import send_alert + from server.api.auth_routes import mute_until + + # Check mute + if mute_until and datetime.now() < mute_until: + return settings = load_settings() servers = load_servers() diff --git a/server/templates/telegram_app.html b/server/templates/telegram_app.html index edf5746..22a7fbc 100644 --- a/server/templates/telegram_app.html +++ b/server/templates/telegram_app.html @@ -2,254 +2,543 @@ - + VPS Monitor -
-

🖥 VPS Monitor

-
Мониторинг серверов
-
- -
-
-
-
-
Всего
-
-
-
-
-
Online
-
-
-
-
-
Offline
+
+
+
+ Загрузка...
- - - +