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>
3.0 KiB
3.0 KiB
vds-gc-cron
Goal
Настроить ежедневный (или другой регулярный) cron GC для двух container-сервисов на VDS:
- Registry (
/opt/stacks/registry/) —docker exec registry registry garbage-collect /etc/docker/registry/config.yml. Иначе старые блобы не удалённых тэгов накапливаются — 99G после нескольких лет накопления было исходно (см. vds-kzntsv-bootstrap Phase 3.3). - 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-bootstrapPhase 3 завершена). - Кронить только write-ops после убеждения что live registry/verdaccio не получит traffic во время GC, иначе риск повредить.