chore(ops): чинить корень утечки docker-томов + еженедельная уборка #2887
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2887
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "chore/docker-autoprune"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема
Диск на прод-VM был занят на 76% (110 из 145 ГБ). Разбор: 201 том-сирота на 12.6 ГБ.
FORGEJO-ACTIONS-TASK-*Прод-данных среди сирот нет ни одного — проверено поимённо перед удалением.
Корневая причина
ci.ymlиci-tradein.ymlподнимают свой postgres на прогон и снимают его так:Контейнер уходит, анонимный том с данными остаётся — по одному на каждый прогон CI. Отсюда ровно 125 постгресов.
Что сделано
1. Фикс корня —
docker rm -f "$CI_PG"→docker rm -fvв четырёх местах (ci.yml,ci-tradein.yml).Важное разграничение: в
deploy-*.ymlтот же вызов применяется к боевым контейнерам при пересоздании. Туда-vдобавлять нельзя — снесло бы тома с данными прода. Не тронуто, проверено отдельно.2.
ops/docker-prune.sh— страховка на то, что runner не убрал за собой.Удаляет: остановленные контейнеры старше 24ч, висячие образы старше 7 суток, и тома-сироты только двух известных форм — hex и
FORGEJO-ACTIONS-TASK-*.Именованные тома не трогаются никогда, даже если в моменте оказались отцеплены. Голый
docker volume pruneтакой разницы не делает — поэтому здесь он намеренно не используется: при пересоздании контейнера он мог бы снести боевой том.Порядок операций важен: контейнеры → образы → тома. Обратный порядок оставляет тома, освободившиеся после удаления контейнеров — на этом я и споткнулся при ручной чистке, после первого прохода осталось ещё 78 сирот.
Проверено на проде
DRY_RUN=1→ поймал ошибку в самом скрипте (untilне поддерживается вdocker container ls, только вprune) — исправленоCron
Уже установлен на VM (воскресенье 04:00 UTC — свободный слот рядом с бэкапами в 03:30 и 04:30):
Скрипт попадёт в
/opt/gendesign/ops/автоматически при ближайшем деплое (git reset --hard origin/main). До этого момента cron будет писать в лог, что файла нет, — это ожидаемо и безвредно.Скрипт логирует предупреждение, если после уборки диск всё равно занят ≥85% — уборки уже недостаточно, нужен взгляд глазами.