Исходная постановка
.py-файлы в отдельный репозиторий;Согласованные расширения
Что важно при этом не сломать
Безопасность — не отдельный пункт, а требование к каждому разделу.
Дерево репозитория, новые файлы текстом или документом, замена, удаление.
Черновик, сообщение, push с проверкой конфликтов.
Статус CI → CD прямо в сообщении о push.
Все контейнеры: 🟢 🟡 🔴 ⚪.
Карточка: health, аптайм, рестарты, CPU/RAM от лимита, ревизия.
7 проверок с таймаутами, перезапуск (админ).
Хвост за период, свой grep -i -v -E -c -C — в Python, не в shell.
🤖 Вопрос словами: LLM строит запрос, бот ищет сам.
💥 краш · 🧠 OOM · 🔁 рестарты · 🩺 unhealthy · 🔥 перегрузка · ⛔ деплой · 💾 диск · 🔌 Docker · 🛡 атака.
Всем участникам, без спама, «✅ восстановлено» ответом.
👥 Участники (админ): выпуск QR, список, мгновенный отзыв доступа.
ast.parsehead_sha, опрос 10 с, только пока есть кого ждатьСообщение о push редактируется на месте; исходы — отдельными сообщениями автору: правка не присылает уведомление.
CIProvider: SourceCraft — вторая реализация.Сеть — только если её просит сервис и разрешил админ на хосте. Не больше 10 сервисов.
tgit-runner;command=…,restrict), аргументы валидируются;git archive в stdin — у хоста нет доступа к репозиторию;examples/escape_attempts запись в FS, интернет, DNS, docker.sock, setuid(0), raw-сокет, fork-бомба — все 9 BLOCKED
; $(…), пути к секретам, «игнорируй инструкции»safe | attack; мусор = атакаLogQueryregex с таймаутомkind + service: повтор в 10 мин — счётчик в исходном сообщении, не новое;RestartCount;| Угроза | Защита |
|---|---|
| Случайный пользователь | одноразовый QR, 128 бит, 24 ч, в БД только хэш; middleware на каждом апдейте; 5 неудач в час — игнор |
| Чужой код на сервере | песочница, лимиты, без сети; запуск только через tgit-runner с forced command |
| Docker-сокет = root | у бота только read-only прокси; сам бот отказывает в доступе к чужим контейнерам |
| Prompt injection | фильтр + отдельный страж + структурный вывод; grep выполняет Python; логи в LLM не идут |
| ReDoS | модуль regex с таймаутом, длина шаблона ≤ 200, анализ вложенных квантификаторов |
| Поломка CI из бота | .gitea/, .sourcecraft/, .tgit/ из Telegram не редактируются |
| Утечка секретов | только в .env, SecretStr, не в логах и не в LLM |
app/ + ruffhttpx.MockTransport, сценарный LLM, respx для Gitea;tgit-runner → фейковый docker»;dev, ревью и мерж — человек;dev → деплой на сервер с проверкой health и откатом.Нет сети — видео того же сценария.
Нет сервера — make demo-repo · make demo-up · make run на ноутбуке.
Нет LLM — фильтр всё равно отсекает атаку без LLM.
Подробно: docs/DEMO.md
Сделано
Дальше
CIProvider;Код, ТЗ, архитектура, ADR: gitea.24studbank.ru/HSE/tgit