跳到主要内容
版本号:Next

最佳实践

以下指南是我们收集并通常向所有用户推荐的最佳实践列表。 不要将这个指南当做是强制的,你可以根据你的需要来选取采纳其中的一部分。

你可以在Verdaccio社区自由的提出你的最佳实践.

私有仓库

您可以添加用户并管理哪个用户可以访问哪个包。

建议您定义私有包的前缀, 如 local-* 或者 scope @my-company/*,这样你的所有私有包应该像这样:local-foo。 通过这种方法您可以清楚地把公有包和私有包分开。

 yaml
packages:
'@my-company/*':
access: $all
publish: $authenticated
'local-*':
access: $all
publish: $authenticated
'@*/*':
access: $all
publish: $authenticated
'**':
access: $all
publish: $authenticated

请务必记住,软件包的配置顺序很重要,总是从上到下匹配。

从npmjs.org使用公有包

如果一些包没有在存储里,服务器将试着从npmjs.org中取它。 如果npmjs.org坏了,它会假装没有其他的包存在, 并起到缓存包的作用。 Verdaccio 将只下载需要的内容(由客户端请求),这些信息将被缓存,因此如果客户端再次请求相同的内容,无需向 npmjs.org 询问即可提供。

示例:

如果您成功地从服务器请求了一次 express@4.0.1,那么即使 npmjs.org 出现故障,您也可以随时再次请求(及其所有依赖项)。 不过请注意,express@4.0.0 在有人实际需要时才会被下载。 如果 npmjs.org 离线,服务器将表示只发布了 express@4.0.1(缓存中的内容),而没有发布其他内容。

覆盖公共包

如果你想使用某个公共软件包 foo 的修改版本,你可以直接将其发布到本地服务器,这样当你输入 npm install foo 时,它会考虑安装你的版本

这里有两个选项:

  1. 您想创建一个单独的 fork 并停止与公共版本同步。

    如果要这样做,应修改配置文件,这样 Verdaccio 就不会再向 npmjs 发出有关此软件包的请求。 在config.yaml中为该软件包添加一个单独条目,并从proxy列表中移除npmjs,然后重启服务器。

    packages:
    '@my-company/*':
    access: $all
    publish: $authenticated
    # comment it out or leave it empty
    # proxy:

    当您在本地发布软件包时,您可能应该使用比现有软件包更高的版本字符串,这样就不会与缓存中的软件包冲突。

  2. 您希望临时使用自己的版本,但在它更新后立即切换回公共版本。

    为了避免版本冲突,您应该使用下一个补丁版本的自定义预发布后缀。 例如,如果公共软件包的版本是 0.1.2,则可以上传 0.1.3-my-temp-fix

     npm version 0.1.3-my-temp-fix
    npm --publish --tag fix --registry http://localhost:4873

    这样,您的软件包将一直使用,直到其原始维护者将其公共软件包更新到 0.1.3

安全

安全从环境开始。

补充阅读:

通过 $authentiated 灵活的设置访问权限

默认情况下,所有用户都可以访问您在 Verdaccio 中发布的所有软件包。 我们建议将软件包的 access 属性更新为 $authenticated,以防止外部非授权用户访问注册中心。

packages:
'@my-company/*':
access: $authenticated
publish: $authenticated
'@*/*':
access: $authenticated
publish: $authenticated
'**':
access: $authenticated
publish: $authenticated

这样,除非获得授权,否则任何人都无法访问您的注册中心,并且私有包不会显示在 Web 界面中

删除 proxy 以提高私有包的安全性

安装完成后,默认情况下所有软件包都将解析到默认的上行链接(公共注册中心 npmjs)。

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

这意味着,即使像 @my-company/auth 这样的私有软件包是在本地发布的,服务器也会查询公共注册表。 如果您不打算这样做,请删除 proxy 属性,并使用类似这样的配置:

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

这将避免下载压缩包和不必要地从外部注册中心合并元数据

服务器

加密连接

通常建议使用HTTPS。 因此,我们建议阅读 SSL 部分以确保 Verdaccio 的安全,或者在 Verdaccio 之上使用 HTTPS 反向代理

令牌过期

verdaccio@3.x起,令牌没有过期日期。 因此,我们在接下来的verdaccio@4.x中引入了 JWT 功能PR#896

security:
api:
jwt:
sign:
expiresIn: 15d
notBefore: 0
web:
sign:
expiresIn: 1h

使用此配置将覆盖当前系统,您将能够控制令牌的生存时间

使用 JWT 还可以提高身份验证插件的性能。 旧系统会在每次请求时执行解包并验证凭据,而 JWT 则依赖令牌签名,避免了插件的开销。

顺便提一句,请注意在 npmjslegacy 中,verdaccio 标记永远不会过期(/),除非你手动使其失效。

速率限制

自版本 v5.4.0 起,关键接口已默认启用速率限制。 以下命令被视为用户接口:

  • npm token 所有变体
  • npm login/adduser
  • npm profile 所有支持的变体
  • 用户网站 /sec/login 接口。

前面的接口列表限制为 100 个请求每 15 分钟,这足以满足基本使用要求,如果需要提高该级别,请查看 userRateLimit 配置选项。

userRateLimit:
windowMs: 50000 <- (minutes * 60 * 1000)
max: 1000 (number of request peer windowMs)

网站接口例如 searchpackagessidebardetail 默认受保护,每 2 分钟可请求 5,000 次,也可通过 Web ui 选项进行配置。

我们建议根据您的需求自定义此值,以避免对关键接口进行任何类型的 (DDoS) 或暴力破解攻击。

例如,npm install 使用的 CLI API 接口目前不受限制,因为它们不被认为是关键接口,但如果您有任何充分的理由,请展开讨论。