72 lines
3.3 KiB
Markdown
72 lines
3.3 KiB
Markdown
# 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 原始后端也不要直接暴露给客户访问;客户入口应只到这个前置代理。
|