npm私服verdaccio离线环境搭建(基于docker,内网成功)解决node-sass离线安装问题 解决docker 挂载无效的问题

序:去年搭建npm私服败给了内网环境。今年基于docker(没有docker 直接在服务器上安装 node 和 verdaccio pm2 也成)重新立flag。坎坎坷坷总算搭建成功。(本人耗时1周)

实际上如果路通的话 半个小时就搞定了。今天总结一下。

关于思路如果你想搭建非docker环境的,可以看一下我另一篇文章关于npm 私服搭建的文章,参考思路。

失败是成功之母。感谢去年1周积累的经验。

先说一下思路大家仔细理解思路,思路跟不上 ,往下看也白玩。

1、在online环境搭建verdaccio(本机,http://localhost:4873)

2、在offline环境搭建verdaccio(服务器,http://100.54.34.6:4873)

3、切换包源 到 http://localhost:4873

4、在有网环境项目根目录下 npm install (将包缓存到本机)

5、将本地的包拷贝到服务器的verdaccio 包缓存目录下。

6、在离线环境设置npm源后即可npm install。

环境搭建(有网环境):window10

1、docker for windows  (先安装docker for windows)

官网地址:https://www.docker.com/products/docker-desktop

2、阿里云镜像加速[可选]

考虑到一些镜像在国内会pull不下来所以,大家可以考虑启用阿里云镜像加速。这里我就不造轮子了。大家可以参考如下资料。

实在不行求助度娘,镜像加速好解决。

参考资料:https://blog.csdn.net/K_520_W/article/details/83240921 

3、使用命令拉取verdaccio镜像

docker pull verdaccio/verdaccio

4、先把这个镜像run 起来,拷贝一份默认的配置文件。(先不挂载 别急)

docker run -itd --name verdaccio -p 4873:4873 verdaccio/verdaccio

(如果你的端口被占用,是起不来的,可以通过 docker ps 命令 来查看 正在运行的镜像)

这时访问 http://localhost:4873

就应该看到如下界面(我这个是发过包的所以能看到一个包。后面会讲解发包。(你们看到的应该是没有包的))

起来之后,先在 找一个路径创建文件夹

我选择的是 D:\verdaccio\ (这个路径后面会挂载使用)

现在运行如下命令:从容器中把默认配置文件拷贝出来。

//切换目录至D:\verdaccio下

docker cp verdaccio:/verdaccio/conf ./

运行后,你会发现 文件夹下多了一个 conf 文件夹

这个文件中有一个 config.yaml 文件(这个就是verdaccio的配置文件)

手动编辑这个文件先修改一下上游包源改成淘宝源。

#
# This is the config file used for the docker images.
# It allows all users to do anything, so don't use it on production systems.
#
# Do not configure host and port under `listen` in this file
# as it will be ignored when using docker.
# see https://github.com/verdaccio/verdaccio/blob/master/wiki/docker.md#docker-and-custom-port-configuration
#
# Look here for more config file examples:
# https://github.com/verdaccio/verdaccio/tree/master/conf
#

# path to a directory with all packages
# 包缓存路径
storage: /verdaccio/storage/data

# 登录帐号存储文件
auth:
  htpasswd:
    file: /verdaccio/storage/htpasswd
    # Maximum amount of users allowed to register, defaults to "+inf".
    # You can set this to -1 to disable registration.
    #max_users: 1000
security:
  api:
    jwt:
      sign:
        expiresIn: 60d
        notBefore: 1
  web:
    sign:
      expiresIn: 7d

# a list of other known repositories we can talk to
# 上游包源设置
uplinks:
  npmjs:
    url: https://registry.npm.taobao.org/

packages:
  '@jota/*':
      access: $all
      publish: $all
      unpublish: $all

  '@*/*':
    # scoped packages
    access: $all
    publish: $all
    unpublish: $all
    proxy: npmjs

  '**':
    # allow all users (including non-authenticated users) to read and
    # publish all packages
    #
    # you can specify usernames/groupnames (depending on your auth plugin)
    # and three keywords: "$all", "$anonymous", "$authenticated"
    access: $all

    # allow all known users to publish packages
    # (anyone can register by default, remember?)
    publish: $all
    unpublish: $all

    # if package is not available locally, proxy requests to 'npmjs' registry
    proxy: npmjs

# To use `npm audit` uncomment the following section
middlewares:
  audit:
    enabled: true

# log settings
logs:
  - {type: stdout, format: pretty, level: trace}
  #- {type: file, path: verdaccio.log, level: info}

# 离线发布并没有卵用
publish:
  allow_offline: true

 

这个编辑器不带颜色凑合看(有修改的地方都有中文注释)

5、配置文件编辑完毕,删除刚刚的镜像(因为这次需要挂载路径)

//先将容器停下
docker stop verdaccio
//删除容器
docker rm verdaccio
//还是在 D:\verdaccio 这个目录下执行
docker run -itd --name verdaccio -p 4873:4873 -v conf:/verdaccio/conf:rw -v storage:/verdaccio/storage:rw -v plugins:/verdaccio/plugins verdaccio/verdaccio

ps:(这里有个小坑,当 storage 下 文件过多时,挂载会失败,不知道是不是docker的bug。

解决办法就是 将storage 中的文件移走,run 起来之后 在 剪切回去,本教程中不存在此问题,因为之前根本没这个文件夹)我在这儿被坑了好几次,百度了好久都没有解决方案(都说的是一些写入权限的原因,如果你遇到权限问题可以百度),相信我你一定会遇到这个坑的)

这时你的 D:\verdaccio 下 有 如下 三个文件夹,其中 plugins storage 是自动被创建出来的。

6、打开http://localhost:4873 能看到页面即启动成功。

7、设置本地 npm 源为 本机私服

npm config set registry http://localhost:4873

这一步不重要只是一个建议:如果你有频繁切换 源的需求 建议使用 nrm (一个 npm 包源管理工具)

//安装

npm i nrm -g 

// 添加一个源

nrm add local http://localhost:4873

//切换源

nrm use local

//列源目录

nrm ls 

//删除源

nrm del <name>

8、在项目目录 npm install (这样包就被缓存到D:\verdaccio 下了) 

9、别急创建一个用户用于发包

npm adduser
//第一步输入用户名
admin
//第二步输入密码
123456
//第三步输入邮箱
795666xxx@qq.com

10、测试一下 登录

npm login
//输入用户名
//输入密码
//输入邮箱
会提示 logged ... 
//登录成功

11、接下来 把D:\verdaccio 打成个 verdaccio.zip 压缩包

12、把镜像导出 这里我用的是 docker save 命令

//               压缩包名     容器名
docker save -o verdaccio.tar verdaccio

截止到以上步骤 内网环境暂时告一段落。

环境搭建(内网环境 offline):centos7

1、内网环境的服务器首先需要安装docker for linux

这个我也不造轮子,参考资料:

https://www.cnblogs.com/luoSteel/p/10038954.html

2、登录到内网服务器后,将之前准备的包先解压开

# 切换到/跟目录
cd /
# 创建一个文件夹
mkdir app
# 进去
cd app

# 然后将 verdaccio.zip 和 verdaccio.tar 都放到这儿。(我这是u盘拷贝到内网台式机上,在通过ssh工具传到这台服务器上的)

# 解压 verdaccio.zip
unzip -o verdaccio.zip

# 解压好后 进入 verdaccio 目录
cd verdaccio

# 因为上面说了 docker 挂载有坑 (经过尝试 linux也有 这问题)所以先把 storage 换个目录

mkdir storage_temp

# 进入 storage 目录
cd storage
mv * ../storage_temp

# 删除 storage 目录
cd ../
rm -rf storage

3、导入 docker 镜像

# 切换目录
cd /app
# 导入基础镜像
docker load < verdaccio.tar

4、使用 docker images 查看镜像id

5、运行镜像(挂载目录)

docker run -itd --name verdaccio -p 4873:4873 -v /app/verdaccio/conf:/verdaccio/conf:rw -v /app/verdaccio/storage:/verdaccio/storage:rw -v /app/verdaccio/plugins:/verdaccio/plugins 972bc1f5cf77

6、将刚刚挪走的包,挪回到 storage 目录

cd /app/verdaccio/storage_temp

mv * ../storage

cd ..

包挪移完毕,可以使用了。

7、内网环境访问 http://100.54.34.6:4873

发现已经可以访问到 verdaccio 页面了。

8、内网机器 设置 包源

npm config set registry http://100.54.34.6:4873

9、内网windows机器,项目目录,npm install

接下来可怕的一幕发生了。

# 内网环境安装 node-sass 失败

Cannot download "https://github.com/sass/node-sass/releases/download.../win32-x64-57_binding.node"

10、解决内网环境 node-sass安装失败的问题

查看 node-sass 版本 为  4.13.1

访问 git node-sass ,在 releases 中找到报错对应的 ***_binding.node

https://github.com/sass/node-sass/releases

下载下来   win32-x64-57_binding.node

这样还不够,因为大家安装的时候 不能让每个人去下载

11、搭建内网 node-sass bindingServer(基于nginx)

注意到上图了吗 nginx 根目录设置为 html  我的版本是 v4.13.1 所以创建了一个 v4.13.1的文件夹来存放.node 文件

这里就粘贴一下 nginx config (nginx-verdaccio 直接看附件吧)

server{
  listen 80;
  server_name localhost;

  location /{
    root /home/html;
    index index.html;
  }

  location = /50px.html{
    root /usr/share/nginx/html;
  }

}

nginx 部署难度不高,当然我部署的nginx 也是基于docker 的。在附一个启动命令

docker run -itd --name nginx-verdaccio -p 9500:80 -v /app/nginx-verdaccio/conf.d:/etc/nginx/conf.d -v /app/nginx-verdaccio/html:/home/html f3a29b88535b

12、设置 SASS_BINARY_SITE

# 内网环境部署的nginx
npm set SASS_BINARY_SITE http://100.54.34.6:9500

13、内网windows 开发机,npm install 本次顺利通过。

私包发布

经过尝试 在内网环境 直接 npm login 后 npm publish 依然失败。(所以回到外网环境发布包,成功之后在复制到内网即可)

1、创建一个包,外网环境 在D:\test-package文件夹下

npm init -y 

2、新建一个 index.js 内容为

console.log('hello world from test-package.')

3、执行发布命令即可成功

npm publish

4、进入外网机 verdaccio 挂载目录

已发布的包在这:D:\verdaccio\storage\test-package

可以把  test-package 这个文件夹 拷贝到 内网 verdaccio 的对应 挂载目录中,完成发包(先别急着拷贝,还有个地方要改一下)

5、查看 D:\verdaccio\storage\data\.verdaccio-db.json

这个json文件注意内容

{"list":["test-package"],"secret":"0459b024a235e35122c6d2194639d5481f866d37a904650527e5009bf1a53c0e"}

list 中 有刚刚发布的包名。 

把test-package 文件夹拷贝到内网目录的同时,要修改,内网 。verdaccio-db.json 这个文件

把新包名 加到 list :["新包名"] 中

ps:(吐槽一下 verdaccio的配置项 D:\verdaccio\conf\config.yaml)

# 离线发布并没有卵用
publish:
  allow_offline: true

这个属性压根就不好使,也可能是我没研究透。时间紧任务重,就到这吧。(Orz)

2020-04-08 11:45:52  Power by datree

----------------------------------------------------------------

6、私包内网环境发布失败,是容器写入权限问题(Orz)

下午继续研究内网私包发布问题,发现 npm publish 500 

docker logs -f verdaccio

查看日志 发现果然是权限问题。

 有以下几种方式解决挂载的目录没有权限的问题:
   1.在运行容器的时候,给容器加特权,及加上 --privileged=true 参数:
          docker run -i -t -v /soft:/soft --privileged=true 637fe9ea94f0 /bin/bash
   2.临时关闭selinux: (我用这个解决的比较粗暴)
          setenforce 0

   3.添加selinux规则,改变要挂载的目录的安全性文本

如果是因为权限问题,在内网环境 重复 私包发布 1-3步骤即可

7、注意docker 启动用户权限

这个大家自行百度即可。

2020-04-08 15:02:38 Power by DaTee 

终于把 所有的坑都填上了。(Orz)

8、jenkins 集成vue项目,安装 node 环境就不说了。自行百度。

今天在linux上 又遇到了  node-sass 离线安装问题

总是去 github上找 ****.node 文件

尝试了 在windows 上的解决方案,跪了。又坑了一下午。

最后下班前5分钟,灵机一动,单独安装 node-sass 并加 sass_binary_site 参数。

搞定,上一段 jenkins 脚本

#!/bin/bash
echo $PATH
pwd
cd ./ecdp-platform-ui
npm config set registry http://100.54.34.6:4873
# 就是这行 单独安装 node-sass  花了一下午时间换来的
npm i node-sass --sass_binary_site=http://100.54.34.6:9500
npm install
npm run build:prod

2020-04-09 17:00:00 by 心力交瘁的 DaTree.   (Orz)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值