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>
This commit is contained in:
2026-05-20 22:39:31 +03:00
parent 6f846d0495
commit f9bdb97be3
5 changed files with 382 additions and 10 deletions

59
vds-gc-cron.md Normal file
View File

@@ -0,0 +1,59 @@
# 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, иначе риск повредить.