Installation
Utilisez la révision de cette version, pas la branche par défaut pour une installation archivée.
Exigences
Utilisez Node.js 24.22.2 ou plus récent dans la v24 pour le développement local, ou Docker avec Compose pour la pile complète. Un registre existant doit exposer le registre HTTP API V2 ; la pile fournie utilise l'image officielle registry:3.1.2.
Docker Composer des exemples
Choisissez une des variantes suivantes et enregistrez-la sous le nom compose.yaml dans son propre répertoire. Aucun clone de référentiel n'est requis. Créez un fichier .env à côté avec les valeurs affichées pour cette variante. Compose transmet explicitement ces valeurs au conteneur.
Générez une valeur aléatoire d'au moins 32 caractères pour NUXT_SESSION_PASSWORD :
openssl rand -base64 32
Gardez cette clé stable et protégez .env ; ne le confiez pas au contrôle de version. Les images Crateview publiées prennent en charge Linux amd64.
Interface utilisateur avec un registre existant
Nécessite un point de terminaison HTTP API V2 du registre accessible depuis le conteneur. Exemple .env (remplacez l'adresse ; n'incluez pas les informations d'identification dans l'URL) :
NUXT_REGISTRY_UPSTREAM=https://registry.example.com
NUXT_SESSION_PASSWORD=REPLACE_WITH_GENERATED_SECRET
services:
frontend:
image: ghcr.io/crateview/registry-ui:v0.1.2
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
Open http://localhost:3000. Un amont de 127.0.0.1 fait référence au conteneur lui-même. Utilisez un nom DNS accessible ou une adresse de service sur un réseau Docker partagé.
UI avec son propre registre
Pile locale sans authentification. Seul le port UI est publié en bouclage ; le registre reste sur le réseau 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.1.2
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
Les données du registre ouvert http://localhost:3000. persistent dans le volume registry-data. Push et pull une image passant par la même origine :
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, registre et Traefik avec HTTPS
Pile autonome comprenant Traefik et Let's Encrypt. Nécessite un serveur accessible au public, des ports TCP 80/443 disponibles et autorisés et un domaine dont les enregistrements DNS pointent vers ce serveur. Le port 80 doit rester accessible pour le défi HTTP-01. .env :
CRATEVIEW_DOMAIN=registry.example.com
ACME_EMAIL=admin@example.com
NUXT_SESSION_PASSWORD=REPLACE_WITH_GENERATED_SECRET
Entrez le domaine sans schéma ni chemin. Remplacez tous les exemples de valeurs. Créez ensuite de manière interactive un fichier bcrypt htpasswd ; remplacez your-user par votre nom d'utilisateur :
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
Le mot de passe est demandé et n'apparaît pas dans la commande. -c crée un nouveau fichier ; omettez-le lors de l’ajout d’utilisateurs. Protégez et sauvegardez le répertoire auth. Enregistrez ce compose.yaml à côté :
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.1.2
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
Ouvrez https://registry.example.com à l'aide de votre domaine et connectez-vous avec l'utilisateur de registre que vous avez créé. Traefik obtient le certificat automatiquement et redirige HTTP vers HTTPS. Les certificats persistent dans letsencrypt, les données de registre dans registry-data. Sauvegardez les deux volumes et n'utilisez pas docker compose down -v pour les arrêts de routine.
Tous les chemins, y compris /v2/, passent par Crateview. Ni le registre ni l'interface utilisateur ne publient leurs propres ports hôtes. Le registre applique Basic Auth ; aucun Traefik Basic Auth supplémentaire n'est requis. Traefik préserve l'hôte public et transmet le protocole HTTPS à Crateview. Le socket Docker donne accès au Traefik au Docker API ; exécutez cette pile sur un hôte de confiance.
Connexion CLI et transfert d'image (remplacer le domaine) :
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
La CLI demande le mot de passe séparément de la connexion à l'interface utilisateur. Voir authentification et Traefik avec Docker et Let’s Encrypt pour plus de détails.
Utiliser un registre existant
git clone https://github.com/crateview/registry-ui.git
cd registry-ui
git checkout v0.1.2
npm ci
cp .env.example .env
Définissez l'amont dans .env, puis démarrez le mode développement :
NUXT_REGISTRY_UPSTREAM=http://127.0.0.1:5000
npm run dev
L'interface utilisateur fonctionne sur le port 3000 avec remplacement du module à chaud. Lorsque le frontend s'exécute dans un conteneur, 127.0.0.1 signifie ce conteneur. Utilisez plutôt une adresse de service accessible, telle que http://registry:5000.
Serveur de nœud de production
npm run build
NUXT_REGISTRY_UPSTREAM=http://127.0.0.1:5000 HOST=127.0.0.1 PORT=3000 npm start
Le processus du nœud de production lit automatiquement les variables d'environnement réelles, et non .env. Configurez votre gestionnaire de processus ou votre environnement de conteneur en conséquence. Servez HTTPS pour une utilisation authentifiée à distance.
Crateview a besoin de son serveur Nitro pour l'authentification et le proxy API. Servir uniquement les fichiers frontaux en tant que site Web statique ne fournira pas d'interface utilisateur de registre fonctionnelle.
Continuez avec configuration avant d'exposer le service au-delà de votre propre machine.
Construire à partir des sources
Pour une build locale, utilisez les fichiers Compose du référentiel source :
git clone https://github.com/crateview/registry-ui.git
cd registry-ui
git checkout v0.1.2
docker compose -f compose.yaml -f compose.build.yaml up --build -d
