Sinopia 私有仓库调研

本文最后更新于:2026年3月29日 晚上

Sinopia 私有仓库调研

tips:这篇记录的是围绕 Sinopia 的调研与部署思路。Sinopia 后来已经停止维护,如今如果重新做私有 npm 仓库,建议直接评估 Verdaccio。

为什么要用 Sinopia

前端团队一旦开始沉淀公共组件、工具库或者业务 SDK,很快就会遇到一个问题:这些包不适合直接发布到公共 npm,但又希望像普通 npm 包一样被安装、升级和版本管理。

如果没有私有仓库,常见做法通常只有几种:

  • 直接把代码复制到各个项目里,版本很快就会失控。
  • 用 git 地址引用依赖,可以用,但使用体验不如 npm 仓库完整。
  • 手工打包再分发,流程重,维护成本也高。

Sinopia 解决的,就是“把公司内部包当成 npm 包一样管理”这个问题。它既能托管私有包,也能代理公共 npm 源,把团队常用依赖缓存到内网里。

Sinopia 是什么

Sinopia 本质上是一个私有的、带缓存能力的 npm 仓库服务。它的核心思路不是替代 npm,而是在团队内部加一层自己的 registry。它“够轻、够快、够容易”。

它比较适合三类场景:

  • 发布公司内部私有包
  • 缓存 npmjs.org 上的公共包
  • 临时覆盖某个公共包的内部修订版本

吸引人的地方也很直接:

  • 部署轻,不需要额外数据库,默认走文件系统存储。
  • 一台能跑 Node 的内网机器就可以启动。
  • 缺的包会回源 npmjs.org,请求过一次之后就会被缓存下来。
  • 团队内部发布、安装、升级的流程和 npm 原生体验接近。

部署过程

1. 准备一台内网可访问的 Node 服务器

至少要满足两件事:

  • 团队成员的电脑和 CI 都能访问到这台机器。
  • 服务器上安装有 Node 和 npm 环境。

2. 安装并首次启动

先全局安装,然后直接跑一次,让它把默认配置文件生成出来:

1
2
npm install -g sinopia
sinopia

Sinopia 第一次启动时会自动生成 config.yaml。启动成功后,默认会监听 4873 端口,可以通过 http://[ip]:4873/ 打开页面。

3. 修改配置,让它能被内网访问

如果只是本机调试,默认配置够用;如果要给别人访问,至少要把监听地址改出来:

1
listen: 0.0.0.0:4873

除此之外,还要重点看这几类配置:

  • storage:包文件和缓存落盘的位置。
  • auth:用户认证方式,常见的是 htpasswd
  • uplinks:上游 npm 源地址。
  • packages:哪些包允许访问、发布、是否需要走上游代理。

下面这段更适合作为“配置思路示例”,重点是看清楚几个角色:本地存储、认证、上游源、包权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
storage: ./storage

auth:
htpasswd:
file: ./htpasswd

uplinks:
npmjs:
url: https://registry.npmjs.org/

packages:
'@company/*':
access: $authenticated
publish: $authenticated
proxy: npmjs

'**':
access: $all
proxy: npmjs

listen: 0.0.0.0:4873

如果你的目的只是“公司内部私有包 + 公共 npm 缓存”,那上面这类思路就够了:私有 scope 允许内部用户发布,其他公共包走 npmjs 上游代理。

4. 把进程跑成常驻服务

手动执行 sinopia 只能临时起服务,真正部署时还得考虑进程守护和服务器重启后的自启动。
官方文档给的是 forever 思路,实际使用时也可以换成你团队更熟悉的 pm2systemd。核心目标只有两个:

  • 进程异常退出后能自动拉起。
  • 机器重启后服务能自动恢复。

如果你准备把它长期跑在服务器上,最好再单独建一个运行用户,不要直接让业务机器所有人都用同一个高权限账号去启动服务。

团队内部怎么使用 Sinopia

1. 使用方式:全量接管

所有 npm 安装都走 Sinopia。

1
npm config set registry http://[ip]:4873/

2. 开发私有包,开发机先登录内部仓库

无论是发布还是安装私有包,第一步都是先登录内部 registry:

1
npm adduser --registry http://[ip]:4873/

登录成功后,认证信息会写进本机的 .npmrc

3. 发布内部包

如果你准备给团队发布内部包,最好从一开始就用 scope 命名,比如:

1
2
3
4
{
"name": "@company/utils",
"version": "1.0.0"
}

然后执行发布:

1
npm publish --registry http://[ip]:4873/

这样别人一看到包名,就知道它是公司内部包,不容易和公共 npm 包混淆。

4. 安装内部包

团队其他成员只要本机 .npmrc 已经配好 scope 或默认 registry,就可以像装普通 npm 包一样安装:

1
npm install @company/utils

5. nrm 可以临时切源

nrm 这种工具可以帮个人快速切换 npm 源:

1
2
3
npm install -g nrm
nrm add company http://[ip]:4873/
nrm use company

Sinopia 私有仓库调研
http://bestkele.com/2019/09/06/investigation/sinopia/
作者
kele
发布于
2019年9月6日
许可协议