Verdaccio: Hosting your own Private NPM Registry
Tags: verdaccio, npm, registry, javascript
Published: 2019-12-04 05:33:56

---
title: Verdaccio: Hosting your own Private NPM Registry
published: true
description: Sometimes you need to publish a npm package to use within your org or team. There are many services online that provide solutions to this problem.
tags: verdaccio, npm, registry, javascript
series: DevOps
canonical_url: https://tech.admitkard.com/verdaccio-hosting-your-own-private-npm-registry
cover_image: https://miro.medium.com/max/3714/1*ga6ZjSVp_tLrAOLyEJEDnQ.png
---


# What is a Private NPM registry?

Sometimes you need to publish a npm package to use within your org or team. There are many services online that provide solutions to this problem.

![own Private NPM package registry](https://miro.medium.com/max/3714/1*ga6ZjSVp_tLrAOLyEJEDnQ.png)

You can subscribe for [Npm Orgs](https://www.npmjs.com/products/orgs) or [GemFury](https://gemfury.com) and services like these.

But sometimes you want a quick and cheap solution to test things out, or to start with things. Here is when [Verdaccio](https://verdaccio.org/docs/en/what-is-verdaccio.html) helps you to start.

How it looks:

![](https://miro.medium.com/max/3196/1*u5inBThejTtOCPAIFcFrTA.png)

# Installation

Verdaccio is available as a npm package and can be downloaded. Install it as a global package.


```
npm install — global verdaccio
yarn global add verdaccio
```


To give it a quick trial run this now


```
verdaccio
```


# Running Server

You can run verdaccio via many service managers, pm2 is fairly simple to set up and use.

Just install it globally:


```
npm install -g pm2
yarn global add pm2
```


Run verdaccio with pm2


```
pm2 start verdaccio — — listen 0.0.0.0:4001
```


You can now access verdaccio on [http://localhost:4001](http://localhost:4001).

# Public Access

We need to expose our `0.0.0.0:4001` to some domain on port 80 (or 443 for https).

It can be done via any web-server [Apache](https://httpd.apache.org/docs/trunk/vhosts/examples.html), [Nginx](https://serverfault.com/questions/536576/nginx-how-do-i-forward-a-http-request-to-another-port), etc.

Once you install Nginx, and it is running and listening on port 80, you can start forwarding your requests to the verdaccio server.

Create and edit Nginx verdaccio.conf


```
vim /etc/nginx/sites-available/verdaccio.conf
```


Add this to your conf:


```
server {
  listen 80;
  server_name npm.company.net;
  location / {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_pass [http://localhost:4001/;](http://localhost:4001/;)
  }
}
```


Add this file to the list of Nginx `available-sites`. (Nginx recommends to add conf to sites-available and create a symlink in sites-enabled).


```
ln /etc/nginx/sites-available/verdaccio.conf /etc/nginx/sites-enabled/
```


**Restart Nginx**


```
sudo service restart nginx
```


# Configuring Domain and DNS

Add your server IP to your DNS to access via a domain. You can do this by adding **A Name** to your DNS manager.

A Name | npm.company.net | xxx.xxx.xxx.xxx | TTL

Refresh your cache and your registry is now hosted on `[http://npm.company.net](http://npm.company.net.)`[.](http://npm.company.net.)

# Publish Packages

Verdaccio requires authentication for publishing, thus we need to log in. First, you need to add yourself to the npm registry to publish any package:


```
npm adduser --registry http://npm.company.net
```


Once you are logged, you can now publish.


```
npm publish --registry http://npm.company.net
```


# Install packages

npm or yarn will use the default registry for installing packages. But you can override for one package.


```
npm install @scope/package --registry http://npm.company.net
```


Or to avoid using this again and again there is an intelligent way.

In your `.npmrc`


```
// .npmrc
@scope:registry=http://npm.company.net
```


Or in .yarnrc


```
// .yarnrc
"@scope:registry" "http://npm.company.net"
```


After this your normal packages like

*   `npm install -g typescript` will be installed from default registry
*   `npm install @scope/pkg` will be installed from your private registry

# Conclusion

So you can set up your registry very quickly, on your infra. As long as your needs are limited and you don’t need very customized scoping and roles management, verdaccio will be able to handle your requirements.

A quick hint if you need to think about scale (like 1000s of employees publishing 1000s of packages), you can look at [Nexus Repository](https://www.sonatype.com/product-nexus-repository).

Drop a comment if you have some suggestions, need more info or help around this.

***
Find more awesome stuff that [AdmitKard](https://admitkard.com) is doing here: [https://dev.to/admitkard](https://dev.to/admitkard)