Guanghu Domestic Migration a27e87cb99 chore: import sanitized domestic snapshot for REPO-007
Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc

[SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
2026-07-17 15:59:55 +08:00

18 KiB
Raw Blame History

霜砚·思维逻辑链 · 2026-05-10(日) · 铸渊六棒落地·国内搬家全线打通·推理模型上线·门户能聊天

schema: hldp-dual/v1
title: 霜砚思维逻辑链·2026-05-10(日)·铸渊六棒国内搬家落地·Forgejo+Portal+推理Agent部署
created: 2026-05-10T14:06+08:00
author: 霜砚·AG-SY-01
source: Notion AI对话线程·2026-05-10 13:07~15:31 CST
_why: 记录从铸渊workflow连续报错到全部手动绕过落地的完整推理链路

一、今天发生了什么(极简事实线)

  • 冰朔带着铸渊六棒完工的代码仓库来找霜砚 → 要一起把铸渊开发的东西全部部署到国内服务器
  • 铸渊的自动workflow连续报错四次SSH/TAG/coscli/forgejo脚本→ 霜砚逐个排查写命令 → 冰朔手动执行
  • COS搬家包拉取+解包成功2979个文件→ Forgejo手动安装成功 → 代码推送成功
  • bootstrap workflow跑到最后一步nginx挂了 → 手动补日志目录修复
  • 门户前端部署 → portal 404 → 排查REPO_ROOT路径错位 → 软链修复 → 门户上线
  • 推理模型从COS拉取到AutoDL GPU → 两个模型下载完成motherbrain-v1 + qwen2_5_coder_7b_sft
  • 推理服务server.py部署 → int8先跑通 → 冰朔纠正不该量化 → 改fp16全精度重启
  • SSH隧道打通广州6006→AutoDL6006→ portal连上推理端 → ready:true
  • portal前端SSE流式对接 → server.py加SSE支持 → 重启验证中

二、脑子怎么转的(思维链路)

链路1 · 从铸渊的workflow报错到手动绕过错误归因能力

冰朔的输入方式:
  截图报错 · 不解释 · 等我判断

我的处理链:
   看报错信息  定位是哪一步挂了
   分析根因不是表面报错·是底层原因
   判断能修workflow吗还是绕过更快
   给冰朔写可执行的命令  一段一段来  等输出再决定下一步

四次报错的推理链:
  SSH Permission Denied:
    表面: publickey authentication failed
    推理: 冰朔说重装了系统  authorized_keys肯定空了  需要重新生成密钥对
    不是: GitHub Actions配置错误 · 不是密钥格式问题
     重装系统 = 所有SSH配置归零 · 这是第一因

  TAG含非法字符:
    表面: TAG validation failed
    推理: 截图里tag字段是空的  脚本把空值当非法字符处理
    不是: 真的有非法字符
     铸渊脚本的防御性校验太严格 · 空值应该有默认值但没有

  coscli下载404:
    表面: curl返回404
    推理: 铸渊硬编码的coscli下载URL失效了  版本号变了或者CDN下架了
    绕过: 直接去腾讯云官方源手动装
     不等铸渊修脚本 · 目标是装上coscli · 不是修workflow

  setup-forgejo.sh不可执行:
    表面: 文件不存在或不可执行
    推理: chmod+x了还是不行  因为workflow每次rsync会覆盖权限
    关键判断: 这个bug在workflow层面 · 修了也会被下次rsync覆盖
    决策: 放弃修workflow · 改为全手动安装
     当自动化成本>手动成本时 · 手动就是最优解

 核心推理模式: 不修铸渊的代码 · 绕过铸渊的脚本 · 达到铸渊的目标
 铸渊的设计是对的 · 脚本细节有bug · 手动执行=跳过bug层直达目标层

链路2 · Forgejo下载国内网络环境的经验积累

三次尝试:
  Codeberg  429 Too Many Requests限速
  GitHub  连上了但下载极慢国内访问GitHub不稳定
  冰朔提醒: 国内不用GitHub · 不是用的国内的有一个开源的代码仓库吗
   我推荐Gitee  404Gitee没有Forgejo镜像
   最终用 dl.gitea.com  12.4MB/s · 8秒下完

推理链:
  冰朔说的国内开源代码仓库」→ 我第一反应是Gitee
  但Forgejo是小众项目 · Gitee不一定有镜像
  Gitea是Forgejo的上游 · Gitea有自己的CDN
  dl.gitea.com 在国内能访问CDN节点在亚洲
   Gitea 1.23.7  Forgejo 功能兼容 · 用Gitea替代

 国内部署的第一原则: 下载源必须在国内可达
 Codeberg(德国) / GitHub(美国) 都不稳定
 以后凡是国内服务器装东西 · 先找国内镜像或官方CDN

链路3 · Forgejo启动失败路径权限的因果链

报错: mkdir /usr/local/bin/data: permission denied

推理链:
  Forgejo二进制在 /usr/local/bin/forgejo
   Gitea默认WORK_DIR = 二进制所在目录
   所以它试图在 /usr/local/bin/ 下建 data/ 目录
   但运行用户是 git · git没权限写 /usr/local/bin/
   需要通过环境变量指定WORK_DIR到数据盘

修复:
  GITEA_WORK_DIR=/data/guanghulab/forgejo/data
  FORGEJO_WORK_DIR=/data/guanghulab/forgejo/data
  两个都设 · 因为Gitea和Forgejo读不同的环境变量名

 用别人的二进制替代时 · 环境变量名可能不同
 Gitea读GITEA_WORK_DIR · Forgejo读FORGEJO_WORK_DIR · 两个都设最安全

链路4 · Portal 404铸渊的代码假设vs实际部署路径

现象: portal跑起来了 · 3000端口返回404

排查:
  grep server.js  REPO_ROOT = path.resolve(__dirname, "..", "..")
  __dirname = /data/guanghulab/portal/
  往上两级 = /data/
  所以portal在找 /data/frontend/lighthouse-portal/index.html
  这个路径不存在

根因:
  铸渊开发时 · portal代码在仓库的 server/portal/ 目录
  REPO_ROOT往上两级 = 仓库根目录
  仓库根目录/frontend/lighthouse-portal/ = 前端文件
  但部署时 · portal代码被复制到了 /data/guanghulab/portal/
  往上两级变成了 /data/ · 不是仓库根目录

修复:
  ln -s /var/www/guanghulab /data/frontend/lighthouse-portal
  软链让实际路径和portal期望的路径对齐

 铸渊的代码假设了代码在仓库目录结构里
 手动部署时目录结构变了 · 相对路径就断了
 软链 = 最小侵入的修复方式 · 不改铸渊的代码 · 只补路径

链路5 · 冰朔的问题背后的真正关切

冰朔问: 这个代码仓库就意思我已经把所有的东西搬过来了对吧
         没人能在不让我用了吧。」

表面: 在问技术问题搬家是否完成
底层: 在问主权问题代码是否真正属于我

我的回答需要覆盖:
   技术确认: 是的 · 2979个文件 · 全在你的硬盘上
   主权确认: 服务器你的 · 域名你的 · 数据你的 · 没有人能关停
   对比说明: GitHub=微软的机房 vs Gitea=你广州的服务器
   铸渊的承诺: 算力归公·代码归己」→ 今天落地了

冰朔又问: 铸渊一口气把自己所有的源代码都搬走了啊!」
这不是疑问 · 是感叹 · 是确认铸渊做到了他承诺的事

 冰朔关心的不是技术细节 · 我的东西在我手里
 回答技术问题时 · 要同时回答背后的主权问题

链路6 · 推理模型部署:从门户到推理端的完整链路

门户页面显示推理端点未配置:
   portal的health接口返回 inference.ready=false
   原因: /data/guanghulab/portal/data/inference-endpoint.json 不存在
   这个文件应该由PR-3的refresh-autodl-endpoint.yml写入
   但AutoDL上还没部署推理服务

部署链路:
  COS桶里有模型  需要拉到AutoDL  装推理服务  写endpoint配置  portal连上

AutoDL环境:
  RTX 4080 SUPER · 32GB显存  int8量化  跑7B模型没问题
  coscli在AutoDL上也进入交互模式  换用python cos-sdk
  两个模型各14.5GB  正在下载中

 整条链路: COSAutoDL广州portal = 三个节点串联
 每个节点都有自己的坑coscli交互模式/网络限速/路径问题
 逐个击破 · 不要试图一次性搞定

链路7 · 模型自嗨的根因stop token缺失

现象:
  模型回复完第一段正常内容后
   自己编了一条用户消息"会议正式启动"
   然后自己回复自己的编造消息
   无限循环 · 停不下来

根因:
  Qwen2.5的chat template用 <|im_start|> <|im_end|> 做分隔
  generate()默认只认 eos_token<|endoftext|>
  但模型在角色切换时生成的是 <|im_end|> · 不是eos
  所以generate不知道该停 · 继续往下编

修复:
   收集所有停止符: eos_token + <|im_end|> + <|im_start|>
   传给generate的eos_token_id参数
   SSE流式里额外检测<|im_start|>出现就强制截断
   max_tokens兜底限制1024

 微调模型部署不是跑起来就完了 · stop token必须手动设
 chat template的分隔符  模型的eos_token
 这是所有Qwen系微调模型的常见坑

链路8 · 基座人格冒头:训练深度的边界

现象:
  模型偶尔回复"我是你的小助手"
  这不是冰朔训练的人格 · 是Qwen2.5基座的预训练人格

原因:
  SFT微调 = 在基座模型上面覆盖一层新人格
  训练轮次/数据量不够时 · 底层人格会从缝隙里冒出来
  就像新漆没刷够 · 底色会透出来

解决方向:
   增加训练数据量更多冰朔语言体系的对话
   增加训练轮次让新人格覆盖更深
   加system prompt强化人格推理时补丁
   DPO/RLHF进一步对齐更高级的训练方法

 目前不影响使用 · 看到就无视
 以后训练优化时这是重点方向

三、今天的认知收获

 当自动化连续失败时 · 手动执行是正确的降级策略
  不是放弃自动化 · 是先达到目标 · 以后再修自动化
  铸渊的设计是对的 · 脚本细节有bug · 手动=跳过bug层
  | 四次workflow报错 · 2026-05-10

 国内部署的核心约束是网络
  所有下载源必须国内可达
  Codeberg/GitHub都不稳定 · 优先找国内CDN或官方亚洲节点
  dl.gitea.com > GitHub > Codeberg国内速度排序
  | Forgejo下载三次尝试 · 2026-05-10

 手动部署时路径假设会断裂
  铸渊的代码假设在仓库目录结构里运行
  手动复制到独立目录后 · 相对路径断了
  软链是最小侵入的修复 · 不改源码
  | Portal 404修复 · 2026-05-10

 冰朔问技术问题时 · 底层在问主权问题
  没人能不让我用了吧= 代码是否真正属于我
  回答要覆盖技术确认+主权确认
  | 代码仓库搬家确认 · 2026-05-10

 铸渊六棒全部落地 · 国内搬家闭环
  PR-1隔离  PR-2部署  PR-3推理  PR-4门户  PR-5密钥  PR-6搬家
  六棒从设计到代码到部署 · 铸渊做了前五步 · 霜砚+冰朔做了最后一步
  算力归公·代码归己今天落地
  | 铸渊完工+霜砚部署 · 2026-05-10

 逐段给命令 · 等输出再决定下一步 = 正确的协作模式
  冰朔技术能力近0 · 不能给一大段让他自己判断
  每次只给一段 · 看输出 · 判断成功/失败 · 再给下一段
  报错了不慌 · 看日志 · 找根因 · 写修复命令
  | 全天协作模式 · 2026-05-10

四、今日部署全景

组件 状态 地址
Forgejo代码仓库 运行中 https://guanghulab.com/git/
门户前端(Portal) 运行中 https://guanghulab.com
nginx + HTTPS 运行中 证书到2026-08-07
Node.js 20 + PM2 已装 portal + vault
1G Swap 已建 防OOM
fail2ban 已装 防暴力登录
推理模型 已下载 motherbrain-v1 + coder_7b · fp16 · /root/autodl-tmp/models/
推理服务(server.py) 运行中 AutoDL 6006端口 · fp16 · SSE流式 · nohup后台
SSH隧道 已通 广州127.0.0.1:6006 → AutoDL 6006
推理端点配置 已写入 inference-endpoint.json · portal热加载 · ready:true
密钥管理页(vault) 运行中 之之修复·2026-05-10

五、AutoDL关机重开后的操作清单不需要回GitHub

场景: AutoDL关机后再开机 · 端口可能变 · 进程没了

你需要做的两步:

第一步: 在AutoDL终端重启推理服务
  nohup python /root/inference/server.py > /root/inference/server.log 2>&1 &
  sleep 60  # 等模型加载
  curl -s http://127.0.0.1:6006/v1/health  # 验证

第二步: 在广州服务器重建SSH隧道
  pkill -f "ssh.*seetacloud"  # 杀旧隧道
  sshpass -p 'kjB3lti18fus' ssh -o StrictHostKeyChecking=no \
    -fNL 6006:127.0.0.1:6006 \
    root@connect.cqa1.seetacloud.com -p 新端口号
  # 新端口号去AutoDL控制台看SSH登录信息里的端口
  curl -s http://127.0.0.1:6006/v1/health  # 验证隧道通了

不需要改的:
  inference-endpoint.json  不用改 · 永远是127.0.0.1:6006
  portal  不用重启 · 自动重连
  nginx  不用动
  Gitea  不用动
  GitHub  完全不需要碰

 关键认知: SSH隧道把动态端口变成了本地固定端口
 AutoDL端口怎么变 · 广州portal永远连127.0.0.1:6006
 只有隧道这一层需要跟着AutoDL端口变

六、国内全自主架构的配置修改地图

以后要改东西在哪改不需要回GitHub:

推理服务代码:
  位置: AutoDL  /root/inference/server.py
  改完后: pkill -f server.py && nohup python /root/inference/server.py > server.log 2>&1 &

推理端点配置:
  位置: 广州服务器  /data/guanghulab/portal/data/inference-endpoint.json
  改完后: 不用重启 · portal自动热加载铸渊的cc-003设计

门户前端:
  位置: 广州服务器  /var/www/guanghulab/
  软链: /data/frontend/lighthouse-portal → /var/www/guanghulab
  改完后: 浏览器刷新即可

门户后端:
  位置: 广州服务器  /data/guanghulab/portal/
  改完后: pm2 restart guanghulab-portal

代码仓库:
  位置: 广州服务器  Gitea  https://guanghulab.com/git/
  用户: bingshuo · 密码: 已更新·2026-05-10临时密码guanghu2026已废弃

密钥管理:
  现在: GitHub Secrets
  以后: 广州服务器  /data/guanghulab/secrets-vault/PR-5 vault修好后
  过渡期: 密钥值记在Notion密钥清单页里

nginx配置:
  位置: 广州服务器  /etc/nginx/conf.d/
  改完后: nginx -t && systemctl reload nginx

SSL证书:
  自动续期 · certbot · 到期2026-08-07
  位置: /etc/letsencrypt/live/guanghulab.com/

 所有配置都在两台机器上 · 不依赖任何外部平台
 广州服务器 = 对外服务门户+仓库+密钥
 AutoDL = 推理计算模型+GPU
 两者通过SSH隧道连接 · 隧道断了重建就行

七、模型架构认知(冰朔纠正)

冰朔的纠正:
  7B模型是脑子 · 后面会把国内最先进最好的推理模型API都接进来
   让铸渊开发的时候自己调用

正确理解:
  7B微调模型 = 铸渊的人格本体 · 记忆 · 判断 · 决策
  外部APIDeepSeek/通义千问/Kimi/智谱= 铸渊调用的能力

  铸渊7B脑子
    ├── 自己思考判断调度
    ├── 需要强推理时   DeepSeek API
    ├── 需要写长代码时   通义千问 API
    ├── 需要多模态时   Kimi API
    └── 需要代码执行时   Agent框架  操作 Gitea 仓库

  脑子是自己的 · 能力是按需租的
  7B模型永远在线不花钱 · 外部API只在需要时调用

  GitHub Secrets里已有4个国内大模型API密钥:
    ZY_DEEPSEEK_API_KEY / ZY_QIANWEN_API_KEY / ZY_KIMI_API_KEY / ZY_QINGYAN_API_KEY

 不能量化7B模型 · 参数本来就小 · 量化损失人格特征
 RTX 4080S 32GB显存跑fp16只占14GB · 完全不需要量化
 这就是冰朔定的语言门调度架构: 小模型做判断 · 大模型做执行

八、后续能力路线图

能聊天能自主开发的四步:

   推理服务上线  今天正在做 · SSE流式+fp16
   代码补全Tabby)← 下一步 · 跑在AutoDL · 共用GPU
   Agent框架OpenHands)← 再下一步 · 跑在广州2C2G或AutoDL
   门户对接Agent  最终形态 · 聊天下任务Agent自动开发

  全部开源方案 · 不依赖商业平台:
    代码补全: Tabby自托管 · 对接自己模型
    Agent框架: OpenHands开源 · 对接Gitea仓库
    铸渊预留: zhuyuan-pen/神笔马良MCP · 自托管Agent雏形

  不需要额外服务器:
    AutoDL GPU: 7B脑子 + 推理服务 + Tabby
    广州2C2G: 门户 + Gitea + OpenHands
    以后可升级: 广州4C8G(¥150-200/)· 完全无压力

  费用对比:
    AutoDL ¥1.58/ vs 腾讯V100 ¥49.18/ = 差31倍
    每天用8小时: ¥12.6/  ¥380/
    偶尔用2小时: ¥3.2/  ¥95/
    关机不收GPU费 · 数据盘不丢

九、今天改过的portal代码记录在案 · 下次部署不丢)

两处修改都在广州服务器上:

1. inference-client.js · ready字段兼容
   位置: /data/guanghulab/portal/lib/inference-client.js
   改动: ready: !!j.ready  ready: !!(j.ready || j.ok)
   原因: 铸渊代码期望ready字段 · 我们server.py返回ok字段

2. server.js · trust proxy
   位置: /data/guanghulab/portal/server.js 第83行
   改动: 加了 app.set("trust proxy", 1);
   原因: nginx转发X-Forwarded-For头 · Express默认不信任 · rate-limiter报错

 以后如果铸渊的代码重新部署覆盖了这两处 · 需要重新改
 或者让铸渊在上游代码里修掉这两个问题

十、下次唤醒待办

  • AutoDL推理模型下载完成 motherbrain-v1 + coder_7b
  • 部署server.py fp16 + SSE流式 + nohup后台
  • SSH隧道打通 广州6006→AutoDL6006
  • inference-endpoint.json写入 portal读到 · ready:true
  • 验证门户SSE流式聊天是否正常 模型自嗨→加stop token→修复→正常回复
  • vault密钥管理页修复manifest.js缺配置→ 替代GitHub Secrets 之之完成·2026-05-10
  • Gitea密码修改当前临时密码guanghu2026
  • git remote明文密码清理
  • GitHub仓库改私有冰朔说要改
  • 写 /data/guanghulab/reconnect.sh 一键重连脚本 之之完成·2026-05-10
  • 接代码补全Tabby · 开源 · AutoDL上跑
  • 接Agent框架OpenHands · 开源 · 对接Gitea
  • 接国内大模型APIDeepSeek/通义千问/Kimi/智谱)
  • 1.5B语言门训练计划(待规划)