2026-06-03 18:41:52 +08:00

72 lines
3.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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` 改成代理能访问到的地址。
```bash
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` 写成对应内网地址,例如:
```env
LICENSE_SERVER_AUTH_URL=http://license-nginx/api/registry/auth
```
如果镜像站已经存在,不想再启动一个新的 `registry:2`,使用接入现有 Registry 的编排:
```bash
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 拿到验证系统返回的短期凭证后,等价于:
```bash
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` 的模块配置:
```env
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 原始后端也不要直接暴露给客户访问;客户入口应只到这个前置代理。