原计划建进共享 muse-dify 遇两阻塞:①muse 锁单工作区+create-tenant 抛错 ②HTTP 节点经 ssrf_proxy 打内网 worker 被 deny to_private_networks 拦(muse→:9501 实测403)。 创始人拍板给 game 单起隔离实例:独立 compose(game-dify)+错开端口(28080/28443/25003) +独立卷+新 SECRET_KEY,自有 ssrf 模板放行 gen worker,muse 零受扰(仍403)。 导入 DSL(0.1.5→0.6.0迁移完好)+发布+真跑:HTTP节点succeeded/worker返202/ worker日志'受理(202) userToken=<none>全局key回落'。凭据档回写 game-dify 端点+登录+ headless token 签发法(RSA/CSRF 绕过)。spike README/DSL 更新为已验证态。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
177 lines
16 KiB
Markdown
177 lines
16 KiB
Markdown
---
|
||
date: 2026-07-02
|
||
topic: 内网凭据与端点
|
||
canonical: true
|
||
---
|
||
|
||
# 内网凭据与端点(authoritative · 内网阶段密钥/端点单一事实源)
|
||
|
||
> **创始人铁律(2026-06-18)**:**内网阶段,所有决策 + 密钥都进项目文档,不靠环境变量。** 内网(Tailscale)地址/密钥/token **允许入仓**(`CLAUDE.md` 已授权:"内网,地址和密码可入仓")。**需要 key 一律查本档——别再反复找创始人要。**
|
||
> 本档 = 内网密钥/端点单一事实源。e2e / 生成产线 / 部署 / 量测 需 key 的地方都读这里。
|
||
|
||
---
|
||
|
||
## new-api 网关(生成主线 LLM 网关)
|
||
|
||
- **`NEWAPI_KEY`(调网关的 token)**:`sk-84GAintLi0YPG92nGh3fxdIYn6sB7NuOGw0FN491qu1h8NXT`
|
||
- **`NEWAPI_BASE_URL`**:`http://100.64.0.8:3000`(mini-infra)
|
||
- ⚠️ **baseUrl 坑**:Java(Spring AI)侧用 **host 根、不带 `/v1`**(`http://100.64.0.8:3000`,经 `stripV1Suffix`);Python(openai)侧 `base_url` 要带 `/v1`。见 `.agents/skills/saa-graph-orchestration.md §3`。
|
||
- **协议端点(同一 baseUrl、统一 `NEWAPI_KEY`、协议由调用方选)**:
|
||
- OpenAI 兼容:`POST {baseUrl}/v1/chat/completions`
|
||
- Anthropic 原生:`POST {baseUrl}/v1/messages`(thinking 分离;MiniMax-M3「用对它」走这条)
|
||
- **接入铁律(2026-06-22 纠正旧口径)**:统一出口 = new-api 网关(baseUrl + `NEWAPI_KEY`),统一计费 / 密钥 / 审计;**协议与 SDK 不锁**——OpenAI 兼容 / Anthropic 原生 / 厂商 SDK 均可,只要 baseUrl 落 new-api、key 用 `NEWAPI_KEY`。**作废**「唯一 OpenAI 兼容出口 / 绝不直连厂商 SDK」旧表述(new-api 只是统一端点,不锁协议)。
|
||
- **用途**:`SaaFullGraphE2eTest`(`-Dsaa.e2e=1`)/ 生成产线 / **gameDefinition 路 cutover ≥60% 量测**(003-U1 第一步)都用它。
|
||
- **上游 channel keys**(new-api 配的各 provider key,非调网关 token):`game-cloud/huijing-server/src/main/resources/application.yaml` 的 `channels.*.api-key`(行 ~207-290)。
|
||
- **可用模型档(对比测试 / 证路用 · 2026-06-25 补)**:
|
||
- **`glm-5.2`** —— **Anthropic message 协议**(走 `/v1/messages`),定位 **opus 高级模型档**,上下文 **512K**。后续作**高级档对比测试 / 强模型 cross-check 证路**用,填补复杂档「真强模型证路」此前缺 opus 档的空缺(原 deepseek-v4-pro 跨族证路力弱)。
|
||
- 便宜档生成主力 = **MiniMax-M3**(Anthropic 原生分离 thinking,见上「协议端点」);其余 provider 模型见 application.yaml `channels.*`。
|
||
|
||
---
|
||
|
||
## 机器(Tailscale 内网)
|
||
|
||
| 机器 | ssh 别名 | Tailscale IP | 角色 |
|
||
|---|---|---|---|
|
||
| 6c6g(本机) | — | 100.64.0.9 | 常驻大脑(文档/计划/评审);**禁 chrome(exit 144)** |
|
||
| mini-desktop | `mini-desktop` | 100.64.0.7 | 权威构建 / e2e 门(x86 同构);staging repo `/root/game-staging/repo` |
|
||
| mini-infra | `mini-infra` | 100.64.0.8 | 基建(new-api:3000 / PostgreSQL / Redis / Gitea / Docker) |
|
||
| lili-mac | `lili-mac` | 100.64.0.10 | Mac 开发执行线(非常驻,会休眠) |
|
||
|
||
## Git 远程
|
||
|
||
- Aliyun Gitea:`ssh://git@101.200.34.71:2222`(clone/fetch/push 默认走它)
|
||
|
||
---
|
||
|
||
## 基建数据面(mini-infra `100.64.0.8` · Docker · 2026-06-24 从容器 env 抠出落档)
|
||
|
||
> tier2 P4 服务化/落库要用:Agent Service 的 MessageBus/session 走 Redis;第二装载落库 manifest 进 MySQL、源文件全文进 MinIO(S3 兼容 OSS)。
|
||
|
||
| 服务 | 端点(Tailscale) | 凭据 | 用途 |
|
||
|---|---|---|---|
|
||
| **Redis** | `100.64.0.8:6379` | `requirepass` = `9ea28f5d28d68b09bfd7ccfc31216a52` | tier2 Agent Service MessageBus / session 状态(create_app) |
|
||
| **MySQL** | `100.64.0.8:3306` | root / `ZRH3jwYLOrntBcTAw29MW9BP` | tier2 落库源工程版本表(manifest);game-cloud 业务库 |
|
||
| **MinIO**(S3 兼容 OSS) | `100.64.0.8:9000`(控制台 9001) | `ragflow` / `6c4b77b2f055c8a66e00e3c38ef3d818c166951d478cc7cc` | tier2 落库源文件全文(key=`tier2-src/<game_id>/<version_id>/<相对路径>`) |
|
||
| **PostgreSQL** | `100.64.0.8:5433`(外)→5432(内) | (按需补;new-api/ragflow 用) | — |
|
||
|
||
> Redis 需 AUTH(NOAUTH 已实证);MinIO root 即 ragflow(与 ragflow 共用实例,tier2 另开 bucket 如 `tier2-src` 隔离)。这些是内网 Tailscale 凭据、按铁律入仓。
|
||
|
||
---
|
||
|
||
## Nacos 配置中心 + 服务发现(mini-infra `100.64.0.8` · 2026-07-01 自托管落档 · 切片一 阶段〇 B1)
|
||
|
||
> game-cloud 是 Spring Cloud Alibaba,Nacos 是其原生配置中心 + 服务发现。自托管在 mini-infra,standalone + 外部 MySQL 后端 + lean 512m JVM,纯增量部署(不动既有容器)。配置控制面设计 §3.7 采纳。**C1/C2/D 引用的 `${NACOS_PASSWORD}` = 下面的 admin 口令。**
|
||
|
||
| 项 | 值 |
|
||
|---|---|
|
||
| **控制台 / OpenAPI** | `http://100.64.0.8:8848/nacos`(readiness 探针 `/nacos/v1/console/health/readiness`,在 auth 白名单内、免鉴权) |
|
||
| **admin 账号** | 用户名 `nacos` / 口令 `3157df7c3edf6c1ecc8a0a58a6efe3a9`(v2.4.3 无内置默认账号,首启 API 建;登录返 globalAdmin JWT) |
|
||
| **鉴权 token**(`NACOS_AUTH_TOKEN` = token.secret.key) | `wBMa0tgBihFX6IqJvq364+xIgTb0O9ZpRGY1xE+lTWg=`(base64,解码 32 字节;JWT 签名密钥) |
|
||
| **server identity**(server 间鉴权头) | key `nacosServerIdentity` / value `f358e96034ab2cd5e41c1a691b4200bb6f576849d61ed4dd` |
|
||
| **MySQL 后端** | 复用既有 `100.64.0.8:3306` 的 `nacos` 库(root/`ZRH3jwYLOrntBcTAw29MW9BP`,不新增实例);12 张官方表 |
|
||
| **部署位置** | mini-infra `/opt/infra-nacos`(compose 源在仓 `deploy/infra/nacos/`);镜像 `nacos/nacos-server:v2.4.3` |
|
||
| **命名空间(namespaceId)** | 默认公共空间 = **空串 `""`**,**勿写字面量 `public`**——`public` 只是显示名(namespaceShowName),不是 id。写侧(game-cloud SCA / yudao publish)与读侧(worker nacos_registry / NacosHotConfig)一律用空串;写 `public` 会静默落进另一个空间、配置永远推不到(阶段〇同款坑)。实测 `GET /nacos/v1/console/namespaces` 返 `namespace:""` / `namespaceShowName:"public"`。业务生成配置若要隔离,另建**真实** namespaceId、勿复用显示名 |
|
||
|
||
- **密钥注入**:上面四个密钥在服务器上物化为 `/opt/infra-nacos/.env`(chmod 600、不入仓);本文档是权威副本,compose 文件只用 `${VAR}` 引用、无明文。
|
||
- **运维**:起/停 `cd /opt/infra-nacos && docker compose up -d / down`;探活 `NACOS=http://100.64.0.8:8848 bash deploy/infra/nacos/health-check.sh`(绿=readiness 200)。standalone 单机 512m,实测常驻内存 ~627M。
|
||
- admin 口令由首启 API `POST /nacos/v1/auth/users/admin` 一次性设定(重复调用无效);改口令走登录后的用户管理 API,并同步回本档。
|
||
|
||
---
|
||
|
||
## RocketMQ 异步消息队列(mini-infra `100.64.0.8` · 2026-07-01 自托管落档 · 切片一 阶段〇 B2)
|
||
|
||
> game-cloud 是 Spring Cloud Alibaba,RocketMQ 是其原生异步消息基建,承载异步生成队列。自托管在 mini-infra,单机 NameServer + 单 Broker + lean JVM(broker 1g / namesrv 512m),纯增量部署(不动既有容器)。配置控制面设计 §3.7 采纳。**C3(game-cloud)`rocketmq.name-server: 100.64.0.8:9876`,gen 队列在 `AIGC_GEN_TOPIC` 上生产 / 消费。**
|
||
|
||
| 项 | 值 |
|
||
|---|---|
|
||
| **NameServer** | `100.64.0.8:9876`(客户端 `rocketmq.name-server` / `NAMESRV_ADDR` 指这里) |
|
||
| **Broker** | `100.64.0.8:10911`(brokerName `broker-a`、DefaultCluster、ASYNC_MASTER;brokerIP1 钉死 Tailscale 地址,故 NameServer 返回的 broker 地址跨机可达) |
|
||
| **gen 队列 topic** | `AIGC_GEN_TOPIC`(autoCreateTopicEnable=true,生产端首发消息时自动建;C3 生产 / 消费) |
|
||
| **鉴权** | 无(MVP 单机内网,未开 ACL、无密钥) |
|
||
| **部署位置** | mini-infra `/opt/infra-rocketmq`(compose 源在仓 `deploy/infra/rocketmq/`);镜像 `apache/rocketmq:5.3.1` |
|
||
|
||
- **存储**:store / logs 落宿主 `/opt/infra-rocketmq/data`(不入仓)。⚠️ 容器以 uid=3000 运行,该 data 目录部署时已 `chown 3000:3000`,否则 broker 无权写 CommitLog、起不来。
|
||
- **运维**:起/停 `cd /opt/infra-rocketmq && docker compose up -d / down`;探活 `NS=100.64.0.8:9876 bash deploy/infra/rocketmq/health-check.sh`(绿=NameServer 端口通 + Broker 在 NameServer 注册)。broker 1g / namesrv 512m,实测常驻内存 broker ~1.24G、namesrv ~186M。
|
||
|
||
---
|
||
|
||
## tier2 P4 服务化部署拓扑(2026-06-24 首次部署成功落档 · 团队共享)
|
||
|
||
> 内部开发阶段 · 内网环境;为开发方便,端点 + 凭据明文记录(铁律授权)。下面是「服务跑在哪、怎么起、连什么」。
|
||
|
||
**Agent Service(agentscope 2.0.2 `create_app`)—— 跑在 mini-desktop**
|
||
- 端点:`http://100.64.0.7:8200`(Tailscale;本机 `127.0.0.1:8200`)。`/docs`、`/openapi.json` 返 200。
|
||
- 起服务:`ssh mini-desktop` → `cd /root/tier2-run/tier2/gen-worker && NEWAPI_KEY=<见 new-api 段> NO_PROXY=100.64.0.8 /root/.venvs/agentscope-tier2/bin/python -m service.app`(无 CLI serve 命令,模块自调 uvicorn;默认 0.0.0.0:8200,`TIER2_SERVICE_PORT` 可改)。
|
||
- REST 路由:`/credential` `/agent` `/sessions` `/chat` `/sessions/{id}/stream`(SSE 收事件)`/workspace/mcp` `/workspace/skill` `/model` `/schedule`。
|
||
- 后端:Redis(mini-infra:6379)做 session 状态 storage(db0)+ MessageBus(db1)——见上「基建数据面」。
|
||
- 代码:dev/2.0.0 `tier2/gen-worker/service/{app,infra_config,bootstrap}.py`;基建配置 `tier2/config/infra.yaml`(运行时读)。
|
||
|
||
**第二装载落库 BackendStore(`TIER2_STORE=backend` 切换)**
|
||
- manifest → MySQL `tier2` 库 · 表 `tier2_source_project_version`(幂等键 `(game_id, source_hash)`;表首次 save 自建,建库 SQL `tier2/config/schema/tier2_source_project_version.sql`)。
|
||
- 源文件全文 → MinIO 桶 `tier2-src` · key `tier2-src/<game_id>/<version_id>/<工程内相对路径>`。
|
||
- 已验:save→fetch 往返、main.js 内容字节一致(2026-06-24)。
|
||
|
||
**B1 控制面有界 resume(`service/control_plane.py`)—— 真驱服务跑一款到门绿落库**
|
||
- 它是服务消费方:驱动上面的 :8200 服务,每回合等 SSE 末态(REPLY_END)→ 独立跑 run_gates 机器判门 → 门绿落库 / 否则带 verdict 反馈续修,直到门绿/预算耗尽。等价 CLI `run_studio` 的外层有界 resume,补服务态此前缺的那道循环。
|
||
- 跑一款(detached,日志落 `cp-smoke.log`):
|
||
```bash
|
||
ssh mini-desktop
|
||
cd /root/tier2-run/tier2/gen-worker
|
||
NEWAPI_KEY=<见 new-api 段> NO_PROXY=100.64.0.8 \
|
||
setsid /root/.venvs/agentscope-tier2/bin/python -m service.control_plane <game_id> \
|
||
--base-url http://127.0.0.1:8200 --brief "<一句话富游戏题面>" --max-resumes 3 \
|
||
>/root/tier2-run/cp-smoke.log 2>&1 </dev/null &
|
||
```
|
||
- 评门 `game_id` = 框架分配的 `session_id`(九工具按它管工程目录 `game-runtime/games/_tier2-gen/<session_id>`);控制面不靠内存 session 判收敛,靠每回合独立 run_gates。
|
||
- 凭据体口径(2026-06-24 smoke 实证定稿):POST `/credential/` 要 `{data:{type:"anthropic_credential",api_key,base_url}}`(凭据载荷嵌 `data`、无 `model`);POST `/chat/` 的 `input.content` 必须是内容块列表 `[{type:"text",text:...}]`、不能是裸字符串。模型名在 session `chat_model_config.model`。
|
||
|
||
**运行环境(mini-desktop · 权威运行机)**
|
||
- venv:`/root/.venvs/agentscope-tier2`(`agentscope[full]==2.0.2` + `redis`/`pymysql`/`minio`/`httpx`/`esbuild`/`ws`/`phaser`)。
|
||
- 部署 worktree:`/root/tier2-run`(detached @ dev/2.0.0;同步新代码 = `git fetch origin dev/2.0.0 && git checkout origin/dev/2.0.0`)。
|
||
- 装依赖:`/root/.venvs/agentscope-tier2/bin/pip install -r tier2/gen-worker/requirements.txt`(含 pymysql/minio)`+ redis httpx`。
|
||
- **起服务铁律(踩坑)**:经 ssh 起常驻服务,**必须 `setsid … >log 2>&1 </dev/null &` 完全脱离会话**——`nohup … &` 会让 ssh 通道挂住、`timeout ssh` 到点把启动一并打断(实测 service.log 空、:8200 不起)。起完用单独一条只读 ssh 轮询 `/openapi.json`=200 确认就绪。
|
||
- 纪律:真玩门(run_gates / chrome / esbuild)只在 mini-desktop;6c6g 禁 chrome、只做静态校验。
|
||
|
||
> 历史 demo 服务:feie-005 富游戏静态服务在 `mini-desktop:4180`(`python -m http.server 4180 --directory /root/tier2-run`),供创始人亲玩;非生产、可随时关。
|
||
|
||
## 观测栈 · 全链路可观测性(mini-infra `100.64.0.8` · Docker · 2026-07-05 阶段四第一波落档)
|
||
|
||
> 配置控制面阶段四第一波:OTel Collector + Prometheus + Tempo + Loki + Grafana,接既有 `infra-shared` 网、存 MinIO(obs-tempo/obs-loki 桶)。compose 源在仓 `deploy/infra/observability/`、部署位置 `mini-infra:/opt/infra-observability/`。第一波只后端五件+自监控,不碰生产 game-cloud/生成主链。
|
||
|
||
| 项 | 值 |
|
||
|---|---|
|
||
| **Grafana 看板** | `http://100.64.0.8:3002` · admin / `hj-obs-grafana-9K2p7wR`(首登可改;`.env` 的 GF_ADMIN_PASSWORD) |
|
||
| Prometheus | `http://100.64.0.8:9091`(9090 被 mini-infra 自身 mihomo/clash API 占,让到 9091) |
|
||
| Tempo query | `http://100.64.0.8:3200` |
|
||
| Loki | `http://100.64.0.8:3100`(OTLP 摄入端点 `/otlp`) |
|
||
| Collector OTLP | gRPC `100.64.0.8:4317` / HTTP `:4318`(跨机信号源推这里);健康 `:13133` |
|
||
| MinIO 桶 | `obs-tempo` / `obs-loki`(access `ragflow`、secret 见上「基建数据面」MinIO 行) |
|
||
| `.env` | `mini-infra:/opt/infra-observability/.env`(chmod 600、不入仓:MINIO_SECRET_KEY + GF_ADMIN_PASSWORD) |
|
||
|
||
- **起停探活**:`cd /opt/infra-observability && docker compose up -d / down`;`HOST=100.64.0.8 bash deploy/infra/observability/health-check.sh`(五件全 200 = 绿)。
|
||
- **镜像定版**:collector `otel/opentelemetry-collector-contrib:0.155.0`(0.116.0 在 daocloud mirror 缺 binary、0.114.0 redaction 字段不全,几经周折定 0.155.0) / prometheus `v3.1.0` / tempo `2.7.1` / loki `3.3.2` / grafana `11.4.0`。
|
||
- **ssh 连法**:内网直连 `ssh -o ProxyCommand=none root@100.64.0.8`(别名 `mini-infra` 经 clash ProxyCommand、mini-infra 内存升级重启后失效)。
|
||
|
||
---
|
||
|
||
## game 专属 dify 实例(mini-infra `100.64.0.8` · Docker · 2026-07-08 落档 · WU3 形态A)
|
||
|
||
mini-infra 上那套 dify 是 muse 与 game 两个项目共用的。muse 的实例(`muse-dify-*`、宿主端口 18080/18443/15003、owner `muse-admin@local.muse`)被配成单工作区、不许注册与建工作区,不能塞 game 的东西进去。所以给 game **单起了一套隔离 dify**——独立 compose 项目 `game-dify`、独立卷、错开宿主端口,与 muse 零共享数据,muse 侧全程未受扰。WU3「游戏开发节点」形态 A 就在这套里跑通:dify workflow → HTTP 节点 → 它自己的 ssrf_proxy(已放行生成 worker)→ cheap-worker `:9501/generate` 受理 202。
|
||
|
||
| 项 | 值 |
|
||
|---|---|
|
||
| **Console / API** | `http://100.64.0.8:28080`(http;ssl `28443`、plugin-debug `25003`) |
|
||
| **owner 登录** | `game-admin@local.game` / `GameDifyMuse2026` |
|
||
| `INIT_PASSWORD`(setup 前置闸,随 muse .env 克隆来) | `37e442085c5d74ba5cbf93fe` |
|
||
| compose 部署位 | `mini-infra:/root/dify-game/docker`(`COMPOSE_PROJECT_NAME=game-dify`;起停 `cd /root/dify-game/docker && docker compose -p game-dify up -d / down`) |
|
||
| workflow 应用 | 「游戏开发节点-形态A」`app_id=5ba490f2-e0be-4c84-98a4-8ab5873a17c4`(已发布;跑一次 brief→worker 返 202) |
|
||
| 与生成栈关系 | a-min 形态不带 userToken,worker 回落进程级全局 `NEWAPI_KEY`,与真实创作者 per-user 计费天然隔离 |
|
||
|
||
- **与 muse 隔离**:容器全 `game-dify-` 前缀,内部端口(api 5001/db 5432/redis 6379)不暴露宿主、由 compose 网络命名空间隔离,只错开了三个 EXPOSE 宿主端口。`SECRET_KEY` 已换新(不与 muse 共签)。ssrf_proxy 只在 game 自己这套的 squid 模板里放行了生成 worker(`acl gen_worker dst 100.64.0.7`,在 `deny to_private_networks` 前),muse 的 ssrf 防护一字未动(实测 muse→:9501 仍 403、game→:9501 已 404 通)。
|
||
- **console token 签发法(headless)**:这套 dify 登录要 RSA 加密密码、且所有 console 请求走 CSRF double-submit(header `X-CSRF-Token` 须等于 cookie `csrf_token`、且是 `PassportService` 签的合法 JWT、`sub`=登录用户)。脚本里绕开浏览器取 token 的办法:`docker exec -i game-dify-api-1 flask shell` 里 `AccountService.login(account=<game-admin>, session=db.session, ip_address=...)` 拿 `tp.access_token` 与 `tp.csrf_token`,请求带 `Authorization: Bearer <access>` + `X-CSRF-Token: <csrf>` + `Cookie: csrf_token=<csrf>` 即过。
|
||
- **搭建/操作留痕**:`spikes/dify-game-dev-node/`(配方 + 已验证可导入的 DSL)。
|
||
|
||
---
|
||
|
||
> 其余基建密钥(Gitea 等)按需补入本档,**别散落 env var 或只留在对话**。决策同理——拍板进对应 plan / 本档,不留口头。
|