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>
60 lines
3.0 KiB
Markdown
60 lines
3.0 KiB
Markdown
# 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, иначе риск повредить.
|