Description
使用sinopia搭建私有npm服务
为什么需要搭建私有npm
- 私有的包只想在内部使用,还不想用git+ssh的方式,感觉不够优雅,并且还想可以配置相应的权限
- 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 packages
storage: ./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 to
uplinks:
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 settings
logs:
- {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.238Z
lisi:{SHA}????????????????=:autocreated 2016-02-05T15:39:19.960Z
wangwu:{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的值,我们通常有以下一些可选的配置:
$all 表示所有人都可以执行对应的操作
$authenticated 表示只有通过验证的人可以执行对应操作
$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 来作为双层验证