使用sinopia搭建私有npm服务

来源:互联网 发布:日本媳妇 知乎 编辑:程序博客网 时间:2024/05/19 12:38

原文地址 https://github.com/jindada/blog/issues/1

为什么需要搭建私有npm

  • 私有的包只想在内部使用,还不想用git+ssh的方式,感觉不够优雅,并且还想可以配置相应的权限
  • npm上的包下载很慢,想把已经下载过的包缓存在服务器上,下次 下载时首先检查更新,如果没更新直接走缓存
  • 希望下载的时候,公共包走公共仓库,私有包走内部服务器的私有仓库

为什么写这篇文章

写这边文章的时候,已经看到大神们写过的几篇不错的文章,这里想集中汇总一下,并且说明一下已有文章没有提到的坑
下面列举一下感觉不错的文章:
+ 使用Sinopia搭建私有的npm仓库
+ Sinopia | 从零开始搭建npm仓库

介绍sinopia

sinopia 的介绍与优缺点就不详细介绍了 上面2篇文章都有很详细的说明

部署安装和使用

安装 sinopia 与启动(假设你已经安装过node环境)

$ npm install sinopia -g$ sinopia

然后打开浏览器 访问地址 http://localhost:4873/ 正常显示即成功, 4873是默认端口

配置npm代理

sinopia启动之后,首先通过 npm set registry http://localhost:4873/ 来设置客户端使用的npm代理,然后就能正常使用了

添加用户与登录

$ npm adduser --registry http://localhost:4873 // 按照提示输入$ npm login // 按照提示输入

登录成功之后,你就可以执行npm publish发布到这个私有npm上面啦,刷新http://localhost:4873/就可以看到你刚刚上传的包啦。

需要注意:你无法发布一个包名+版本号已经存在于公共仓库里的包,因为发布的时候,sinopia 首先会去你配置的公共仓库(可以通过配置文件指定,默认是http://registry.npmjs.org)去check,check通过后才允许上传包到 sinopia

配置

Sinopia的特点是,你在哪个目录运行,它的就会在对应的目录下创建自己的文件。在没有指定配置文件的情况下,默认目录是安装目录 你可以通过sinopia -c path/config.yaml 来指定目录运行

目录下默认有两个文件:config.yaml和storage ,htpasswd 是添加用户之后自动创建的。

config.yaml — 配置访问权限,代理,文件存储路径等所有配置信息的
storage — 缓存npm包目录
htpasswd — 保存用户的账号密码等信息

config.yaml :配置访问权限,代理,文件存储路径等所有配置信息的

# This is the default config file. It allows all users to do anything,# so don't use it on production systems.## Look here for more config file examples:# https://github.com/rlidwka/sinopia/tree/master/conf## path to a directory with all packagesstorage: ./storage  // npm包存放的路径auth:  htpasswd:    file: ./htpasswd   // 保存用户的账号密码等信息    # Maximum amount of users allowed to register, defaults to "+inf".    # You can set this to -1 to disable registration.    max_users: -1  //默认为1000,改为-1,禁止注册# a list of other known repositories we can talk touplinks:  npmjs:    url: http://registry.npmjs.org/  // 默认为npm的官网packages:  // 配置权限管理  '@*/*':    # scoped packages    access: $all    publish: $authenticated  '*':    # 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: $authenticated    # if package is not available locally, proxy requests to 'npmjs' registry    proxy: npmjs# log settingslogs:  - {type: stdout, format: pretty, level: http}  #- {type: file, path: sinopia.log, level: info}# you can specify listen address (or simply a port) listen: localhost:4873  // 默认没有,只能在本机访问,把localhost改为0.0.0.0后可以通过外网访问

htpasswd 配置

config.yaml 中的 max_users: -1 表示我们将最大用户数设置为-1,表示禁用 npm adduser 命令来创建用户,不过仍然可以通过目录下的 htpasswd 文件来初始化用户, 打开 htpasswd 文件

zhangsan:{SHA}?????????????????=:autocreated 2016-02-05T15:33:46.238Zlisi:{SHA}????????????????=:autocreated 2016-02-05T15:39:19.960Zwangwu:{SHA}????????????????=:autocreated 2016-02-05T17:59:05.041Z

很明显密码被加密了,但是加密算法很简单,就是简单的 SHA1 哈稀之后再转换成 Base64,后面加上时间戳。
即使这样,我们还是很懵逼,还是不知道如何去添加用户?不要怕!! 这里给大家安利一个好用的小插件 htpasswd-for-sinopia, 没错,就是作者本人写的,大家觉得不错一定要赏颗star啊。下面简单介绍下 htpasswd-for-sinopia 的用法:

$ npm install htpasswd-for-sinopia -g // 安装$ sinopia-adduser // 在sinopia目录下执行,按照提示输入用户名密码$ vim htpasswd // 查看一下 htpasswd 发现刚刚输入的信息已经安静的躺在里面,则证明添加成功

packages配置(之前的文章这部分已经说的很详细了,这里直接copy过来)

配置大致分为两个部分,一个是以 @weflex/* 为开头的,另一个则是通配符 *。

这个当然就是对 package.json 中的 name 字段进行匹配,比如 @weflex/app 将匹配第一个配置,而 express 则匹配第二个。

这里这么配置的意义在于:一般团队或者公司的私有项目,会采用不同的权限控制,于是这里借用了 NPM 的 scoped name 即 @company 的形式,例如 @weflex/app 即表示 WeFlex 下属的 app 项目了。

接下来,每一个命名过滤器(filter)下都有三项基本设置:

access: 表示哪一类用户可以对匹配的项目进行安装(install)
publish: 表示哪一类用户可以对匹配的项目进行发布(publish)
proxy: 如其名,这里的值是对应于 uplinks 的
对于1和2的值,我们通常有以下一些可选的配置:

allauthenticated 表示只有通过验证的人可以执行对应操作
$anonymous 表示只有匿名者可以进行对应操作(通常无用)
或者也可以指定对应于之前我们配置的用户表 htpasswd 中的一个或多个用户,这样就明确地指定哪些用户可以执行匹配的操作配置完成后,再运行:

$ sinopia -c config.yml

配合 sinopia 使用

pm2:进程守护管理工具

$ npm install -g pm2$ pm2 start `which sinopia`

更多操作参考 https://wohugb.gitbooks.io/pm2/content/

nrm:npm镜像地址管理工具

$ // 安装nrm$ npm install -g nrm$ // 查看列表$ nrm ls$ // 添加名字为 sinopia 的镜像$ nrm add sinopia http://localhost:4873$ // 查看列表$ nrm ls$ // 使用 sinopia 的镜像地址$ nrm use sinopia

安全性

为了保证私有npm仓库,可以在前端加一层 Nginx,然后配置 SSH 来作为双层验证

原创粉丝点击