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)