# vds-gc-cron ## Goal Настроить ежедневный (или другой регулярный) cron GC для двух container-сервисов на VDS: 1. **Registry** (`/opt/stacks/registry/`) — `docker exec registry registry garbage-collect /etc/docker/registry/config.yml`. Иначе старые блобы не удалённых тэгов накапливаются — 99G после нескольких лет накопления было исходно (см. [[vds-kzntsv-bootstrap]] Phase 3.3). 2. **Verdaccio** (`/opt/stacks/verdaccio/`) — нет встроенной GC, но есть несколько подходов: - `npm-cache clean --force` внутри контейнера (очищает npm-side cache, не storage); - Скрипт-prune старых versions: для каждого `package.json` в storage оставлять последние N версий, удалить остальные tarball'ы; - Или использовать verdaccio plugin типа `verdaccio-cache-cleaner`. ## Open questions - [ ] Cadence: ежедневно ночью? Раз в неделю? Зависит от роста кеша. - [ ] Retention для verdaccio: сколько версий каждого package хранить? 5 последних? Все из @snollajs/* — всегда? - [ ] Notify on GC fail — через [[vds-backup-rsync-kreknin]] почтовый канал? ## Implementation sketch `/etc/cron.d/vds-gc`: ```cron # Registry GC — каждое воскресенье в 03:00 MSK 0 3 * * 0 root /opt/stacks/registry/scripts/gc.sh > /var/log/registry-gc.log 2>&1 # Verdaccio prune — каждое воскресенье в 04:00 MSK 0 4 * * 0 root /opt/stacks/verdaccio/scripts/prune.sh > /var/log/verdaccio-prune.log 2>&1 ``` `/opt/stacks/registry/scripts/gc.sh`: ```bash #!/bin/bash set -e # read-only mode → GC → re-enable writes docker exec registry sh -c 'export REGISTRY_STORAGE_MAINTENANCE_READONLY_ENABLED=true && sleep 1' docker exec registry registry garbage-collect -m /etc/docker/registry/config.yml docker exec registry sh -c 'unset REGISTRY_STORAGE_MAINTENANCE_READONLY_ENABLED' docker restart registry # для надёжности ``` (Hint: подход с env var может не сработать на running container — лучше через compose `docker-compose.override.yml` с read-only flag + docker compose up -d.) `/opt/stacks/verdaccio/scripts/prune.sh`: ```bash #!/bin/bash # Удалить tarball'ы старше N=10 versions для каждого package # (нужно написать скрипт) ``` ## Decisions log - _Пусто — задача только заведена._ ## Notes - Триггер: после стабилизации VDS bootstrap (`vds-kzntsv-bootstrap` Phase 3 завершена). - Кронить только write-ops после убеждения что live registry/verdaccio не получит traffic во время GC, иначе риск повредить.