Перейти к содержимому
Архивная документация. Выберите версию вашей установки.

Установка

Запустите полный стек или подключите пользовательский интерфейс к существующему реестру.

Используйте ревизию этой версии; не клонируйте основную ветку для архивной установки.

Требования

Используйте Node.js 24.22.2 или новее в версии 24 для локальной разработки или Docker с Compose для полного стека. Существующий реестр должен предоставлять реестр HTTP API V2; в комплекте стека используется официальный образ registry:3.1.2.

Docker Compose примеры

Выберите один из следующих вариантов и сохраните его как compose.yaml в отдельном каталоге. Клон репозитория не требуется. Создайте рядом с ним файл .env со значениями, указанными для этого варианта. Compose явно передает эти значения в контейнер.

Создайте случайное значение длиной не менее 32 символов для NUXT_SESSION_PASSWORD:

openssl rand -base64 32

Сохраняйте стабильность этого ключа и защитите .env; не фиксируйте его в системе контроля версий. Опубликованные образы Crateview поддерживают Linux amd64.

Пользовательский интерфейс с существующим реестром

Требуется конечная точка реестра HTTP API V2, доступная из контейнера. Пример .env (замените адрес; не включайте учетные данные в URL-адрес):

NUXT_REGISTRY_UPSTREAM=https://registry.example.com
NUXT_SESSION_PASSWORD=REPLACE_WITH_GENERATED_SECRET
services:
  frontend:
    image: ghcr.io/crateview/registry-ui:v0.4.0
    ports:
      - "127.0.0.1:3000:3000"
    environment:
      NUXT_REGISTRY_UPSTREAM: ${NUXT_REGISTRY_UPSTREAM:?Set NUXT_REGISTRY_UPSTREAM}
      NUXT_SESSION_PASSWORD: ${NUXT_SESSION_PASSWORD:?Set NUXT_SESSION_PASSWORD}
    restart: unless-stopped
docker compose config --quiet
docker compose pull
docker compose up -d

Открыть http://localhost:3000. Восходящий элемент 127.0.0.1 относится к самому контейнеру. Используйте доступное DNS-имя или адрес службы в общей сети Docker.

Пользовательский интерфейс со своим реестром

Локальный стек без аутентификации. В режиме обратной связи публикуется только порт пользовательского интерфейса; реестр остается в сети Docker. .env:

NUXT_SESSION_PASSWORD=REPLACE_WITH_GENERATED_SECRET
services:
  registry:
    image: registry:3.1.2
    environment:
      OTEL_TRACES_EXPORTER: none
      REGISTRY_STORAGE_DELETE_ENABLED: "true"
    volumes:
      - registry-data:/var/lib/registry
    restart: unless-stopped
  frontend:
    image: ghcr.io/crateview/registry-ui:v0.4.0
    ports:
      - "127.0.0.1:3000:3000"
    environment:
      NUXT_REGISTRY_UPSTREAM: http://registry:5000
      NUXT_SESSION_PASSWORD: ${NUXT_SESSION_PASSWORD:?Set NUXT_SESSION_PASSWORD}
    depends_on:
      - registry
    restart: unless-stopped

volumes:
  registry-data:
docker compose config --quiet
docker compose pull
docker compose up -d

Открыть http://localhost:3000. Данные реестра сохраняются в томе registry-data. Push и pull — изображения из того же источника:

docker pull alpine:latest
docker tag alpine:latest localhost:3000/alpine:latest
docker push localhost:3000/alpine:latest
docker pull localhost:3000/alpine:latest

Пользовательский интерфейс, реестр и Traefik с HTTPS

Автономный стек, включающий Traefik и Let's Encrypt. Требуется общедоступный сервер, доступные и разрешенные TCP-порты 80/443 и домен, записи DNS которого указывают на этот сервер. Порт 80 должен оставаться доступным для запроса HTTP-01. .env:

CRATEVIEW_DOMAIN=registry.example.com
ACME_EMAIL=admin@example.com
NUXT_SESSION_PASSWORD=REPLACE_WITH_GENERATED_SECRET

Введите домен без схемы или пути. Замените все значения примера. Затем в интерактивном режиме создайте файл bcrypt htpasswd; замените your-user на свое имя пользователя:

mkdir -p auth
chmod 700 auth
docker run --rm -it --mount type=bind,src="$(pwd)/auth",dst=/auth \
  --entrypoint htpasswd httpd:2 -Bc /auth/htpasswd your-user

Пароль запрашивается, но не отображается в команде. -c создает новый файл; опустите его при добавлении пользователей. Защитите и создайте резервную копию каталога auth. Сохраните этот compose.yaml рядом с ним:

services:
  traefik:
    image: traefik:v3.7.17
    command:
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.web.http.redirections.entrypoint.to=websecure
      - --entrypoints.web.http.redirections.entrypoint.scheme=https
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.letsencrypt.acme.email=${ACME_EMAIL:?Set ACME_EMAIL}
      - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
      - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - letsencrypt:/letsencrypt
    restart: unless-stopped
  registry:
    image: registry:3.1.2
    environment:
      OTEL_TRACES_EXPORTER: none
      REGISTRY_STORAGE_DELETE_ENABLED: "true"
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    volumes:
      - registry-data:/var/lib/registry
      - ./auth:/auth:ro
    restart: unless-stopped
  frontend:
    image: ghcr.io/crateview/registry-ui:v0.4.0
    environment:
      NUXT_REGISTRY_UPSTREAM: http://registry:5000
      NUXT_SESSION_PASSWORD: ${NUXT_SESSION_PASSWORD:?Set NUXT_SESSION_PASSWORD}
    labels:
      traefik.enable: "true"
      traefik.http.routers.crateview.rule: Host(`${CRATEVIEW_DOMAIN:?Set CRATEVIEW_DOMAIN}`)
      traefik.http.routers.crateview.entrypoints: websecure
      traefik.http.routers.crateview.tls.certresolver: letsencrypt
      traefik.http.routers.crateview.service: crateview
      traefik.http.services.crateview.loadbalancer.server.port: "3000"
    depends_on:
      - registry
    restart: unless-stopped

volumes:
  registry-data:
  letsencrypt:
docker compose config --quiet
docker compose pull
docker compose up -d

Откройте https://registry.example.com, используя свой домен, и войдите в систему, используя созданного вами пользователя реестра. Traefik автоматически получает сертификат и перенаправляет HTTP на HTTPS. Сертификаты сохраняются в letsencrypt, данные реестра — в registry-data. Создайте резервную копию обоих томов и не используйте docker compose down -v для планового завершения работы.

Все пути, включая /v2/, проходят через Crateview. Ни реестр, ни пользовательский интерфейс не публикуют собственные порты хоста. Реестр применяет Basic Auth; никаких дополнительных Traefik Basic Auth не требуется. Traefik сохраняет общедоступный хост и перенаправляет протокол HTTPS на Crateview. Сокет Docker предоставляет Traefik доступ к Docker API; запустите этот стек на доверенном хосте.

Вход в CLI и перенос образа (замена домена):

docker login registry.example.com --username your-user
docker pull alpine:latest
docker tag alpine:latest registry.example.com/alpine:latest
docker push registry.example.com/alpine:latest
docker pull registry.example.com/alpine:latest

Интерфейс командной строки запрашивает пароль отдельно от входа в пользовательский интерфейс. Подробности см. в authentication и Traefik с Docker и Let’s Encrypt].

Использовать существующий реестр

git clone https://github.com/crateview/registry-ui.git
cd registry-ui
git checkout v0.4.0
npm ci
cp .env.example .env

Установите восходящий поток в .env, затем запустите режим разработки:

NUXT_REGISTRY_UPSTREAM=http://127.0.0.1:5000
npm run dev

Пользовательский интерфейс работает на порту 3000 с горячей заменой модуля. Когда интерфейс работает внутри контейнера, 127.0.0.1 означает этот контейнер. Вместо этого используйте доступный адрес службы, например http://registry:5000.

Сервер производственного узла

npm run build
NUXT_REGISTRY_UPSTREAM=http://127.0.0.1:5000 HOST=127.0.0.1 PORT=3000 npm start

Процесс производственного узла считывает фактические переменные среды, а не .env автоматически. Настройте свой менеджер процессов или контейнерную среду соответствующим образом. Обслуживание HTTPS для удаленного использования с аутентификацией.

Crateview нужен сервер Nitro для аутентификации и проксирования API. Обслуживание только файлов внешнего интерфейса в качестве статического веб-сайта не обеспечит работающий пользовательский интерфейс реестра.

Продолжайте с configuration, прежде чем предоставлять доступ к службе за пределами вашего собственного компьютера.

Сборка из исходного кода

Для локальной сборки используйте файлы Compose из исходного репозитория:

git clone https://github.com/crateview/registry-ui.git
cd registry-ui
git checkout v0.4.0
docker compose -f compose.yaml -f compose.build.yaml up --build -d