feat(admin): surface configuration problems in the admin panel

Add GET /api/admin/health powered by a config health service that
detects common deployment mistakes: missing or read-only data volume,
broken tariffs/locale-override/guides JSON files, payment providers
enabled without credentials, webhook providers without
WEBHOOK_BASE_URL, no enabled payment methods, missing or non-https
mini app URL, missing Redis, partially configured SMTP, untrusted
reverse proxy, invalid bot token, missing/mismatched/failing Telegram
webhook and unreachable Remnawave panel. Network checks (Telegram,
panel) are cached for two minutes; ?refresh=1 forces a re-check.

The admin UI shows the alerts as a banner on the dashboard with
per-section navigation chips and a manual re-check button, and as a
filtered banner inside each affected section. Alerts are localized
via admin_health_* keys with built-in Russian fallbacks.
This commit is contained in:
3252a8
2026-06-10 12:31:41 +03:00
parent ce6273a652
commit 1b2290ea66
12 changed files with 1208 additions and 0 deletions
+24
View File
@@ -1024,6 +1024,30 @@
"admin_section_backups_subtitle": "Архивы, загрузка и восстановление БД/compose",
"admin_section_settings_title": "Настройки приложения",
"admin_section_settings_subtitle": "Оверрайды над .env, применяются мгновенно",
"admin_health_title": "Проблемы конфигурации",
"admin_health_refresh": "Проверить снова",
"admin_health_data_dir_missing": "Каталог data ({path}) не найден. Проверьте, что том data смонтирован в контейнер.",
"admin_health_data_dir_not_writable": "Нет прав на запись в {path} — бэкапы, тарифы, логотипы и переводы не сохранятся.",
"admin_health_backups_dir_not_writable": "Каталог бэкапов {path} недоступен для записи.",
"admin_health_tariffs_config_invalid": "Файл тарифов {path} не читается: {error}",
"admin_health_locale_overrides_invalid": "Файл переводов {path} повреждён: {error}",
"admin_health_subscription_page_config_invalid": "Конфиг гайдов подписки не читается: {error}",
"admin_health_provider_not_configured": "Провайдер {provider} включён, но не настроен — оплата через него не работает.",
"admin_health_provider_webhook_needs_base_url": "Провайдеру {provider} нужен WEBHOOK_BASE_URL для приёма вебхуков, а он не задан.",
"admin_health_no_payment_methods": "Не включён ни один способ оплаты.",
"admin_health_mini_app_url_missing": "SUBSCRIPTION_MINI_APP_URL не задан — кнопка Mini App в боте не появится.",
"admin_health_mini_app_url_not_https": "SUBSCRIPTION_MINI_APP_URL должен начинаться с https:// (сейчас {url}).",
"admin_health_redis_not_configured": "REDIS_URL не задан — состояния диалогов бота и кэш не переживут перезапуск.",
"admin_health_smtp_incomplete": "SMTP настроен не полностью — вход по email работать не будет.",
"admin_health_proxy_not_trusted": "Запросы приходят через прокси {remote}, которого нет в TRUSTED_PROXIES — вебхуки платёжных провайдеров могут отклоняться по IP.",
"admin_health_bot_token_invalid": "Telegram отверг BOT_TOKEN — бот не работает.",
"admin_health_telegram_api_error": "Не удалось обратиться к Telegram API: {error}",
"admin_health_telegram_webhook_missing": "Вебхук Telegram не установлен — бот не получает обновления.",
"admin_health_telegram_webhook_mismatch": "Вебхук Telegram указывает на {actual}, ожидается {expected}.",
"admin_health_telegram_webhook_error": "Telegram сообщает об ошибке доставки вебхука: {error}",
"admin_health_telegram_webhook_pending": "В очереди Telegram скопилось {count} необработанных обновлений.",
"admin_health_panel_api_not_configured": "PANEL_API_URL и PANEL_API_KEY не заданы — синхронизация и выдача подписок не работают.",
"admin_health_panel_api_unreachable": "Панель Remnawave недоступна по адресу {url}.",
"admin_backups_load_failed": "Не удалось загрузить бэкапы",
"admin_backups_upload_done": "Архив загружен",
"admin_backups_upload_failed": "Не удалось загрузить архив",