Verdaccio 使用 Docker 安裝及遷移教程

前言

Verdaccio 是一個 npm 私有源,代碼在 GitHub 開源,公司由於業務需要使用也有一段時間,非常穩定,社區也很活躍。入門可以看我之前寫的一篇文章:

npm私服安裝教程 - verdaccio 入門

前一段時間由於所在服務器升級,順便更新了下 Verdaccio 版本,並將之前的數據都遷移過來。由於公司服務器上有 docker,所以就使用 docker 來安裝。

安裝

下載鏡像

先下載最新的 Verdaccio 鏡像,使用官方的 docker 鏡像

docker pull verdaccio/verdaccio

上面命令拉取的即是 latest 的鏡像

啓動前配置

如果沒有安裝 docker-compose,可以看文末鏈接。

在工作目錄新建文件夾 npm,然後新建 docker-compose.yml 文件

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 端口。同時掛載了當前目錄的 storageconfigplugins 文件夾到容器內部。

如果需要修改端口號,就將上面配置文件中三個 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 容器內部來說的。

啓動容器

執行以下命令啓動:

docker-compose up -d --build

啓動後通過訪問 http://your.domain:4873 端口號應該就可以看到 Verdaccio 的 web 頁面了,筆者安裝時候的最新版本爲 4.3.3

配置 nginx

如果 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

然後試一下發布包,成功~

遷移

由於筆者是從 [email protected] 升級到 4.3,所以將原服務器上的 config.yamlhtpasswdstorage 文件夾 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 中的 htpasswdstorage 路徑。

參考文章

歡迎關注我的公衆號:碼力全開(codingonfire)

codingonfire.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章