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>
170 lines
8.1 KiB
YAML
170 lines
8.1 KiB
YAML
# Тексты интерфейса бота. Ключи читает app/texts.py; отсутствующий ключ — ошибка при старте.
|
||
|
||
menu:
|
||
commit: "📝 Коммит"
|
||
status: "🩺 Статус"
|
||
logs: "📜 Логи"
|
||
alerts: "🚨 Алерты"
|
||
members: "👥 Участники"
|
||
back: "⬅️ Назад"
|
||
cancel: "✖️ Отмена"
|
||
placeholder: "Выберите раздел"
|
||
|
||
start:
|
||
welcome: |-
|
||
Привет! Я tgit — git в телеграме.
|
||
|
||
📝 Коммит — изменить файлы и запушить
|
||
🩺 Статус — контейнеры и их health
|
||
📜 Логи — хвост, свой grep или вопрос агенту
|
||
🚨 Алерты — падения, перегрузка, список
|
||
no_access: "Доступ к боту — только по приглашению. Попросите QR-код у администратора."
|
||
invite_rejected: "Приглашение недействительно: истекло, уже использовано или ссылка неверная. Попросите новое у администратора."
|
||
|
||
help:
|
||
text: |-
|
||
/menu — главное меню из любого места
|
||
/help — эта справка
|
||
|
||
Разделы открываются кнопками внизу. В любом шаге есть «⬅️ Назад» и «✖️ Отмена».
|
||
|
||
section:
|
||
commit: "📝 Коммит\n\nРаздел в разработке."
|
||
logs: "📜 Логи\n\nРаздел в разработке."
|
||
alerts: "🚨 Алерты\n\nРаздел в разработке."
|
||
members: "👥 Участники\n\nРаздел в разработке."
|
||
cancelled: "Отменено. Главное меню — кнопками внизу."
|
||
|
||
members:
|
||
title: "👥 Участники: {count}"
|
||
line: "{icon} {name}{username} · с {joined} · был(а) {seen}"
|
||
never: "—"
|
||
invite: "➕ Пригласить"
|
||
revoke: "🚫 {name}"
|
||
confirm: "Отозвать доступ у {name}? Его черновик удалится, кнопки перестанут работать."
|
||
confirm_yes: "Да, отозвать"
|
||
confirm_no: "Нет"
|
||
revoked: "Доступ отозван: {name}."
|
||
not_revoked: "Нельзя отозвать: администратор или уже без доступа."
|
||
invite_caption: |-
|
||
Приглашение в tgit — отсканируйте QR или откройте ссылку:
|
||
{link}
|
||
|
||
Одноразовое, действует до {expires} UTC.
|
||
|
||
commit:
|
||
title: "📝 Коммит · /{path}"
|
||
empty: "Папка пуста."
|
||
page: "Стр. {page} из {pages}"
|
||
up: "⬆️ Вверх"
|
||
prev: "◀️"
|
||
next: "▶️"
|
||
dir_button: "📁 {name}"
|
||
file_button: "📄 {name} · {size}"
|
||
new_file: "➕ Новый файл"
|
||
new_dir: "📁 Новая папка"
|
||
file_card: |-
|
||
📄 /{path}
|
||
Размер: {size}
|
||
last_commit: |-
|
||
Последний коммит: {sha} · {author} · {date}
|
||
{subject}
|
||
no_commits: "Коммитов по файлу нет."
|
||
view: "👁 Показать"
|
||
replace: "✏️ Заменить"
|
||
delete: "🗑 Удалить"
|
||
to_dir: "⬅️ К папке"
|
||
soon: "Будет в следующей версии."
|
||
unavailable: "Репозиторий загрузок недоступен, попробуйте через минуту."
|
||
sent_as_file: "Файл большой или бинарный — отправил документом."
|
||
ask_file_name: "Имя нового файла в /{dir} (латиница, цифры, «.», «_», «-»):"
|
||
ask_dir_name: "Имя новой папки в /{dir}:"
|
||
bad_name: "Недопустимое имя: латиница, цифры, «.», «_», «-», до 100 символов. Пришлите другое."
|
||
exists: "Такое имя уже есть в этой папке. Пришлите другое."
|
||
protected: "Это служебный путь репозитория — из бота его менять нельзя."
|
||
ask_content: "Пришлите содержимое /{path} — текстом сообщения или файлом (до 100 КБ)."
|
||
too_big: "Больше 100 КБ — не принимаю."
|
||
binary: "Похоже на бинарный файл — принимаю только текст."
|
||
encoding: "Файл не в кодировке UTF-8."
|
||
syntax: "⚠️ Синтаксическая ошибка, строка {line}: {message}"
|
||
fix: "✏️ Исправить"
|
||
force: "Всё равно добавить"
|
||
added: "🆕 /{path} — добавлен в черновик."
|
||
modified: "✏️ /{path} — в черновике: +{added} −{removed}."
|
||
deleted: "🗑 /{path} — в черновике на удаление."
|
||
draft_button: "🧾 Черновик · {count}"
|
||
draft_title: "🧾 Черновик · изменений: {count}"
|
||
draft_empty: "Черновик пуст."
|
||
unstage: "↩️ убрать {name}"
|
||
draft_full: "В черновике уже 50 изменений — запушьте или уберите лишнее."
|
||
in_draft_new: "В черновике: новый файл."
|
||
in_draft_modified: "В черновике: изменён."
|
||
in_draft_deleted: "В черновике: удалён."
|
||
mark_new: "🆕 "
|
||
mark_modified: "✏️ "
|
||
mark_deleted: "🗑 "
|
||
op_add: "A"
|
||
op_modify: "M"
|
||
op_delete: "D"
|
||
message_button: "💬 Сообщение коммита"
|
||
message_current: "💬 {message}"
|
||
message_missing: "💬 Сообщение коммита не задано."
|
||
ask_message: "Сообщение коммита: до 200 символов, первая строка — до 72."
|
||
bad_message: "Сообщение: 1–200 символов, первая строка — до 72. Пришлите другое."
|
||
push_button: "🚀 Push"
|
||
commit_button: "🚀 Закоммитить · {count}"
|
||
edit_message: "✏️ Изменить сообщение"
|
||
push_confirm: |-
|
||
Запушить в main?
|
||
|
||
{summary}
|
||
|
||
💬 {message}
|
||
push_go: "✅ Запушить"
|
||
pushing: "⏳ Пушу…"
|
||
pushed: "✅ Запушено: {sha} — {message}"
|
||
ci_pending: "⏳ CI…"
|
||
conflict: |-
|
||
⚠️ Пока вы готовили черновик, в main изменились те же файлы:
|
||
{paths}
|
||
|
||
Перезаписать их вашей версией?
|
||
overwrite: "Перезаписать"
|
||
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: "с"
|