5.5 KiB
5.5 KiB
work_item, stage, author_agent, status, created_at, model_used
| work_item | stage | author_agent | status | created_at | model_used |
|---|---|---|---|---|---|
| ORCH-062 | architecture | architect | proposed | 2026-06-09 | claude-opus-4-8 |
07 — Инфра-требования: ORCH-062 — авто-prune docker build cache на mva154
Work Item: ORCH-062 · Repo: orchestrator · Стадия: architecture
Решение: Вариант A (фоновый демон приложения,
docker builder pruneна хосте через ssh) — см.06-adr/ADR-001-build-cache-pruner.md. Этот файл фиксирует host-prerequisites выбранного пути и задокументированный ручной fallback (Вариант C, host-cron).
I-1. Топология / окружения
- Без изменений топологии: новый внутренний фоновый daemon-поток в существующем прод-контейнере
orchestrator(8500), наравне сreconciler/job_reaper/disk_watchdog. Новых контейнеров, портов, сетей, томов — нет. - Уборка исполняется на хосте mva154 (host docker daemon — там физически живёт build cache)
через уже существующий ssh-канал
deploy_ssh_user@deploy_ssh_host(по образцуimage_freshness/self_deployPhase B). В контейнереdockerCLI нет (Dockerfile:11— толькоopenssh-client git curl), поэтому raw-вызов CLI в контейнере невозможен — только ssh на хост.
I-2. Переменные окружения / секреты
Новые env (дефолты безопасны; полная карта — docs/operations/INFRA.md; канон — .env.example):
| env | Дефолт | Назначение |
|---|---|---|
ORCH_BUILD_CACHE_PRUNE_ENABLED |
true |
kill-switch; false → демон не стартует, 1:1 как до задачи |
ORCH_BUILD_CACHE_PRUNE_INTERVAL_S |
21600 (6ч) |
период тика, сек (валидация >0, иначе → дефолт) |
ORCH_BUILD_CACHE_PRUNE_UNTIL |
24h |
возраст удержания тёплого кэша (--filter until=); валидация ^\d+[smhdw]?$, иначе → 24h |
ORCH_BUILD_CACHE_PRUNE_ALL |
false |
добавить -a (только в паре с until) |
ORCH_BUILD_CACHE_PRUNE_TIMEOUT_S |
120 |
таймаут ssh-команды, сек |
ORCH_BUILD_CACHE_PRUNE_NOTIFY_MIN_GB |
0 |
Telegram при освобождении ≥ N ГБ; 0 → тихо |
- Переиспользуются существующие
ORCH_DEPLOY_SSH_USER(дефолтslin) /ORCH_DEPLOY_SSH_HOSTкак ssh-таргет. ПустойORCH_DEPLOY_SSH_HOST→ тик no-op (фича не активна вне self-host). - Секретов не добавляет. ssh-ключи уже проброшены ro (
~/.orchestrator-ssh → /home/slin/.ssh, ORCH-040); в git не коммитятся.
I-3. Деплой / рестарт
- Рестарт docker daemon — НЕ требуется (ключевое отличие от отклонённого Варианта B). Уборка —
это
docker builder prune(BuildKit GC), без правкиdaemon.json. - Рестарт прод-контейнера ради уборки — категорически НЕ требуется и запрещён (self-hosting групповой риск). Сам код демона активируется штатным конвейерным деплоем оркестратора (staging 8501 → Confirm Deploy → prod), не отдельной операцией.
- Host-prerequisites выбранного пути A (процедура Owner, в git не коммитятся — как P-1…P-4 в
INFRA.md):
- На хосте установлен
dockerи пользовательslin— в группеdocker(уже выполняется: деплой-хук запускаетdocker composeна хосте). - ssh с контейнера на хост под
slinработает без пароля (уже настроено для Phase B деплоя). Иные действия Owner не требуются — фича включена дефолтом и активна при наличии ssh-таргета.
- На хосте установлен
Ручной fallback (Вариант C, host-cron) — если ssh-канал недоступен
Если по какой-то причине ssh-канал на хост закрыт, эквивалентную защиту можно временно обеспечить host-cron на mva154 (процедура Owner, off-git):
# каждые 6 часов: удалить build cache старше 24ч (только build cache, не образы/контейнеры)
0 */6 * * * docker builder prune -f --filter until=24h >> /var/log/orch-build-cache-prune.log 2>&1
Это fallback, не основной путь: cron не наблюдаем в GET /queue и не имеет config-kill-switch.
I-4. CI/CD
.gitea/workflows/— без изменений. Добавляется юнит-тестtests/test_build_cache_pruner.py(путь A), исполняется существующимpytest tests/ -q; docker/ssh в тестах мокируются (какimage_freshness-тесты не требуют реального docker).