Zum Inhalt springen
Archivierte Dokumentation. Wähle den Stand deiner Installation.

Installation

Den kompletten Stack starten oder das UI mit einer vorhandenen Registry verbinden.

Beispiele gehören zur Quellrevision dieser Version; für Archive nicht den Standardbranch klonen.

Voraussetzungen

Verwende Node.js 24.22.2 oder neuer innerhalb von v24 für die lokale Entwicklung oder Docker mit Compose für den kompletten Stack. Eine vorhandene Registry muss Registry HTTP API V2 anbieten. Der mitgelieferte Stack verwendet das offizielle Image registry:3.1.2.

Docker-Compose-Beispiele

Wähle eine der folgenden Varianten und speichere sie als compose.yaml in einem eigenen Verzeichnis. Ein Repository-Klon ist dafür nicht erforderlich. Erstelle daneben eine .env-Datei mit den jeweils angegebenen Werten. Compose übergibt diese ausdrücklich an den Container.

Erzeuge für NUXT_SESSION_PASSWORD einen zufälligen Wert mit mindestens 32 Zeichen:

openssl rand -base64 32

Bewahre den Schlüssel dauerhaft auf und schütze .env; sie gehört nicht in die Versionsverwaltung. Veröffentlichte Crateview-Images unterstützen Linux amd64.

UI mit vorhandener Registry

Voraussetzung: eine vom Container erreichbare Registry mit Registry HTTP API V2. Beispiel für .env (Adresse ersetzen; keine Zugangsdaten in die URL schreiben):

NUXT_REGISTRY_UPSTREAM=https://registry.example.com
NUXT_SESSION_PASSWORD=REPLACE_WITH_GENERATED_SECRET
services:
  frontend:
    image: ghcr.io/crateview/registry-ui:v0.3.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

Öffne http://localhost:3000. 127.0.0.1 im Upstream bezeichnet den Container selbst. Verwende einen erreichbaren DNS-Namen oder eine Service-Adresse in einem gemeinsamen Docker-Netz.

UI mit eigener Registry

Lokaler Stack ohne Authentifizierung. Nur der UI-Port wird auf dem Loopback-Interface veröffentlicht; die Registry bleibt im Docker-Netz. .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.3.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

Öffne http://localhost:3000. Registry-Daten bleiben im Volume registry-data erhalten. Ein Image über denselben Origin hochladen und laden:

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

UI, Registry und Traefik mit HTTPS

Eigenständiger Stack einschließlich Traefik und Let's Encrypt. Voraussetzung: ein öffentlich erreichbarer Server, freie und freigegebene TCP-Ports 80/443 sowie eine Domain, deren DNS-Einträge auf diesen Server zeigen. Port 80 muss für die HTTP-01-Challenge erreichbar bleiben. .env:

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

Domain ohne Schema oder Pfad eintragen. Ersetze alle Beispielwerte. Erzeuge anschließend interaktiv eine bcrypt-htpasswd-Datei; your-user durch den gewünschten Benutzernamen ersetzen:

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

Das Passwort wird abgefragt und erscheint nicht im Befehl. -c erstellt die Datei neu; für weitere Benutzer weglassen. Schütze und sichere das Verzeichnis auth. Speichere folgende compose.yaml daneben:

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.3.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

Öffne https://registry.example.com mit deiner Domain und melde dich mit dem erzeugten Registry-Benutzer an. Traefik beschafft das Zertifikat automatisch und leitet HTTP auf HTTPS um. Zertifikate bleiben im Volume letsencrypt, Registry-Daten in registry-data erhalten. Sichere beide Volumes und verwende beim normalen Stoppen kein docker compose down -v.

Alle Pfade einschließlich /v2/ laufen über Crateview. Registry und UI veröffentlichen keine eigenen Host-Ports. Die Registry prüft Basic Auth; eine zusätzliche Traefik-Basic-Auth ist nicht erforderlich. Traefik erhält den öffentlichen Host und übermittelt das HTTPS-Protokoll an Crateview. Der Docker-Socket erlaubt Traefik Zugriff auf die Docker-API; betreibe den Stack auf einem vertrauenswürdigen Host.

CLI-Anmeldung und Image-Transfer (Domain ersetzen):

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

Die CLI fragt das Passwort getrennt von der UI-Anmeldung ab. Weitere Details: Authentifizierung und Traefik mit Docker und Let’s Encrypt.

Vorhandene Registry verwenden

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

Trage den Upstream in .env ein und starte den Entwicklungsmodus:

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

Das UI läuft auf Port 3000 mit Hot Module Replacement. Läuft das Frontend in einem Container, bezeichnet 127.0.0.1 diesen Container. Verwende stattdessen eine erreichbare Service-Adresse wie http://registry:5000.

Node-Server für den Produktivbetrieb

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

Der produktive Node-Prozess liest tatsächliche Umgebungsvariablen; .env wird nicht automatisch eingelesen. Konfiguriere deinen Prozessmanager oder die Container-Umgebung entsprechend. Verwende HTTPS für authentifizierten Zugriff über das Netzwerk.

Crateview benötigt seinen Nitro-Server für Authentifizierung und API-Proxy. Ein statischer Webserver mit den Frontend-Dateien allein liefert kein funktionsfähiges Registry-UI.

Prüfe die Konfiguration, bevor du den Dienst außerhalb deines eigenen Rechners verfügbar machst.

Aus Quellcode bauen

Für einen lokalen Build verwende die Compose-Dateien aus dem Quellrepository:

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