npm 私服怎么搭:从安装到配源、scope 和 publish

简介: 私有化部署后接 npm:建 HOSTED/PROXY/GROUP,配 .npmrc 与 scope,用最小包跑通 publish/install,并处理 E401、E404、E409。

npm publish 报 E401 Unable to authenticate,或装内部包时报 E404——多半不是令牌本身坏了,而是私服还没接对:服务没起来、仓库类型不对、registry 末尾 / 漏了,或 _authToken 路径和 scope 没对齐。

下面用 AngusRepo 社区版私有化部署,按操作顺序走完一遍:安装 → 建仓与令牌 → .npmrc(含 scope)→ 最小包 publish / install → 验证。命令里的主机写成 repo.example.com,换成你的域名即可。更细的 401 见 npm publish 401 排查。

1. 安装(得到可打开的控制台)

前提:Docker Engine + Compose v2;约 2 核 / 4 GB;放行 80;gm.example.com 与 repo.example.com 已解析到本机(试用可写 /etc/hosts)。完整步骤见 第一次跑通。

curl --fail --location --progress-bar -o AngusRepo-Community-1.0.0.zip \
  https://repo.anguskit.com/raw/raw-public/AngusKit/repo/AngusRepo-Community-1.0.0.zip
unzip AngusRepo-Community-1.0.0.zip
cd AngusRepo-1.0.0
./install.sh

向导与快速开始对齐:Compose;Access 选 2(捆绑反代);TLS 选 4(HTTP :80);Database 选 Compose 内 MySQL;Public DNS name 填后缀如 example.com。出现 Install finished. 后:

./bin/angusctl.sh doctor   # 看到 doctor: OK

浏览器打开 http://gm.example.com/ 登录,再打开 http://repo.example.com/。Windows 用 curl.exe + .\install.bat。需要 HTTPS 时见 安装与部署。

下文默认 HTTP 私有化,URL 写成 http://repo.example.com/...。上了可信证书后,把 .npmrc 里的协议和 _authToken 主机路径一并改成 https:// 对应形式,避免混协议导致 401。控制台能打开后,先建仓库和令牌,再改客户端配置。

2. 建仓、令牌与拓扑

npm publish 只能进 HOSTED;PROXY、GROUP 只读。在 http://repo.example.com/ 创建(名称可自定,后面配置保持一致):

仓库名示例 类型 干什么
npm-hosted HOSTED 内部包发布目标;建议禁止覆盖
npmjs-proxy PROXY 代理 npmjs(远程 URL:https://registry.npmjs.org)
npm-all GROUP 统一安装入口;成员顺序 hosted → proxy

npm 私服拓扑:publish 到 HOSTED,install 经 GROUP 聚合 HOSTED 与 PROXY
npm GROUP 的 packument(versions / dist-tags)按成员取并集,同名版本保留先匹配成员;tarball 等二进制仍按成员顺序 first-match。成员顺序写成 hosted → proxy,内部版本进并集,同坐标冲突时 HOSTED 优先,有助于降低依赖混淆风险。开发者只配一个安装 URL。

同一控制台继续准备:

  • [ ] 创建访问令牌(只显示一次,立刻保存)
  • [ ] CI 对 npm-hosted 有 Write;开发者对 npm-all 有 Read
  • [ ] GROUP 成员顺序确认为 hosted → npmjs-proxy
export NPM_TOKEN="your_access_token"   # .npmrc 的 _authToken 填这个
export REPO_HOST="repo.example.com"    # 换成你的 repo.<域名>

具体路径以控制台「接入配置」为准;字段说明见 npm 格式。

3. 安装:.npmrc 与 scope

默认口径:安装走 GROUP(npm-all),发布走 HOSTED(npm-hosted)。scope 不要指到 PROXY。

配法一:只切公司 scope(迁移期推荐)

公共包继续走原来的源,只有 @mycompany 走私服 GROUP:

@mycompany:registry=http://repo.example.com/npm/npm-all/
//repo.example.com/npm/npm-all/:_authToken=${NPM_TOKEN}
//repo.example.com/npm/npm-hosted/:_authToken=${NPM_TOKEN}

项目 .npmrc 可以提交 URL;对 npm CLI / Yarn 1,令牌行可用 ${NPM_TOKEN} 由环境注入。npm 自 7.10 起已移除 always-auth,写了也不生效——靠上面两条 URL 作用域 _authToken 覆盖元数据与 tarball 路径。若流水线用 pnpm ≥11.5.3,项目 .npmrc 里的 ${...} 凭据行会被忽略,令牌改走用户级配置或 pnpm_config_,见 pnpm 和 yarn 怎么用私有源。

配法二:整个项目默认走私服

registry=http://repo.example.com/npm/npm-all/
//repo.example.com/npm/npm-all/:_authToken=${NPM_TOKEN}
//repo.example.com/npm/npm-hosted/:_authToken=${NPM_TOKEN}

三个高频坑:

  1. registry URL 末尾要有 /,漏掉是最常见的低级错误。
  2. _authToken 那一行没有 http:// / https://,主机路径必须和 registry 完全一致(含路径和末尾斜杠),对不上就是 E401。
  3. 从 npmjs 迁过来时,package-lock.json 会锁旧 registry——删掉 lock 后重新 npm install,或批量改 resolved 字段,否则会继续打到公网。

先确认令牌对 HOSTED 生效:

npm whoami --registry http://repo.example.com/npm/npm-hosted/

应打印当前用户名;这里就失败,先别 publish。

4. 发布:publish 到 HOSTED

发布目标必须是 HOSTED,不能指向 GROUP 或 PROXY。scoped 包默认私有发布:

npm publish --registry http://repo.example.com/npm/npm-hosted/ --access restricted

也可以在 package.json 里写死发布地址:

{
   
  "name": "@mycompany/ui-kit",
  "version": "1.0.0",
  "publishConfig": {
   
    "registry": "http://repo.example.com/npm/npm-hosted/",
    "access": "restricted"
  }
}

同版本重复 publish 会 409。这是预期行为:改 bug 请升 patch,不要覆盖。确需对外公开时再改 access: "public",并确认仓库 ACL 允许匿名读。

5. 验证闭环(最小可发布包)

不要先装一个还不存在的包。按下面顺序:建包 → 发布 → 查元数据 → 干净目录安装。

mkdir -p /tmp/angus-npm-demo && cd /tmp/angus-npm-demo
cat > package.json <<'EOF'
{
  "name": "@mycompany/ui-kit",
  "version": "1.0.0",
  "description": "AngusRepo npm smoke package",
  "main": "index.js",
  "publishConfig": {
    "registry": "http://repo.example.com/npm/npm-hosted/",
    "access": "restricted"
  }
}
EOF
echo "module.exports = { ok: true };" > index.js

# 复用上文 .npmrc(或写到本目录)
cat > .npmrc <<EOF
@mycompany:registry=http://repo.example.com/npm/npm-all/
//repo.example.com/npm/npm-all/:_authToken=${NPM_TOKEN}
//repo.example.com/npm/npm-hosted/:_authToken=${NPM_TOKEN}
EOF

npm publish
npm info @mycompany/ui-kit --registry http://repo.example.com/npm/npm-all/

再开一个干净目录验证安装:

mkdir -p /tmp/angus-npm-consume && cd /tmp/angus-npm-consume
cat > .npmrc <<EOF
@mycompany:registry=http://repo.example.com/npm/npm-all/
//repo.example.com/npm/npm-all/:_authToken=${NPM_TOKEN}
//repo.example.com/npm/npm-hosted/:_authToken=${NPM_TOKEN}
EOF
npm init -y
npm install @mycompany/ui-kit@1.0.0
node -e "console.log(require('@mycompany/ui-kit'))"

控制台制品列表应能看到 1.0.0;node 应打印 { ok: true }。

CI 最小片段

流水线注入 NPM_TOKEN(不要用 Admin 令牌),在仓库根写入与本地一致的 .npmrc 后:

- run: |
    printf '@mycompany:registry=http://repo.example.com/npm/npm-all/\n' > .npmrc
    printf '//repo.example.com/npm/npm-all/:_authToken=%s\n' "$NPM_TOKEN" >> .npmrc
    printf '//repo.example.com/npm/npm-hosted/:_authToken=%s\n' "$NPM_TOKEN" >> .npmrc
    npm ci
    npm publish --registry http://repo.example.com/npm/npm-hosted/ --access restricted

完整流水线编排另见 Jenkins 构建测试发布。pnpm / Yarn 接同一套私服见 pnpm 和 yarn 怎么用私有源(pnpm ≥11.5.3 不会展开项目 .npmrc 里的 ${NPM_TOKEN})。

6. 日常维护(publish / install 跑通之后)

清理旧版本 — npm-hosted 按「保留最近 N 版本」配置,先 Dry Run,见 清理策略。正式版保持不可变。

PROXY 冷缓存 — 首次拉公共包会慢,属正常;可对高频依赖做预热。

入库检查 — 上传时有轻量门禁;需要更细的漏洞 / 许可证分析时再接外部扫描。打开阻断前先处理误报,见 入库门禁与 SBOM。

报错速查

症状 常见原因 怎么处理
E401 Unable to authenticate _authToken 路径与 registry 不一致,或令牌过期 核对主机路径与末尾 /;见 401 排查
ENEEDAUTH 拉私有坐标时没带令牌 确认 npm-all / npm-hosted 的 _authToken 行存在且路径对齐(npm ≥7.10 无 always-auth)
E403 Forbidden 有身份但无 Write / Read 查 ACL;publish 账号要对 npm-hosted 有 Write
E404 Not Found GROUP 成员顺序错、scope 没生效、包未发布 npm info;浏览器打开 metadata URL
lock 仍打 npmjs package-lock.json 锁了旧 resolved 删 lock 重装,或改写 resolved
E409 Conflict 同版本重复发布 升版本号
装到旧版本 私服缓存了 metadata 等 TTL,或在控制台对该包失效缓存
ETIMEDOUT PROXY 冷缓存首次回源 二次安装应走缓存;可预热核心依赖

字段级说明见 npm 格式;更多排错见 故障排查手册。

FAQ

能不能 publish 到 GROUP?

不能。GROUP / PROXY 只读,发布必须指向 HOSTED。scope 用于安装路由;发布地址用 publishConfig 或 --registry 钉死 HOSTED。

迁移时要不要一上来全局换源?

不建议。优先用 scope:先切 @mycompany,公共源不动,跑稳再决定是否全局收口。只有 npm、治理很轻时 Verdaccio 仍可先撑一阵;要多格式或统一 ACL 时再并进制品库。

_authToken 那一行要不要写 https://?

不要。主机路径不含协议;必须与 registry 的主机 + 路径 + 末尾 / 完全一致,npm 才会带上认证。

从公网源迁过来为什么还在打 npmjs?

npm v7+ 的 lockfile 会记录 registry。迁仓后删 package-lock.json 再装,或更新其中的 resolved 字段。

小结

  • 安装并打开控制台 → 建 HOSTED + PROXY + GROUP → 发令牌。
  • 安装走 GROUP(.npmrc / scope);发布走 HOSTED(publishConfig 或 --registry)。
  • 末尾 / + npm-all / npm-hosted 两条 _authToken 路径对齐,是避免 E401 / ENEEDAUTH 的关键;pnpm 令牌注入见专文。
  • 用最小包跑通 publish → info → 干净目录 install;迁仓时处理 lockfile。

参考文章

相关文章
|
22天前
|
缓存 Kubernetes jenkins
私有 Docker 仓库怎么用:从安装到登录、推送和证书
私有化部署后接 Docker:建 HOSTED/PROXY/GROUP,处理 login 与 x509,完成 push、pull、CI 与 Kubernetes 拉取。
|
数据采集 机器学习/深度学习 数据可视化
数据科学项目实战:完整的Python数据分析流程案例解析
【4月更文挑战第12天】本文以Python为例,展示了数据分析的完整流程:从CSV文件加载数据,执行预处理(处理缺失值和异常值),进行数据探索(可视化和统计分析),选择并训练线性回归模型,评估模型性能,以及结果解释与可视化。每个步骤都包含相关代码示例,强调了数据科学项目中理论与实践的结合。
1815 2
|
JSON 应用服务中间件 nginx
filebeat收集json格式的nginx程序日志(二)
filebeat收集json格式的nginx日志 1.为什么要收集json格式的日志类型 由于nginx普通日志收集过来的日志内容都是存在一个字段中的值,我们想单独对日志中的某一项进行查询统计,比如我只想查看某个IP请求了我那些页面,一共访问了多少次,在普通的日志中是无法过滤的,不是很满意
1623 0
filebeat收集json格式的nginx程序日志(二)
|
3月前
|
人工智能
【AI Agent】《2026年9月AI Agent全栈开发技术选型专项面试宝典》
《2026年9月 AI Agent全栈开发技术选型专项面试宝典》聚焦LLM、Agent框架、RAG、工具协议、后端、前端及部署六大核心模块,覆盖33道高频真题。内容以实战为纲,强调模型分层(如GPT-4o主用+Claude降级)、LangGraph替代LangChain、PGVector+多模态RAG、MCP协议演进、FastAPI异步架构、SSE流式渲染及K8s可观测性等关键决策,并辅以量化对比与踩坑复盘,助开发者精准应对大厂终面技术权衡题。
|
22天前
|
存储 弹性计算 安全
阿里云服务器租用流程解析:自定义/快速/活动/云市场四种主流租用流程详解
阿里云云服务器租用分为四条主流方式:自定义租用控制粒度最细,可逐项配置计费模式、地域、实例规格、镜像、存储、带宽与安全组;一键部署适合快速交付与开发测试,但默认不含数据盘、需自行配置安全组;云市场镜像提供开箱即用的软件环境,需核验兼容性与第三方安全更新;限时活动购买性价比最高,如轻量2核2G 38元/年、经济型e 99元/年、u1 2核4G 199元/年。选型应兼顾业务负载、续费政策与账号资格。
|
22天前
|
API 开发工具 开发者
Meta Muse Wonder 开放 API,Wonder Full 却不能调用?开发者接入前看懂 3 个边界
10月12日,Meta发布Muse Wonder与Muse Wonder Full:前者(`muse-wonder-1.0`)已开放API调用;后者仅限指定Muse Code订阅,**不开放API**。二者能力、接口与定价均不同,兼容OpenAI SDK≠功能等同。开发者须先确认可用版本与接口格式,再以真实任务评测迁移价值。(239字)
|
3月前
|
Java Linux 开发工具
IDEA官网下载2026|IDEA社区版安装+使用图文步骤
IntelliJ IDEA(简称IDEA)是JetBrains推出的主流Java集成开发环境,集代码编写、编译、调试、版本控制等功能于一体。提供免费社区版(支持Java/Kotlin/Maven/Gradle等)和付费旗舰版(增强Spring、数据库、前端等支持),开箱即用、智能提示强,适合学习与日常开发。
|
3月前
|
编解码 弹性计算 云计算
MiniMax-H3 视频生成模型 — 一键部署与使用指南
MiniMax-H3是MiniMax开源的33B全模态视频生成模型,支持文生视频、图生视频、参考生视频三种模式,原生输出2K/15秒带立体声音频视频,已原生适配ComfyUI,并可通过阿里云计算巢一键部署。(239字)
|
10月前
|
人工智能 安全 API
2026 AI元年:从模型能力竞赛,到系统级智能落地
2026年被称为“AI元年”,标志AI从惊艳演示迈向工程化落地:复合系统替代单一大模型,Agent成为可信赖的工作流执行者,端侧小模型与垂直模型崛起。行业焦点转向可靠性、可控性与商业实效——AI正褪去“黑箱”光环,回归确定性交付的工程本质。
1961 3
dotNetFx40_Full_x86_x64安装步骤详解(附.NET Framework 4.0离线包使用方法)
dotNetFx40_Full_x86_x64.exe是微软.NET Framework 4.0官方安装包,兼容Win7/10/11(32/64位),为老旧工业软件、财务系统等提供运行支持。需以管理员身份运行,安装后必须重启生效。(239字)

热门文章

最新文章