feat(status): раздел «Статус» — контейнеры, карточка, проверки (#14)
CI / ruff · mypy · pytest (pull_request) Successful in 1m11s
CI / ruff · mypy · pytest (pull_request) Successful in 1m11s
- docker-socket-proxy в Compose (только GET /containers/*), сокет только у него - app/runtime/docker.py: read-only клиент; видны только контейнеры с меткой tgit.managed=true, чужие id отклоняются до запроса - app/runtime/checks.py: running, health, рестарты за окно, CPU/RAM, ошибки в логе, HTTP-проба; у каждой проверки свой таймаут, отчёт всегда полный - app/runtime/snapshots.py: снапшоты раз в 15 с в container_snapshots - бот: список с 🟢🟡🔴⚪, карточка, «🩺 Запустить проверки», «🔄 Обновить» - деплой ставит метки tgit.sha / tgit.deployed_at на контейнер бота - имя джоба CD без неотрисованного выражения Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
# Проверки раздела «🩺 Статус» (SPEC S-3). Читает app/runtime/checks.py; неизвестный ключ — ошибка при старте.
|
||||
|
||||
# Окно для «рестарты не растут» и «нет ошибок в логе», секунды
|
||||
window: 300
|
||||
# Пороги, % от лимита контейнера (CPU — от числа доступных ядер × 100)
|
||||
cpu_pct: 90
|
||||
mem_pct: 90
|
||||
# Строка лога считается ошибкой, если совпала с шаблоном (синтаксис модуля regex)
|
||||
error_pattern: '(?i)\b(error|exception|traceback|critical|fatal|panic)\b|"level":\s*"(ERROR|CRITICAL)"'
|
||||
# HTTP-проба health_url (метка tgit.health_url): таймаут, секунды
|
||||
http_timeout: 5
|
||||
# Таймаут одной проверки — упавшая или зависшая проверка не роняет отчёт
|
||||
check_timeout: 15
|
||||
+34
-1
@@ -30,7 +30,6 @@ help:
|
||||
|
||||
section:
|
||||
commit: "📝 Коммит\n\nРаздел в разработке."
|
||||
status: "🩺 Статус\n\nРаздел в разработке."
|
||||
logs: "📜 Логи\n\nРаздел в разработке."
|
||||
alerts: "🚨 Алерты\n\nРаздел в разработке."
|
||||
members: "👥 Участники\n\nРаздел в разработке."
|
||||
@@ -134,3 +133,37 @@ commit:
|
||||
push_empty: "В main уже всё так же — коммитить нечего. Черновик очищен."
|
||||
push_limit: "Лимит — 20 пушей в час. Попробуйте позже."
|
||||
push_failed: "Не удалось запушить: репозиторий недоступен. Черновик сохранён — попробуйте позже."
|
||||
|
||||
status:
|
||||
title: "🩺 Статус · {count} конт. · {time} UTC"
|
||||
line: "{light} {name} · {state}"
|
||||
empty: "Контейнеров tgit не найдено."
|
||||
unavailable: "Docker недоступен, попробуйте через минуту."
|
||||
card: |-
|
||||
{light} {name}
|
||||
Сервис: {service} · образ: {image}
|
||||
Состояние: {state} · health: {health}
|
||||
Аптайм: {uptime} · рестартов: {restarts}
|
||||
CPU: {cpu} · RAM: {mem} из {limit} ({mem_pct})
|
||||
Ревизия: {sha} · деплой: {deployed}
|
||||
none: "—"
|
||||
no_limit: "без лимита"
|
||||
check_button: "🩺 Запустить проверки"
|
||||
refresh: "🔄 Обновить"
|
||||
to_list: "⬅️ К списку"
|
||||
to_card: "⬅️ К контейнеру"
|
||||
checking: "🩺 Проверяю контейнеры…"
|
||||
report_title: "🩺 Проверки · без ошибок {ok} из {total} · {time} UTC"
|
||||
report_container: "{light} {name}"
|
||||
report_line: " {verdict} {title}{detail}"
|
||||
check_running: "запущен"
|
||||
check_health: "Docker health"
|
||||
check_restarts: "рестарты за 5 мин не растут"
|
||||
check_cpu: "CPU ниже порога"
|
||||
check_mem: "RAM ниже порога"
|
||||
check_log_errors: "нет ошибок в логе за 5 мин"
|
||||
check_http: "HTTP-проба"
|
||||
days: "д"
|
||||
hours: "ч"
|
||||
minutes: "мин"
|
||||
seconds: "с"
|
||||
|
||||
Reference in New Issue
Block a user