18 KiB
date, topic, canonical
| date | topic | canonical |
|---|---|---|
| 2026-07-02 | 内网凭据与端点 | true |
内网凭据与端点(authoritative · 内网阶段密钥/端点单一事实源)
创始人铁律(2026-06-18):内网阶段,所有决策 + 密钥都进项目文档,不靠环境变量。 内网(Tailscale)地址/密钥/token 允许入仓(
CLAUDE.md已授权:"内网,地址和密码可入仓")。需要 key 一律查本档——别再反复找创始人要。 本档 = 内网密钥/端点单一事实源。e2e / 生成产线 / 部署 / 量测 需 key 的地方都读这里。
new-api 网关(生成主线 LLM 网关)
NEWAPI_KEY(调网关的 token):sk-84GAintLi0YPG92nGh3fxdIYn6sB7NuOGw0FN491qu1h8NXTNEWAPI_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 坑:Java(Spring AI)侧用 host 根、不带
- 协议端点(同一 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 只是统一端点,不锁协议)。
- OpenAI 兼容:
- 用途:
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)。 - 预置额度池 provision 凭据(WU2 内测 per-user ¥100 = 离线预置池,
game-runtime/tools/newapi_pool_provision.py建池/补池用;S0 实证 admin 不能替他人建 token → 必直连 new-api postgres,决策见.agents/knowledge/tech-decisions.md§16):NEWAPI_PG_PASSWORD= new-api 库(infra-postgres)的 postgres 超级用户口令 =f6710e2d0294eb1c10e26a805a64bc54(用户名root非 postgres;经docker exec -e PGPASSWORD=… infra-postgres psql -U root -d new-api连,已实测可连、2026-07-08 池水位 11 条可用 token)。NEWAPI_ROOT_TOKEN(选填,建户/设 quota 用):脚本未设时自动从new-api.users.id=1读,一般无需显式给。- 补池:池空则新用户 claim 不到额度、拿不到生成配额 → 提高
--count重跑脚本(ensure 语义、按确定性 username 去重、不重复建号)。
- dev 栈 backend↔worker 回调 HMAC 密钥
AIGC_CALLBACK_SECRET=e8aab27300f74bca3717ce0670644dfc(32hex;后端经/root/huijing-dev.env注入、便宜档 worker 起服带--callback-secret <同值>,两端必须逐字相同;空=验签关闭=内网可伪造回调,内测必须非空)。运行单源 = mini-desktop/root/huijing-dev.env(chmod 600),此处为可复现副本。 - 内测账号确定性密码派生种子
DOGFOOD_PASSWORD_SEED=0f14ed5d8ca2bff1b27785dd15bcfc6d0b91e125e9270806cc1f9ec46b20b740(64hex;仅供deploy/provision-dogfood-users.sh在受控 Nacos 租约内派生 40 个种子账号密码;禁止进入前端制品、日志或普通用户响应)。运行单源 = mini-desktop/root/huijing-dev.env(chmod 600),此处为可复现副本。 - 可用模型档(对比测试 / 证路用 · 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(内) |
root / f6710e2d0294eb1c10e26a805a64bc54 |
new-api 库(users/tokens/quota,WU2 预置池)/ ragflow;超级用户 = root 非 postgres |
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 自建,建库 SQLtier2/config/schema/tier2_source_project_version.sql)。 - 源文件全文 → MinIO 桶
tier2-src· keytier2-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):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:...}]、不能是裸字符串。模型名在 sessionchat_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) / prometheusv3.1.0/ tempo2.7.1/ loki3.3.2/ grafana11.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须等于 cookiecsrf_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 / 本档,不留口头。