feat(web): дашборд инстанса в настройках с живыми метриками

Вкладка «Инстанс» сверху показывает нагрузку сервера, ниже — диск и базу, внизу
healthcheck с пингом (AGENT.md 7.19).

- `Gauge` — полукруглый индикатор: заполняется по значению, меняет цвет на
  порогах 70 % и 90 %, доступен как `role="meter"`;
- процессор и память обновляются раз в секунду (`useInstanceMetrics`), для
  простоя вкладки опрос останавливается;
- два блока диска: «занято / всего» и вес базы (файл + WAL); видимых подписей
  нет — они раскрываются в тултипе при наведении на значение;
- healthcheck: состояние каждой проверки, общий статус, техническая деталь и
  живой пинг — время ответа инстанса на запрос дашборда в миллисекундах;
- переводы ru/en, тесты на индикаторы, формат «занято / всего», тултипы,
  healthcheck и отсутствие раздела у обычного пользователя.
This commit is contained in:
2026-09-20 21:26:25 +03:00
parent 4c3736b5fb
commit e1107600ec
9 changed files with 715 additions and 2 deletions
+42 -1
View File
@@ -729,7 +729,48 @@
"memberCount": "{{count}} участн.",
"adminBadge": "админ",
"mainBadge": "главный",
"usersIdHint": "ID пользователей видны только администратору инстанса."
"usersIdHint": "ID пользователей видны только администратору инстанса.",
"dashboard": {
"title": "Дашборд сервера",
"refreshHint": "обновляется раз в секунду",
"cpu": "Процессор",
"cpuCaption_one": "{{count}} ядро",
"cpuCaption_few": "{{count}} ядра",
"cpuCaption_many": "{{count}} ядер",
"cpuCaption_other": "{{count}} ядра",
"memory": "Память",
"diskHint": "Диск: занято / всего. Свободно {{free}}",
"databaseHint": "База данных: файл и журнал WAL ({{wal}})"
},
"health": {
"title": "Healthcheck инстанса",
"collecting": "Собираем данные…",
"unavailable": "Инстанс не отвечает на запросы дашборда.",
"ping": "Пинг",
"pingValue": "{{ms}} мс",
"pingUnavailable": "—",
"pingHint": "Время ответа инстанса на запрос дашборда",
"summary": {
"ok": "Всё в порядке",
"warn": "Есть предупреждения",
"failed": "Есть ошибки"
},
"status": {
"ok": "работает",
"warn": "внимание",
"failed": "ошибка",
"off": "выключено"
},
"checks": {
"app": "Приложение",
"database": "База данных",
"disk": "Диск",
"storage": "Запись данных",
"voice": "Голос (SFU)",
"gateway": "Gateway",
"metrics": "Метрики"
}
}
},
"servers": {
"pickerLabel": "Мои серверы",