Docker 部署 BaGet
BaGet 是轻量级 NuGet V3 与符号服务器。本页整理官方 Docker 示例,但不绑定任何业务项目。
:::warning 先评估维护状态
BaGet 官方 Docker 文档和 loicsharma/baget 镜像示例多年未更新,且官方教程使用可变的 latest 标签。用于长期或生产环境前,应检查上游仓库、依赖运行时和已知安全问题,并评估仍在维护的兼容实现。不要把旧教程中的镜像直接视为当前受支持的软件。
:::
固定镜像并生成 API Key
先拉取经过评估的镜像,再记录实际 digest:
docker pull loicsharma/baget:latest
docker image inspect loicsharma/baget:latest \
--format '{{index .RepoDigests 0}}'
将得到的 loicsharma/baget@sha256:... 写入 .env,不要在自动化部署中继续依赖 latest:
BAGET_IMAGE=loicsharma/baget@sha256:<verified-digest>
BAGET_API_KEY=<long-random-api-key>
可以用 openssl rand -hex 32 生成 API Key。.env 包含发布权限,应限制文件权限、加入版本控制忽略列表,并在生产环境改由 Secret 管理系统注入。
Docker Compose
services:
baget:
image: ${BAGET_IMAGE:?set a reviewed image digest in .env}
restart: unless-stopped
ports:
- "127.0.0.1:5555:80"
environment:
ApiKey: ${BAGET_API_KEY:?set BAGET_API_KEY in .env}
Storage__Type: FileSystem
Storage__Path: /var/baget/packages
Database__Type: Sqlite
Database__ConnectionString: "Data Source=/var/baget/baget.db"
Search__Type: Database
volumes:
- baget-data:/var/baget
volumes:
baget-data:
启动并检查日志:
docker compose config --quiet
docker compose up -d
docker compose ps
docker compose logs --tail=200 baget
验证服务索引:
curl --fail http://127.0.0.1:5555/v3/index.json
示例只绑定回环地址。团队共享或远程使用时,应在反向代理上配置 HTTPS、身份访问边界和备份,不要把 BaGet 的 HTTP 端口直接开放到公网。
发布与还原包
先从 Secret 管理工具把 API Key 读入当前 shell 的 BAGET_API_KEY 变量,再发布通用示例包:
dotnet nuget push \
./artifacts/Example.Package.1.0.0.nupkg \
--source http://127.0.0.1:5555/v3/index.json \
--api-key "$BAGET_API_KEY"
NuGet 源地址:
http://127.0.0.1:5555/v3/index.json
符号源地址:
http://127.0.0.1:5555/api/download/symbols
HTTP 仅适用于同机开发验证。共享源应使用 HTTPS;较新的 NuGet 客户端还会限制不安全的 HTTP 源。
数据与备份
默认示例把 SQLite 数据库和包文件都保存在 baget-data。容器重建不会删除命名卷,但命名卷不是备份。
备份前应停止写入并停止容器,再对整个卷创建一致性快照或归档;恢复时必须同时恢复数据库与 packages 目录,并在隔离环境验证包索引、下载和符号服务。不要只备份 SQLite 文件或只复制包目录。
docker compose stop baget
docker compose down
docker compose down 默认保留卷;docker compose down -v 会删除全部包和元数据,确认备份可恢复前不要执行。