diff --git a/.env.example b/.env.example index 6fadd322..2a801dfb 100644 --- a/.env.example +++ b/.env.example @@ -282,9 +282,9 @@ MONITORING_LOGS_RETENTION_DAYS=30 NOTIFICATION_CACHE_HOURS=24 # ===== СТАТУС СЕРВЕРОВ ===== -# Режимы: disabled, external_link, xray +# Режимы: disabled, external_link, external_link_miniapp, xray SERVER_STATUS_MODE=disabled -# Ссылка на внешний мониторинг (для режима external_link) +# Ссылка на внешний мониторинг (для режимов external_link и external_link_miniapp) SERVER_STATUS_EXTERNAL_URL= # URL метрик XrayChecker (для режима xray) SERVER_STATUS_METRICS_URL= diff --git a/README.md b/README.md index b73295b6..7f65c08a 100644 --- a/README.md +++ b/README.md @@ -112,8 +112,8 @@ docker compose logs | Переменная | Описание | Пример | |------------|----------|--------| -| `SERVER_STATUS_MODE` | Режим работы кнопки: `disabled`, `external_link` (просто ссылка) или `xray` (интеграция с XrayChecker). | `xray` | -| `SERVER_STATUS_EXTERNAL_URL` | Прямая ссылка на внешний мониторинг (используется в режиме `external_link`). | `https://status.example.com` | +| `SERVER_STATUS_MODE` | Режим работы кнопки: `disabled`, `external_link` (открывает ссылку в браузере), `external_link_miniapp` (открывает ссылку во встроенном мини-приложении Telegram) или `xray` (интеграция с XrayChecker). | `xray` | +| `SERVER_STATUS_EXTERNAL_URL` | Прямая ссылка на внешний мониторинг (используется в режимах `external_link` и `external_link_miniapp`). | `https://status.example.com` | | `SERVER_STATUS_METRICS_URL` | URL страницы метрик XrayChecker (Prometheus формат). | `https://sub.example.com/metrics` | | `SERVER_STATUS_METRICS_USERNAME` / `SERVER_STATUS_METRICS_PASSWORD` | Данные Basic Auth, если страница метрик защищена паролем. | `status` / `secret` | | `SERVER_STATUS_ITEMS_PER_PAGE` | Количество серверов, показываемых на одной странице в режиме интеграции. | `10` | @@ -541,9 +541,9 @@ MONITORING_LOGS_RETENTION_DAYS=30 NOTIFICATION_CACHE_HOURS=24 # ===== СТАТУС СЕРВЕРОВ ===== -# Режимы: disabled, external_link, xray +# Режимы: disabled, external_link, external_link_miniapp, xray SERVER_STATUS_MODE=disabled -# Ссылка на внешний мониторинг (для режима external_link) +# Ссылка на внешний мониторинг (для режимов external_link и external_link_miniapp) SERVER_STATUS_EXTERNAL_URL= # URL метрик XrayChecker (для режима xray) SERVER_STATUS_METRICS_URL= diff --git a/app/config.py b/app/config.py index 6c038b5a..8c8e6f17 100644 --- a/app/config.py +++ b/app/config.py @@ -250,6 +250,13 @@ class Settings(BaseSettings): "link": "external_link", "url": "external_link", "external_link": "external_link", + "miniapp": "external_link_miniapp", + "mini_app": "external_link_miniapp", + "mini-app": "external_link_miniapp", + "webapp": "external_link_miniapp", + "web_app": "external_link_miniapp", + "web-app": "external_link_miniapp", + "external_link_miniapp": "external_link_miniapp", "xray": "xray", "xraychecker": "xray", "xray_metrics": "xray", @@ -257,8 +264,10 @@ class Settings(BaseSettings): } mode = aliases.get(normalized, normalized) - if mode not in {"disabled", "external_link", "xray"}: - raise ValueError("SERVER_STATUS_MODE must be one of: disabled, external_link, xray") + if mode not in {"disabled", "external_link", "external_link_miniapp", "xray"}: + raise ValueError( + "SERVER_STATUS_MODE must be one of: disabled, external_link, external_link_miniapp, xray" + ) return mode @field_validator('SERVER_STATUS_ITEMS_PER_PAGE', mode='before') diff --git a/app/keyboards/inline.py b/app/keyboards/inline.py index a7362e81..0b4b5ab2 100644 --- a/app/keyboards/inline.py +++ b/app/keyboards/inline.py @@ -172,6 +172,15 @@ def get_main_menu_keyboard( keyboard.append([ InlineKeyboardButton(text=server_status_text, url=status_url) ]) + elif server_status_mode == "external_link_miniapp": + status_url = settings.get_server_status_external_url() + if status_url: + keyboard.append([ + InlineKeyboardButton( + text=server_status_text, + web_app=types.WebAppInfo(url=status_url), + ) + ]) elif server_status_mode == "xray": keyboard.append([ InlineKeyboardButton(text=server_status_text, callback_data="menu_server_status")