用sinopia搭建npm私服
需求(这段话是摘抄参考文档的,因为作者也想这么说):
公司出于自身隐私保护需要,不想把自己的代码开源到包管理区,但是又急需一套完整包管工具,来管理越来越多的组件、模块和项目。对于前端,最熟悉的莫过于npm,bower等;但是bower的市场兼容性明显没有npm强壮,加之commonjs规范的日益成熟。npm应该是前端包管理的不二选择。
公司对于搭建本地私有npm库有如下要求:
私有包托管在内部服务器中
项目中使用了公共仓库上的公共包,也使用了内部服务器上的私有包
希望下载的时候,公共包走公共仓库,私有包走内部服务器的私有仓库
服务器硬盘有限,希望只缓存下载过的包,而不是全部同步。
对于下载,发布npm包有对应的权限管理,安装方便,配置简单,依赖少。
Sinopia 是一个零配置的私有的带缓存功能的npm包管理工具。
1.要安装的软件
软件简介
nodejs/npm 软件名称: node-v6.9.1-linux-x64.tar.gz 下载地址:https://npm.taobao.org/mirrors/node/v6.9.1/
安装命令:
tar -xvf node-v6.9.1-linux-x64.tar.gz
npm install -g sinopia
pm2 版本:2.1.4 安装命令:
npm install -g pm2
nrm 版本:1.0.0 安装命令:
npm install -g nrm
规划目录(下为本次安装的实际目录,可根据实际环境调整)
项 | 目录 | 账户 | 备注 |
npm、nodejs解压目录 | /opt/software | nadmin | |
sinopia启动时目录 | /home/nadmin | nadmin | |
sinopia的passwd路径 | /home/nadmin/node_htpasswd | nadmin | |
sinopia的storage路径 | /home/nadmin/sinopia/storage | nadmin | 建议磁盘空间较大不推荐放在home目录 |
2.具体安装步骤(Server端)
创建账户nadmin
安装node和npm
安装步骤1的目录和命令,解压软件 node-v6.9.1-linux-x64.tar.gz
(注:npm会在安装node的时候一起安装)
$ tar -xvf node-v6.9.1-linux-x64.tar.gz
添加node_home到环境变量,用root账户修改/etc/profile
$vim /etc/profile #追加
NODE_HOME=/opt/software/node-v6.9.1-linux-x64
PATH=$PATH:$NODE_HOME/bin
source 使配置生效
$ source /etc/profile
配置生效之后,在任意地方可查看版本如下:
$ node -v
v6.9.1
$ npm -v
3.10.
配置npm
先查看npm的配置文件地址
$npm config get userconfig
/home/nadmin/.npmrc
修改此配置文件,修改后查看,内容如下
$ cat /home/nadmin/.npmrc
proxy=http://网络代理ip:8080/
https-proxy=http://网络代理ip:8080/
no_proxy=本地yum源ip
registry=https://registry.npm.taobao.org/
也可通过命令设置http网络代理地址和npm server的地址,如下:
$ npm config set proxy http://server:port
$ npm config set https-proxy http://server:port
$ npm config set registry "http://registry.npmjs.org/"
~~由于上步骤npm已经安装配置完毕,所以下面的安装软件可以通过npm命令进行~~
安装sinopia
$npm install -g sinopia
配置sinopia
Sinopia的特点是,你在哪个目录运行,它的就会在对应的目录下创建自己的文件。目录下默认有两个文件:config.yaml和storage,htpasswd 是添加用户之后自动创建的
由于每次启动默认的config.xml文件是从原始文件default.yaml拷贝而来,可先修改sinopia原始的default.yaml
地址:sinopia安装目录/conf/ default.yaml
查看
$ pwd
/opt/software/node-v6.9.1-linux-x64/lib/node_modules/sinopia/conf
$ ll
total
-rw-rw-r-- nadmin nadmin Nov : default.yaml
-rw-rw-r-- nadmin nadmin Jun full.yaml
-rw-rw-r-- nadmin nadmin Jun README.md
修改完毕,内如下:
storage: ./storage
auth:
htpasswd:
file: /home/nadmin/node_htpasswd
uplinks:
npmjs:
url: http://registry.npm.taobao.org/
packages:
'@*/*':
access: $all
publish: $authenticated
'*':
access: $all
publish: $authenticated
proxy: npmjs
logs:
- {type: stdout, format: pretty, level: http}
listen: 0.0.0.0:
http_proxy: http://代理服务器ip:8080
https_proxy: http://代理服务器ip:8080
启动 sinopia
在规划好的启动目录下执行命令sinopia
$ pwd
/home/nadmin
$ sinopia
warn --- config file - /home/nadmin/sinopia/config.yaml
warn --- http address - http://0.0.0.0:4873/
http --> , req: 'GET http://registry.npm.taobao.org/express', bytes: /
http <-- , user: admin, req: 'GET /express', bytes: /
http --> , req: 'GET http://registry.npm.taobao.org/type-is', bytes: /
sinopia已经启动,可正常使用,此种方法日志会输出到控制台,不建议使用,后面会介绍使用pm2对sinopia进程进行托管启动的方法。
访问http://ServerS::4873 查看页面,看到如下页面,说明sinopia安装成功!
aaarticlea/png;base64,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" alt="" />
安装pm2
$npm install -g pm2
使用pm2启动sinopia
$ pm2 start sinopia
[PM2] Applying action restartProcessId on app [sinopia](ids: )
[PM2] [sinopia]() ✓
[PM2] Process successfully started
使用pm2托管的进程可以保证进程永远是活着的,尝试通过kill -9去杀sinopia的进程发现杀了之后又自动启起来。推荐使用此种方式启动sinopia.
pm2 开机自启动sinopia
pm2 startup centos,根据提示用root账户执行:
# su -c "env PATH=$PATH:/opt/software/node-v6.9.1-linux-x64/bin pm2 startup centos -u nadmin --hp /home/nadmin"
pm2 启动sinopia 4个进程,且保存日志
$ pm2 start sinopia -i --watch --merge-logs --log-date-format="YYYY-MM-DD HH:mm: Z" -l /opt/log/sinopia.log
保存当前配置,开机自启动时按照此时配置启动
$ pm2 save
安装nrm
nrm是 npm registry 管理工具, 能够查看和切换当前使用的registry。不安装也可以。
$npm install -g nrm $ nrm ls
npm ---- https://registry.npmjs.org/
cnpm --- http://r.cnpmjs.org/
* taobao - https://registry.npm.taobao.org/
nj ----- https://registry.nodejitsu.com/
rednpm - http://registry.mirror.cqupt.edu.cn/
npmMirror https://skimdb.npmjs.com/registry/
edunpm - http://registry.enpmjs.org/
mytestnpm http://ServerS:4873/
使用命令
$ nrm add XXXXX http://XXXXXX:4873 # 添加本地的npm镜像地址
$ nrm use XXXX # 使用本址的镜像地址
3.验证
在客户端ServerC假设使用者已经安装npm/nrm并且已经正确配置
1>npm install
现在验证使用刚刚搭建好的sinopia npm库(http://serverS:4873/)进行安装软件和发布软件
修改npm的访问代理为刚刚搭建好的http://serverS:4873/
# cat .npmrc
registry=http://serverS:4873/
执行安装express的命令
$npm install express
安装成功!
2>npm publish
本地如果有可用来发布的模块可以直接用,本地没有,使用npm init根据提示创建一个。
初始化创建一个模块
$npm init
如果需要登录才能publish则登录
运行npm adduser注册账号,如果已经有账号直接运行 npm login
登录成功时可通过npm whoami查看
执行发布
# npm publish chenyu/
+ chenyu@1.0.
去serverS查看刚刚publish的模块:成功!
aaarticlea/png;base64,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" alt="" />
4.安装过程的一些报错和解决办法
1>注册账号失败Incorrect username or password
npm set registry http://ServerS:4873 npm adduser --registry http://Servers:4873
报错:Incorrect username or password
解决办法:把.npmrc中的网络代理proxy/ https-proxy去掉即可。
2>在Client端使用新搭建的npm库安装软件的时候,报404错误
检查后发现,Server端的npm的.npmrc中和sinopia的config.yaml中上网代理未设置,加上后即可。
5.附录(npm、pm2等的使用方法)
config.xml文件详解:
config.yaml是sinopia的配置文件
1>其常用的配置
storage: 仓库保存的地址,publish时仓库保存的地址。
auth: htpasswd file:账号密码的文件地址,初始化时不存在,可指定需要手工创建。
max_users:默认1000,为允许用户注册的数量。
为-1时,不允许用户通过npm adduser注册。
但是,当为-1时,可以通过直接编写htpasswd file内容的方式添加用户。
语法:用户名:{SHA}哈希加密的字符=:autocreated 时间
加密算法:SHA1哈稀之后再转换成 Base64 输出就好
uplinks: 配置上游的npm服务器,主要用于请求的仓库不存在时到上游服务器去拉取。
packages: 配置模块。access访问下载权限,publish包的发布权限。
格式如下:
scope:
权限:操作
scope:两种模式
一种是 @*/* 表示某下属的某项目
另一种是 * 匹配项目名称(名称在package.json中有定义)
权限:
l access: 表示哪一类用户可以对匹配的项目进行安装(install)
l publish: 表示哪一类用户可以对匹配的项目进行发布(publish)
l proxy: 如其名,这里的值是对应于 uplinks 的名称,如果本地不存在,允许去对应的uplinks去取。
操作:
l $all 表示所有人(已注册、未注册)都可以执行对应的操作
l $authenticated 表示只有通过验证的人(已注册)可以执行对应操作,注意,任何人都可以去注册账户。
l $anonymous 表示只有匿名者可以进行对应操作(通常无用)
l 或者也可以指定对应于之前我们配置的用户表 htpasswd 中的一个或多个用户,这样就明确地指定哪些用户可以执行匹配的操作
listen:配置监听端口和主机名。
localhost:4873 #默认
0.0.0.0:4873 #在所有网卡监听
代理:
#http_proxy: http://something.local/ #http代理
#https_proxy: https://something.local/ #https代理
#no_proxy: localhost,127.0.0.1 #不适用代理的iP
修改了配置文件后,运行命令
$ sinopia -c config.yml
2>附录github中比较全的配置和说明
#仓库
# path to a directory with all packages
storage: ./storage # a list of users
#
# This could be deprecated soon, use auth plugins instead (see htpasswd below).
users:
admin:
# crypto.createHash('sha1').update(pass).digest('hex')
password: a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 #是否支持web接口
web:
# web interface is disabled by default in .x, will be enabled soon in .x
# when all its issues will be fixed
#
# set this to `true` if you want to experiment with web ui now;
# this has a lot of issues, e.g. no auth yet, so use at your own risk
#enable: true title: Sinopia
# logo: logo.png
# template: custom.hbs auth:
htpasswd:
file: ./htpasswd
# Maximum amount of users allowed to register, defaults to "+inf".
# You can set this to - to disable registration.
#max_users: # a list of other known repositories we can talk to
#上游npm服务器配置
uplinks:
npmjs:
url: https://registry.npmjs.org/ #设置请求无应答超时时间
# amount of time to wait for repository to respond
# before giving up and use the local cached copy
#timeout: 30s #设置数据认为最新的时间为2分钟,2分钟同一个数据的请求不会向上游服务器请求
# maximum time in which data is considered up to date
#
# default is minutes, so server won't request the same data from
# uplink if a similar request was made less than minutes ago
#maxage: 2m #设置访问失败达到某次数,就停止一段时间不访问上游服务器,默认是2次不应答,5分钟不去请求
# if two subsequent requests fail, no further requests will be sent to
# this uplink for five minutes
#max_fails:
#fail_timeout: 5m # timeouts are defined in the same way as nginx, see:
# http://wiki.nginx.org/ConfigNotation #包权限配置
packages:
# uncomment this for packages with "local-" prefix to be available
# for admin only, it's a recommended way of handling private packages
#'local-*':
# access: admin
# publish: admin
# # you can override storage directory for a group of packages this way:
# storage: 'local_storage' '*':
# allow all users to read packages (including non-authenticated users)
#
# you can specify usernames/groupnames (depending on your auth plugin)
# and three keywords: "$all", "$anonymous", "$authenticated"
access: $all # allow 'admin' to publish packages
publish: admin #如果包本地不存在,则去npmjs去请求
# if package is not available locally, proxy requests to 'npmjs' registry
proxy: npmjs #####################################################################
# Advanced settings
##################################################################### # if you use nginx with custom path, use this to override links
#url_prefix: https://dev.company.local/sinopia/ # You can specify listen address (or simply a port).
# If you add multiple values, sinopia will listen on all of them.
#
# Examples:
#
#listen:
# - localhost: # default value
# - http://localhost:4873 # same thing
# - 0.0.0.0: # listen on all addresses (INADDR_ANY)
# - https://example.org:4873 # if you want to use https
# - [::]: # ipv6
# - unix:/tmp/sinopia.sock # unix socket #https证书配置(listen需要设置成https)
# Configure HTTPS, it is required if you use "https" protocol above.
#https:
# key: path/to/server.key
# cert: path/to/server.crt # type: file | stdout | stderr
# level: trace | debug | info | http (default) | warn | error | fatal
#
# parameters for file: name is filename
# {type: 'file', path: 'sinopia.log', level: 'debug'},
#
# parameters for stdout and stderr: format: json | pretty
# {type: 'stdout', format: 'pretty', level: 'debug'},
logs:
- {type: stdout, format: pretty, level: http}
#- {type: file, path: sinopia.log, level: info} #代理设置
# you can specify proxy used with all requests in wget-like manner here
# (or set up ENV variables with the same name)
#http_proxy: http://something.local/
#https_proxy: https://something.local/
#no_proxy: localhost,127.0.0.1 #设置json文档大小上限
# maximum size of uploaded json document
# increase it if you have "request entity too large" errors
#max_body_size: 1mb # Workaround for countless npm bugs. Must have for npm <1.14.x, but expect
# it to be turned off in future versions. If `true`, latest tag is ignored,
# and the highest semver is placed instead.
#ignore_latest_tag: false
npm常见使用命令
1>常用命令
npm install XX :本地安装,安装到当前的目录中
npm install –g XX :模块将被安装到【全局目录】
查看全局目录npm config get prefix
设置全局目录npm config set prefix XXX
查看缓存目录npm config get cache
设置缓存目录npm cofnig set cache XXX
一般采用全局安装,方便管理、结构清晰还可以重复利用
其他命令如下:
npm install <name>安装nodejs的依赖包
例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本,如npm install express@3.0.6
npm install <name> -g 将包安装到全局环境中
但是代码中,直接通过require()的方式是没有办法调用全局安装的包的。全局的安装是供命令行使用的,就好像全局安装了vmarket后,就可以在命令行中直接运行vm命令
npm install <name> --save 安装的同时,将信息写入package.json中
项目路径中如果有package.json文件时,直接使用npm install方法就可以根据dependencies配置安装所有的依赖包
这样代码提交到github时,就不用提交node_modules这个文件夹了。
npm init 会引导你创建一个package.json文件,包括名称、版本、作者这些信息等
npm remove <name>移除
npm update <name>更新
npm ls 列出当前路径下安装的了所有包
npm root 查看当前包的安装路径
npm root -g 查看全局的包的安装路径
npm help 帮助,如果要单独查看install命令的帮助,可以使用的npm help install
npm config get cache 查看npm的缓存目录
下过的包都在里面,比如刚刚下载的loadash
2>关于npm缓存目录的一些记录
npm安装的模块有两个缓存目录:
默认*inux和mac下是在用户主目录下的.npm目录下,通过npm config get cache 可以查看。window下则在%AppData%/npm-cache 目录下。
该目录下的模块结构为.npm/module_name/module_version/这种方式命名。
值得注意的是,执行npm install命令的时候npm只会检查node_modules中是否存在该模块,如果没有则会去registry下载,无论.npm文件夹下是否存在。这也是install速度慢的一个原因。
解决办法使用npm install --cache-min <整数时间> <package-name>;
这个命令的意思是从缓存中进行安装,只有再超过参数时间的时候才从regitry上安装。但内在也进行了一次与registry的交互,只是交互的etag属性,服务器返回304表示没有更新不需要下载
另外也可以将缓存目录设置成node_modules目录。
pm2命令详解
pm2是开源的基于Nodejs的进程管理器。包括进程、日志、监控的一整套完整功能。它带有负载均衡功能,当你要把你的独立代码资源利用全部的服务器所有cpu,保证进程永远都是活着的,0秒的重载,PM2是完美的。
常用的命令介绍:
以下是pm2常用的命令行
$ pm2 start app.js # 启动app.js应用程序
$ pm2 start app.js -i 4 # cluster mode 模式启动4个app.js的应用实例
# 4个应用程序会自动进行负载均衡
$ pm2 start app.js --name="api" # 启动应用程序并命名为 "api"
$ pm2 start app.js --watch # 当文件变化时自动重启应用
$ pm2 start script.sh # 启动 bash 脚本
$ pm2 list # 列表 PM2 启动的所有的应用程序
$ pm2 monit # 显示每个应用程序的CPU和内存占用情况
$ pm2 show [app-name] # 显示应用程序的所有信息
$ pm2 logs # 显示所有应用程序的日志
$ pm2 logs [app-name] # 显示指定应用程序的日志
$ pm2 flush
$ pm2 stop all # 停止所有的应用程序
$ pm2 stop 0 # 停止 id为 0的指定应用程序
$ pm2 restart all # 重启所有应用
$ pm2 reload all # 重启 cluster mode下的所有应用
$ pm2 gracefulReload all # Graceful reload all apps in cluster mode
$ pm2 delete all # 关闭并删除所有应用
$ pm2 delete 0 # 删除指定应用 id 0
$ pm2 scale api 10 # 把名字叫api的应用扩展到10个实例
$ pm2 reset [app-name] # 重置重启数量
$ pm2 startup # 创建开机自启动命令
$ pm2 save # 保存当前应用列表
$ pm2 resurrect # 重新加载保存的应用列表
$ pm2 update # Save processes, kill PM2 and restore processes
$ pm2 generate # Generate a sample json configuration file
$ pm2 deploy app.json prod setup # Setup "prod" remote server
$ pm2 deploy app.json prod # Update "prod" remote server
$ pm2 deploy app.json prod revert 2 # Revert "prod" remote server by 2
$ pm2 module:generate [name] # Generate sample module with name [name]
$ pm2 install pm2-logrotate # Install module (here a log rotation system)
$ pm2 uninstall pm2-logrotate # Uninstall module
$ pm2 publish # Increment version, git push and npm publish
命令验证:
停止sinopia:
启动sinopia:
重启 sinopia:
显示 sinopia 的log:
6.参考文档
https://segmentfault.com/a/1190000005790827
http://www.tuicool.com/articles/B3iyyya
用sinopia搭建npm私服的更多相关文章
- 与你相遇好幸运,用sinopia搭建npm私服
需求: >在企业内部搭建私有npm服务器,企业开发人员上传下载自己开发的npm包 >私有npm服务器包不存在时,找npm或者taobao的镜像站点 >服务器硬盘有限,希望只缓存下载过 ...
- Nexus 3 搭建 npm 私服 (windows)
Nexus 3 搭建 npm 私服备忘 下载与安装 在官网下载Nexus Repository Manager OSS 3.x, 解压至任意位置. 管理员运行 powershell, 切换到 nexu ...
- 使用 Nexus3 Repository Manager 搭建 npm 私服
公司里一般都有自己的私服,用于管理封装的工具插件等,Nexus2主要是用于maven/gralde仓库的统一管理,Nexus3则添加了npm插件,可以对npm提供支持,其实用于npm仓库管理的还有一个 ...
- 搭建npm私服流程
npm私服必要性 1. 如果公司处于隐私保护的需要,不想将自己封的包推到npm社区,但又急需要一套完整的包管理工具来管理越来越多的组件,模块,项目.对于前端,最熟悉的莫过于npm,bower等,但是b ...
- 使用nexus搭建npm私服
第一步,下载nexus 下载链接: https://pan.baidu.com/s/1GOYi2M3nT4Wcy7JEYmnqdA 提取码: a9hf 第二步,解压缩 我下载的是nexus-3.16. ...
- 使用 Nexus Repository Manager 搭建 npm 私服
目录 环境 下载与安装 添加npm仓库 配置与验证npm仓库 发布自己的包 Nexus开启启动 脚注 环境 windows10(1803) Nexus Repository Manager OSS 3 ...
- vue组件库(二):基于verdaccio工具npm私服搭建
大纲 搭建npm私服的必要性 搭建npm私服的主要操作 一.搭建npm私服的必要性 二.搭建npm私服的主要操作 1.环境准备 确保服务器已安装以下包: node(必须) 安装了nodenpm,如果想 ...
- npm私服搭建
本文是在 centos7 下利用 nexus 搭建 npm 私服的整理 一.安装 JDK 1.下载 JDK 2.安装 tar zxvf jdk-8u191-linux-x64.tar.gz .0_19 ...
- Docker 搭建 Nexus3 私服 | 基本操作
1 Docker 安装 Nexus3 1.1 创建目录 在硬盘上创建 Nexus3 的主目录: mkdir -p /Users/yygnb/dockerMe/nexus3 为该目录添加权限: chmo ...
随机推荐
- 学习JSONP
最近自己研究 跨域调用js,然后 发现 有jsonp 这种技术,在Jquery中可以使用,于是 研究下原理 发现: 其实 就是 利用<script>的跨域访问的能力. 调用 服务端 返回的 ...
- [Ext JS 4] 实战之 带week(星期)的日期选择控件(三)
前言 在 [Ext JS 4] 实战之 带week(星期)的日期选择控件(二) 的最后,有提到一个解决方案. 不过这方案有一个条件 ==> “2. 每年的周数从(1-52), 如果超过52 周 ...
- Hive官方手册翻译(Getting Started)(转)
原文:http://slaytanic.blog.51cto.com/2057708/939950 翻译Hive官方文档系列,文中括号中包含 注: 字样的,为我自行标注的,水平有限,翻译不是完美无缺的 ...
- PHP中::、->、self、parent::、$this操作符的区别
在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者 ...
- Yar - Yet Another RPC framework for PHP
Introduction Yar is a RPC framework which aims to provide a simple and easy way to do communication ...
- Jessica's Reading Problem
Description Jessica's a very lovely girl wooed by lots of boys. Recently she has a problem. The fina ...
- The Romantic Hero
Problem Description There is an old country and the king fell in love with a devil. The devil always ...
- Web Navigation
Description Standard web browsers contain features to move backward and forward among the pages rece ...
- ArcMap运行时出现Runtime Error错误的解决方案
运行ArcMap时弹出错误提示:“Microsoft Visual C++ Runtime Library. Runtime 1.开始->运行->regsvr32 "C:\Pro ...
- python解决SNIMissingWarning和InsecurePlatformWarning警告
在想要获取https站点的资源时,会报出SNIMissingWarning和InsecurePlatformWarning警告 SNIMissingWarning: An HTTPS request ...