NPM Private Registry : VERDACCIO

NPM PRIVATE REGISTRY : VERDACCIO

1. C'est quoi un private registry npm ?

Dans le monde du développement informatique, on ne recrée pas la roue à chaque projet. On fait appel souvent à des librairies ou des groupe de librairies, que l'on appelle des packages.

En nodeJS, l'installation des packages sont gérés par des outils dont les plus populaires sont yarn et surtout NPM pour Node Package Manager.

Ces outils se connectent à un registry pour installer/publier des packages. Le registry est le serveur qui héberge effectivement les packages. S'il existe beaucoup d’herbergement de package ouvertes et gratuites, il arrive parfois que vous ne souhaitez publier des packages acessibles à la terre entière, mais juste pour aux collaborateurs de votre projet. Il vous faut alors un registre privé ou private registry.

Il existe quelques fournisseurs de registres privés tel que Myget (myget.org) ou npmorg (npmjs.com) mais c'est payant.

Si vous êtes radin, je vous propose ici de découvrir un registre privé gratuit à monter soi-même : VERDDACCIO

2. Installation

Pré-requis : installer d'abord node et npm , puis

$> npm install --global verdaccio

Démarrer le service :

$> verdaccio

Par défaut le service sur le port 4873

3. Configuration :

Le fichier de config se trouve par défaut dans ~/.config/verdaccio/config.yaml (~ représente votre home directory )

    A. Uplinks :

Les uplinks sert de « proxy » de packages, cela permet de forwarder les requetes de packages qui ne sont hebergés en local vers d’autres registries.

Anisi on ne déclare qu'un seul registry dans le npm local , dans .npmrc

registry = "http://registry.mondomaine.com:4873/"

Puis dans ~/.config/verdaccio/config.yaml, mettez :

uplinks:
  npmjs:
    url: https://registry.npmjs.org/

 

Par exemple si vous installez les packages « mypackages » et React-dom, votre npm se connecte uniquement à verdaccio . « mypackages » sera téléchargé à partir de votre npm privé et React-dom proviendra du registry officiel de React.

    B. Création de compte :

L’intérêt du registre privé est de pouvoir filtrer les accès à votre registre.

Pour cela il existe des groupes prédéfinis : '$all', '$anonymous', '$authenticated'. Dans l’état actuel de l’outils il n’est pas possible de définir des groupes. Mais on peut déclarer un fichier htpasswd (vide) pour l’authentification au registry via le fichier de config :

auth:
  htpasswd:
    file: ./htpasswd

 

Ensuite pour créer des users, utiliser le client npm :

 

$> npm adduser --registry http:/registry.mondomaine.com:4873/

Username: achung

Password : *********

Email: (this IS public) andre.chung@omnilog.fr

 

Ce faisant, le user/password sera ajouté dans le fichier htpasswd que vous avez déclaré plus haut.

 

Dans votre .npmrc local un token sera aussi créé :

//registry.mondomaine.com:4873/:_authToken=**************

 

Vous pouvez sauvegarder ce token pour vous authentifier sur un autre ordinateur si besoin.

Une fois les ayant droit définis, bloquer la création des users avec max_users à -1 :

 

auth:
  htpasswd:
    file: ./htpasswd
    max_users: -1

 

    C. Control d'accés:

Maintenant vous pouvez définir qui a accès à quoi.

Le control d'accès se fait par packages, voici quelques exemples de configuration à l’aide regex:

 

packages:
# les packages nommé restricted-* (* étant une wild card regex ) est en lecture pour tout le monde, la publication n'est autorisé qu'au user authentifié
 'restricted-*':
    access: $all
    publish: $authenticated

 

# les packages commençant par private- est en lecture pour user 1 et user2, la publication n'est autorisé q'au user1
 'private-*':
    access: user1 user2
    publish: user1

 

 

# tous les scope-packages sont en accès libre pour tous, de plus si un scope-package n'est pas disponible localement la requête est transmise au uplink npmjs défini plus haut
 '@*/*':
    access: $all
    publish: $all
    proxy: npmjs

 

# tous les packages qui ne match pas avec les 2 règles précédentes sont en accès libre
 '**':
    access: $all
    proxy: npmjs

Rappel : il n’est pas possible en l’état actuel de regrouper les utilisateurs sous des noms de groupes. Les seuls groupes existants sont les groupes par défaut définis plus haut.

4. Reverse Proxy

Dans la vraie vie, vous n’allez pas exposer votre registry directement sur internet mais via un proxy http voire https. https://registry.mondomaine.com/ est plus sexy que http://registry.mondomaine.com:4873/

Le cas classique est un serveur HTTP type Apache ou NGINX qui sert de reverse proxy, les requêtes seront forwardées dans un LAN démilitarisé (ou même en localhost) au regitry. Un avantage supplémentaire est que le certificat du HTTPS sera centralisé par le reverse proxy.

Ci-dessous , un exemple de config pour un reverse proxy NGINX :

location / {
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $host;
  proxy_set_header X-NginX-Proxy true;
  proxy_pass http://127.0.0.1:4873;
  proxy_redirect off;

}

 

5. Démarrage en tant que service

Une fois que tout marche comme vous voulez, il serait bien pratique que Verdaccio soit un service monitoré au sens du système, c’est à dire qu’il soit démarré et supervisé par l’OS.

La littérature de Verdaccio nous présente l’utilitaire « forever » pour répondre à ce besoin. Je vous conseillerai un autre utilitaire appelé PM2 plus simple à configurer.

$> npm install --global pm2

Ensuite :

$> pm2 start <path>/verdaccio

NB : il est nécessaire fournir le chemin vers l’exécutable verdaccio.

Pour finir il suffit de sauvegarder l’état :

$> pm2 save

pm2 générera le démarrage automatique dans votre système et supervisera le process, s’il tombe il sera automatiquement redémarré.

6. Conclusions

Verdaccio est une solution de registre privé simple à mettre en place. En plus il est gratuit ! ou plus exactement il est en open source.

Pour plus d’information faites une tour sur https://verdaccio.org/

 

André C.

 

Ajouter un commentaire