3.3 KiB
FLNXI 付费模块 Registry 代理
这个目录只用于“客户拉取付费模块镜像”的 Registry 前置代理示例。
核心规则:
- 发布方推送镜像仍走发布账号,不把发布账号给客户。
- 客户拉取
flnxi/premium/*付费模块时,用户名固定为flnxi-module,密码是验证系统签发的 15 分钟短期pullToken。 - Nginx 代理会把
Authorization、Registry 主机、模块仓库路径、请求类型、tag/reference 和 digest 转发给license-server的GET /api/registry/auth。 - 验证系统确认 token、token 审计记录、许可证、激活实例和模块授权都有效后,代理才把请求放行到 Registry。
启动示例
先确认许可证服务和本代理在同一个 Docker 网络里,或者把 LICENSE_SERVER_AUTH_URL 改成代理能访问到的地址。
cd deploy/registry-proxy
cat > .env <<'EOF'
REGISTRY_PROXY_PORT=5000
LICENSE_NETWORK_NAME=license-network
LICENSE_SERVER_AUTH_URL=http://license-server:3000/api/registry/auth
EOF
docker compose up -d
如果许可证服务是通过 license-server/nginx/nginx.conf 里的外层 Nginx 暴露,可以把 LICENSE_SERVER_AUTH_URL 写成对应内网地址,例如:
LICENSE_SERVER_AUTH_URL=http://license-nginx/api/registry/auth
如果镜像站已经存在,不想再启动一个新的 registry:2,使用接入现有 Registry 的编排:
cat > .env <<'EOF'
REGISTRY_PROXY_PORT=5002
REGISTRY_NETWORK_NAME=flnxi-registry-net
LICENSE_NETWORK_NAME=license-network
REGISTRY_BACKEND=http://flnxi-registry:5000
REGISTRY_BACKEND_AUTH=Basic <proxy-backend-user-basic-token>
LICENSE_SERVER_AUTH_URL=http://license-server:3000/api/registry/auth
EOF
docker compose -f docker-compose.existing-registry.yml up -d
这种方式只新增 Nginx 拉取代理,不会创建新的 Registry 数据卷,也不会覆盖已有镜像站。如果现有 Registry 后端本身启用了 Basic Auth,必须配置一个只给代理使用的后端账号,并把 REGISTRY_BACKEND_AUTH 写成 Basic base64(username:password);客户仍然只拿验证系统签发的短期 pullToken,不会拿到这个后端账号。
客户拉取方式
客户侧 Go Agent 拿到验证系统返回的短期凭证后,等价于:
docker login registry.example.com:5000 -u flnxi-module -p '<pullToken>'
docker pull registry.example.com:5000/flnxi/premium/paid-core:1.0.0
没有短期 token、token 过期、仓库路径不匹配、tag 不匹配、镜像清单 digest 不匹配、许可证过期、激活失效或模块授权被吊销,都会被代理拒绝。Docker 拉取层文件时的 blob digest 不是整镜像 digest,最终整镜像 digest 由客户侧 Agent 拉取完成后再校验。
发布方注意
这个代理示例默认只放行客户拉取,不开放推送。发布付费模块镜像时应使用内部发布入口或临时直连 Registry 内网入口,再把固定 digest 写入 license-server 的模块配置:
PREMIUM_MODULE_PAID_CORE_IMAGE=registry.example.com:5000/flnxi/premium/paid-core:1.0.0
PREMIUM_MODULE_PAID_CORE_DIGEST=sha256:...
正式客户环境不要把发布账号、发布密码或 Registry 管理界面口令写进主应用 .env。Registry 原始后端也不要直接暴露给客户访问;客户入口应只到这个前置代理。