Verdaccio 是一个 npm 私有源,代码在 GitHub 开源,公司因为业务须要使用也有一段时间,很是稳定,社区也很活跃。入门能够看我以前写的一篇文章:html
前一段时间因为所在服务器升级,顺便更新了下 Verdaccio 版本,并将以前的数据都迁移过来。因为公司服务器上有 docker,因此就使用 docker 来安装。nginx
先下载最新的 Verdaccio 镜像,使用官方的 docker 镜像web
docker pull verdaccio/verdaccio
上面命令拉取的便是 latest 的镜像docker
若是没有安装 docker-compose
,能够看文末连接。npm
在工做目录新建文件夹 npm
,而后新建 docker-compose.yml
文件bash
mkdir npm && touch npm/docker-compose.yml
而后将如下配置粘贴到 docker-compose.yml
文件中:服务器
version: '3.4' services: verdaccio: image: verdaccio/verdaccio container_name: "verdaccio" networks: - node-network environment: - VERDACCIO_PORT=4873 ports: - "4873:4873" volumes: - "./storage:/verdaccio/storage" - "./config:/verdaccio/conf" - "./plugins:/verdaccio/plugins" networks: node-network: driver: bridge
上面配置即便用了刚才下载的 verdaccio 镜像,容器和宿主机都绑定在 4873
端口。同时挂载了当前目录的 storage
,config
, plugins
文件夹到容器内部。dom
若是须要修改端口号,就将上面配置文件中三个 4873 都改为其余端口号便可。
又因为启动时容器会去找 ./config/config.yaml
文件,因此在 config
文件夹新建该文件,填入如下内容:测试
storage: /verdaccio/storage auth: htpasswd: file: /verdaccio/conf/htpasswd uplinks: npmjs: url: https://registry.npm.taobao.org/ packages: '@*/*': access: $all publish: $authenticated proxy: npmjs '**': proxy: npmjs logs: - {type: stdout, format: pretty, level: http}
htpasswd
文件是用来存储 npm 用户及密码信息的文件uplinks
上游源改成了淘宝的镜像源,这样在下载找不到的包的时候就会从淘宝下载。执行如下命令启动:
docker-compose up -d --build
启动后经过访问 http://your.domain:4873
端口号应该就能够看到 Verdaccio 的 web 页面了,笔者安装时候的最新版本为 4.3.3
若是 nginx 直接安装在宿主机,直接新建配置文件填入如下内容便可:
server { listen 80; server_name your.npm-server.com; location / { proxy_pass http://127.0.0.1:4873/; proxy_set_header Host $host; } }
若是想使用跑在 docker 容器中的 nginx,首先查看一下 docker0 这个网卡的 ip 地址:
ifconifg
能够看到我用的服务器的 docker 虚拟网卡的ip 为:172.17.0.1
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0 ether 02:42:2f:ed:ec:0e txqueuelen 0 (Ethernet) RX packets 30587 bytes 17826762 (17.0 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 38051 bytes 25920436 (24.7 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
而后将上面 nginx 配置文件中反向代理的 ip 地址改成该内网 ip 便可。
打开刚才配置的域名便可看到 Verdaccio 的 web 界面,咱们来新增用户测试一下:
npm adduser --registry http://your.npm-server.com
根据提示输入用户名和密码,最后却提示 500 服务器错误。
咱们在服务器上执行如下命令查看容器日志:
docker logs --tail 20 verdaccio
发现:
EACCES: permission denied, open '/verdaccio/conf/htpasswd'
原来是没有权限。查了一番资料得知,用户在新增 npm 用户的时候会写入 htpasswd
文件,因为该文件是在宿主机中,默认是 root 用户创建的,而 verdaccio 容器中拥有本身的用户名,名字就叫 verdaccio,因此没法写入 root 用户拥有的文件。
那么是否是还要在宿主机上新建 verdaccio 用户呢?不用这么麻烦。根据官方文档和文末的最后一篇文章得知,docker 容器中的 uid 和 gid 和宿主机是共享的,只不过没有具体的名称,而容器内 verdaccio 使用的 uid 为 10001
,gid 为 65533
,因此咱们在宿主机改一下 htpasswd
文件的权限:
sudo chown 10001:65533 htpasswd
而后再试一下添加用户,就能够成功了。
同理,storage
目录是 verdaccio 存放包数据的目录,也须要修改一下权限:
sudo chown -R 10001:65533 storage
而后试一下发布包,成功~
因为笔者是从 Verdaccio@3.0 升级到 4.3,因此将原服务器上的 config.yaml
、htpasswd
和 storage
文件夹 scp 过去,而后修改一下权限便可。
scp config.yaml user@remoteServer:/path/to/config.yaml scp htpasswd user@remoteServer:/path/to/htpasswd scp -r storage user@remoteServer:/path/to/storage
同时迁移后注意修改 config.yaml
中的 htpasswd
和 storage
路径。
欢迎关注个人公众号:码力全开(codingonfire)