Files
admin/.wiki/concepts/registry-kzntsv-auth-model.md
vitya 28de8e60e0 docs(wiki): registry.kzntsv.site auth-model concept + bind-mount config-mode postmortem
- concepts/registry-kzntsv-auth-model.md (new): standalone registry:2 + htpasswd
  Basic, binary access, NOT Gitea-packages; how to add htpasswd users (hot-reload),
  GC via v2 DELETE + host garbage-collect; users vitya + books-ci.
- concepts/bindmount-config-edit-preserve-mode.md (new): mktemp+mv drops file mode
  644->600 -> non-root container (uid 1000) EACCES crash-loop; chmod --reference.
  Worked example: books-job-scheduler prod-down incident 2026-06-18.
- vds-kzntsv entity registry row links the auth-model concept.
- index.md + log.md updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 11:28:58 +03:00

4.1 KiB
Raw Permalink Blame History

title, type, tags, sources, updated
title type tags sources updated
registry.kzntsv.site auth model — standalone registry:2 + htpasswd (НЕ Gitea-packages) concept
registry
vds-kzntsv
htpasswd
docker
auth
gotcha
../sources/vds-kzntsv-bootstrap-2026-05-20.md
2026-06-18

registry.kzntsv.site — auth model

registry.kzntsv.site — это отдельный registry:2.8.3 + Joxit UI на vds-kzntsv (fresh-install 2026-05-20, см. bootstrap Phase 3.3). Auth — htpasswd Basic:

GET https://registry.kzntsv.site/v2/  → 401
Www-Authenticate: Basic realm="Registry"     ← Basic, не Bearer/token

Это НЕ Gitea package registry

Частая ошибка (books-сессия 2026-06-18 на ней споткнулась): принять реестр за Gitea container-registry. Следствия неверны:

  • Нет robot-токенов, scope read:package/delete:package, per-package visibility, public-read флага. Это не Gitea — таких понятий тут нет.
  • htpasswd-auth бинарный: любой аутентифицированный юзер = full pull + push + delete по всем репо. Per-repo ACL нет (без token-auth-сервера, которого тут нет). «Read-only кред» физически невозможен — максимум изоляции = отдельный htpasswd-юзер на потребителя (отзывается точечно).

Юзеры (htpasswd)

Файл: /opt/stacks/registry/auth/htpasswd (на vds-kzntsv, vitya:vitya rw — sudo не нужен), mount :ro в контейнер.

Юзер Кред Назначение
vitya pass vds-kzntsv/full-env (Pryakhin9) master / push с CI
books-ci pass vds-kzntsv/registry-books-ci books job-scheduler docker-runner pull (createPickingListPdf и др.), заведён 2026-06-18

Добавить юзера

Реестр hot-reload'ит htpasswd при изменении файла — рестарт не нужен (проверено 2026-06-18). bcrypt-строку проще всего сгенерить через httpd-образ, пароль — через stdin (не в argv):

printf '%s' "$PW" | docker run --rm -i httpd:2-alpine htpasswd -niB <user> >> /opt/stacks/registry/auth/htpasswd
# затем: docker rmi httpd:2-alpine  (не оставлять образ на VDS — диск)

Проверка: curl -u <user>:<pw> -I -H 'Accept: application/vnd.docker.distribution.manifest.v2+json, application/vnd.oci.image.manifest.v1+json' https://registry.kzntsv.site/v2/<repo>/manifests/<tag> → 200. Важно: без правильного Accept (включая manifest-list + oci) HEAD вернёт 404 даже при существующем теге — это media-type mismatch, не отсутствие образа.

GC / cleanup

Не через Gitea API. Чистка standalone-реестра:

  • mark-delete: registry v2 DELETE /v2/<repo>/manifests/<digest> (REGISTRY_STORAGE_DELETE_ENABLED=true уже выставлен). Тот же htpasswd-кред (бинарный auth = delete разрешён).
  • disk-reclaim: только registry garbage-collect на host'е — см. registry-gc-mount-and-modify-flag. Это host-cron, не job из приложения. v2 DELETE сам место не возвращает.
  • Ручная альтернатива — Joxit UI (DELETE_IMAGES=true) на registry-ui.vds.kzntsv.site.

Связь