ORCH-062 — INFRA: авто-prune docker build cache на mva154 #100

Merged
admin merged 7 commits from feature/ORCH-062-infra-prune-docker-build-cache into main 2026-06-09 19:59:14 +03:00
Owner

ORCH-062 — авто-prune docker build cache на mva154

Новый фоновый daemon-поток src/build_cache_pruner.py (каркас 1:1 src/disk_watchdog.py) — «вторая половина» disk-watchdog (ORCH-063): watchdog сигналит — pruner убирает. Устраняет корень инцидента 07.06.2026 (docker build cache ≈11 ГБ → диск mva154 100% → падение self-hosting-конвейера всех проектов) автоматически, без оператора.

Реализация по ADR-001 (Вариант A): уборка на ХОСТЕ через ssh (deploy_ssh_user@deploy_ssh_host, тот же канал, что image_freshness/self_deploy — в образе нет docker CLI).

Что сделано

  • src/build_cache_pruner.py — каждые interval_s (дефолт 6ч) выполняет строго docker builder prune -f --filter until=<until> (BuildKit GC; дефолт until=24h удерживает тёплый кэш; -a опц. только в паре с фильтром). Анти-частота — pure decide_prune(...).
  • src/config.py — флаги ORCH_BUILD_CACHE_PRUNE_* + defensive-валидаторы (интервал/таймаут >0, until ~ ^\d+[smhdw]?$, notify_min_gb ≥0 → безопасный дефолт + warning).
  • src/main.py — старт последним / стоп первым в lifespan (рядом с disk_watchdog); аддитивный read-only блок build_cache_prune в GET /queue.
  • tests/test_build_cache_pruner.py — TC-01..TC-12 (23 кейса, docker полностью замокан).
  • .env.example, CHANGELOG.md обновлены; INFRA.md / architecture docs несут компонент (стадия architecture).

Self-hosting безопасность

  • Затрагивает только build cache — нет docker image/system prune, удаления образов/контейнеров, остановки/рестарта; прод-контейнер orchestrator никогда не рестартится.
  • Нет ssh-таргета → тик no-op (наблюдаемо в status().last_error).
  • never-raise (per-команда + per-tick); kill-switch ORCH_BUILD_CACHE_PRUNE_ENABLED=false → демон не стартует, 1:1 как до задачи.
  • STAGE_TRANSITIONS/QG_CHECKS/check_*/_parse_*/схема БД — не тронуты; миграций нет (учёт результата in-memory).

Тесты

pytest tests/ -q1319 passed (1296 baseline + 23 новых).

Refs: ORCH-062

🤖 Generated with Claude Code

## ORCH-062 — авто-prune docker build cache на mva154 Новый фоновый daemon-поток `src/build_cache_pruner.py` (каркас 1:1 `src/disk_watchdog.py`) — «вторая половина» disk-watchdog (ORCH-063): **watchdog сигналит — pruner убирает**. Устраняет корень инцидента 07.06.2026 (docker build cache ≈11 ГБ → диск mva154 100% → падение self-hosting-конвейера всех проектов) **автоматически, без оператора**. **Реализация по ADR-001 (Вариант A):** уборка на ХОСТЕ через ssh (`deploy_ssh_user@deploy_ssh_host`, тот же канал, что `image_freshness`/`self_deploy` — в образе нет docker CLI). ### Что сделано - `src/build_cache_pruner.py` — каждые `interval_s` (дефолт 6ч) выполняет **строго `docker builder prune -f --filter until=<until>`** (BuildKit GC; дефолт `until=24h` удерживает тёплый кэш; `-a` опц. только в паре с фильтром). Анти-частота — pure `decide_prune(...)`. - `src/config.py` — флаги `ORCH_BUILD_CACHE_PRUNE_*` + defensive-валидаторы (интервал/таймаут >0, `until` ~ `^\d+[smhdw]?$`, notify_min_gb ≥0 → безопасный дефолт + warning). - `src/main.py` — старт последним / стоп первым в `lifespan` (рядом с `disk_watchdog`); аддитивный read-only блок `build_cache_prune` в `GET /queue`. - `tests/test_build_cache_pruner.py` — TC-01..TC-12 (23 кейса, docker полностью замокан). - `.env.example`, `CHANGELOG.md` обновлены; INFRA.md / architecture docs несут компонент (стадия architecture). ### Self-hosting безопасность - Затрагивает **только** build cache — нет `docker image/system prune`, удаления образов/контейнеров, остановки/рестарта; прод-контейнер `orchestrator` **никогда** не рестартится. - Нет ssh-таргета → тик no-op (наблюдаемо в `status().last_error`). - never-raise (per-команда + per-tick); kill-switch `ORCH_BUILD_CACHE_PRUNE_ENABLED=false` → демон не стартует, 1:1 как до задачи. - `STAGE_TRANSITIONS`/`QG_CHECKS`/`check_*`/`_parse_*`/схема БД — **не тронуты**; миграций нет (учёт результата in-memory). ### Тесты `pytest tests/ -q` — **1319 passed** (1296 baseline + 23 новых). Refs: ORCH-062 🤖 Generated with [Claude Code](https://claude.com/claude-code)
admin added 6 commits 2026-06-09 19:55:01 +03:00
Add src/build_cache_pruner.py — a background daemon thread modelled 1:1 on
src/disk_watchdog.py that periodically runs STRICTLY `docker builder prune -f
--filter until=<until>` (BuildKit GC) on the HOST over ssh. It is the "second
half" of the disk-watchdog (ORCH-063): the watchdog signals, the pruner cleans.
Removes the root cause of the 07.06.2026 incident (build cache ~11GB -> disk
100% -> whole self-hosting pipeline down) automatically, без оператора.

ADR-001 (Variant A): host-over-ssh, same channel as image_freshness/self_deploy
(no docker CLI in the image). Touches ONLY the build cache — no image/system
prune, no image/container removal, never restarts the docker daemon or the prod
container (self-hosting safety). No ssh target -> tick is a no-op.

- src/config.py: ORCH_BUILD_CACHE_PRUNE_* flags + defensive validators
  (interval/timeout >0, until ~ ^\d+[smhdw]?$, notify_min_gb >=0 -> safe default).
- src/main.py: start last (after disk_watchdog) / stop first in lifespan;
  additive read-only build_cache_prune block in GET /queue.
- never-raise on two levels (per-command + per-tick); kill-switch
  ORCH_BUILD_CACHE_PRUNE_ENABLED (false -> daemon does not start, 1:1 as before).
- STAGE_TRANSITIONS / QG_CHECKS / check_* / _parse_* / DB schema UNCHANGED;
  last-run/last-result is in-memory (no migration).
- tests/test_build_cache_pruner.py: TC-01..TC-12 (23 cases, docker fully mocked).
- .env.example + CHANGELOG.md updated; INFRA.md / architecture docs already
  carry the component (architecture stage).

Refs: ORCH-062

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
tester(ET): auto-commit from tester run_id=494
All checks were successful
CI / test (push) Successful in 33s
CI / test (pull_request) Successful in 29s
5ead4543ee
admin force-pushed feature/ORCH-062-infra-prune-docker-build-cache from e5c488b18e to 5ead4543ee 2026-06-09 19:55:01 +03:00 Compare
admin merged commit 6ae611a376 into main 2026-06-09 19:59:14 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/orchestrator#100