baget 是最接近开箱即用的轻量 nuget 私有源,纯 .net core 实现、linux 原生支持;常见 404 错误多因未在 url 中添加 /v3/ 后缀,api 根路径为 /v3/ 而非根路径,且需在 baget.env 中配置 apikey 和正确的 storage__path 容器内路径。

用 BaGet 快速起一个轻量 NuGet 私有源
BaGet 是目前最接近“开箱即用”的开源 NuGet v3 服务,纯 .NET Core 实现,Linux 原生支持,不依赖 IIS 或 Windows。它默认启用 FileSystem 存储,适合中小团队快速落地。
常见错误现象:curl http://localhost:5000/v3/index.json 返回 404,或 dotnet nuget push 报 Unable to load the service index —— 多半是没加 /v3/ 后缀,BaGet 的 API 根路径是 /v3/,不是根路径。
- 启动前务必在
baget.env中设置ApiKey,否则push会直接 401 -
Storage__Path必须是容器内路径(如/var/baget/packages),且挂载卷要确保宿主机目录可写 - 若用
dotnet run直接启动(非 Docker),需显式指定环境变量:dotnet run --project BaGet.csproj --environment=Production - 不建议在生产环境裸跑 HTTP;必须配合 nginx + HTTPS + basic auth,否则
ApiKey和包元数据明文暴露
用 verdaccio 搭建最小可行 NPM 私有源
verdaccio 是当前最轻、最易调试的 npm 私有 registry,Node.js 编写,单进程,配置即代码。它不强制要求数据库或 LDAP,htpasswd 插件开箱支持基础鉴权。
使用场景:前端团队内部共享 UI 组件、CLI 工具、或封装了公司登录逻辑的 SDK 包。
- 默认配置允许匿名
npm install,但禁止npm publish;发布需先npm adduser,账号密码存在htpasswd文件里 - 如果
npm publish报401 Unauthorized,检查两点:npm config get registry是否指向私有地址;verdaccio日志是否提示htpasswd插件加载失败(路径权限或格式错误) -
storage路径必须是相对路径或绝对路径,不能以~开头;Docker 部署时需映射该目录并保持 UID/GID 一致 - 不要把
verdaccio直接暴露在公网;它不内置速率限制和审计日志,建议前置 nginx 做 basic auth + TLS + 请求限流
Nexus 3:统一管理 NuGet/NPM/Maven/Docker 的重型方案
Nexus 3 是企业级多语言仓库的事实标准,但“重”是真实代价:Java 进程常驻、内存占用高(建议 ≥4GB RAM)、首次启动需数分钟初始化、UI 响应偏慢。
参数差异明显:NuGet 的 hosted 仓库必须勾选 Allow redeploy 才能覆盖同版本包;NPM 的 hosted 同样要打开,否则 npm publish 报 400 Bad Request。
- NuGet 推送必须用
nuget.exe push -Source或dotnet nuget push,不能用 Nexus Web UI 上传.nupkg—— UI 只支持 JAR/Docker 等格式 - NPM 客户端需显式设置 registry:
npm config set registry http://nexus-host:8081/repository/npm-group/;npm-group是 group 类型仓库,必须把npm-hosted和npm-proxy都加进去才能同时支持私有包和代理拉取 - 权限配置容易被跳过:新建用户后,必须在
Repository Privileges中为其分配nx-repository-view-npm-hosted-*权限,否则始终 401 - SQLite 默认存储不适用于高并发写入;生产环境强烈建议换 PostgreSQL,并关闭
anonymous access
鉴权与网络层绕不开的硬约束
所有方案都绕不开一个事实:NuGet 和 npm 协议本身不带现代 Token 机制,底层依赖 BASIC auth + HTTPS。这意味着反向代理层不是可选项,而是安全底线。
容易踩的坑:nginx 配置里漏掉 proxy_set_header Authorization $http_authorization,会导致鉴权头被丢弃,后端永远收不到用户名密码;或者用了 http:// 源却没配 always_auth,某些客户端(如 VS2022)会静默跳过认证。
- certbot 自动续期必须加
--deploy-hook "systemctl reload nginx",否则证书更新后 nginx 不重载配置,HTTPS 会中断 - 不要复用同一套 basic auth 用户名密码管理 NuGet 和 npm;二者用户体系无交集,混用会增加权限泄漏面
- Docker 容器间通信尽量走自定义 bridge 网络(如
docker network create nexus-net),避免用host模式——后者会让容器直接暴露宿主机端口,绕过 nginx 控制
真正麻烦的从来不是启动服务,而是让每个开发者的本地 dotnet 和 npm CLI 都稳定指向正确的源、带着正确的凭据、在 CI 流水线里不因环境差异失效。配置分散、工具链版本漂移、权限粒度错配,这些才是压垮私有仓库落地的最后一根稻草。











