Files
admin/vds-gc-cron.md
vitya f9bdb97be3 docs(.wiki,.tasks): vds-kzntsv-bootstrap done — 3 phases shipped
VDS Rusonyx 160 NVMe (89.253.255.94 / vds.kzntsv.site) активирован
2026-05-20. 3 фазы за ~6 часов:

- Phase 1: harden + docker 29.5.1 + traefik v2.11 + portainer 2.21.5
- Phase 2: shared DB park (postgres 16 / mariadb 11.4 / mongo 7 /
  redis 7) via traefik raw TCP forward + self-signed TLS
- Phase 3: миграция gitea (132 repos), verdaccio (2063 pkgs), registry
  fresh install (user accepted loss old images) + Joxit GUI

Ingest 1 source + 1 entity (vds-kzntsv) + 6 concepts (traefik-tcp-
passthrough-vs-starttls / portainer-2.21-admin-password-regression /
db-tls-self-signed-via-traefik-raw-tcp / rusonyx-vps-onboarding-quirks
/ registry-gc-mount-and-modify-flag / compose-bcrypt-escape-trap).

3 follow-up  tasks: vds-gc-cron, vds-backup-rsync-kreknin, vds-ntfy-push.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 22:39:31 +03:00

3.0 KiB
Raw Blame History

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:

# 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:

#!/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:

#!/bin/bash
# Удалить tarball'ы старше N=10 versions для каждого package
# (нужно написать скрипт)

Decisions log

  • Пусто — задача только заведена.

Notes

  • Триггер: после стабилизации VDS bootstrap (vds-kzntsv-bootstrap Phase 3 завершена).
  • Кронить только write-ops после убеждения что live registry/verdaccio не получит traffic во время GC, иначе риск повредить.