ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

OpenHanako 云端化实录:frp 内网穿透 + 任务代理 + WebDAV,附踩坑速查表

2026/8/4 23:55:06 拓冰建站 浏览量
OpenHanako 云端化实录:frp 内网穿透 + 任务代理 + WebDAV,附踩坑速查表 OpenHanako 云端化实录frp 内网穿透 任务代理 WebDAV附踩坑速查表作者燃烧的箫日期2026-08-03环境Windows Server 云主机2C2G 开发机WindowsRTX3060 鸿蒙手机你将得到什么读完这篇文章你将收获一台7×24 在线的私人 AI 助手OpenHanako 部署在云主机记忆私有一条加密隧道frp stcp让公司、家里、手机三端安全访问一个手机能浏览的文件服务WebDAV工作台像网盘一样随时看十几个真金白银换来的坑cmd 批处理、鸿蒙保活、Caddy 版本……全套折腾下来约一个周末。内容基于真实搭建经历每一步都可复现。一、为什么需要云端 AI 调度中枢如果你手里有一台吃灰的云主机比如我2 核 2G 两年期又日常重度使用 AI 助手这篇文章可能对你有用。我的诉求很简单无论在公司还是家里都能随时跟我的 AI 助手对话并且它能帮我在不同网络环境里干活。在公司AI 助手要能触达公司内网资源、调用开发机的 GPU在家里躺床上用手机就能跟同一个 AI 助手聊记忆无缝衔接核心矛盾AI 助手跑在哪记忆怎么统一答案是把 AI 助手搬到云主机上作为唯一驻地开发机和手机都通过隧道连它。二、基石OpenHanako 简介OpenHanako项目名 HanaAgent是一个开源的个人 AI AgentApache 2.0 协议GitHub 5.7k stars支持 macOS / Windows / Linux。它和 ChatGPT 网页版最大的区别特性说明记忆长期记忆 细节记忆记得你说过的事人格人格自定义可自由塑造每个 Agent 独立工具读写文件、执行命令、浏览网页、搜索、截图操作你的电脑技能兼容 Skills 生态可自主学习新技能多 Agent创建多个 Agent各有独立记忆和人格可协作多平台接入同一个 Agent 可接入 Telegram / 飞书 / QQ / 微信移动端 PWAServer 托管/mobile/PWA手机浏览器直接访问桌面远程端另一台桌面端可通过 LAN URL access key 连接同一 Server数据私有所有数据存在自己的机器上~/.hanako不上传第三方关键能力OpenHanako 采用 Server 架构Agent 引擎跑在 Server 所在机器各种前端桌面端、PWA、远程桌面端都只是 UI。这意味着把 Server 放在云主机上 Agent 就在云端记忆天然统一。注意正因为引擎在 Server 侧开发机连上云主机后执行命令跑在云主机而非开发机——这个后面会详细说它是整个架构设计的转折点。三、架构总览手机家里开发机公司云主机Agent 唯一驻地stcp 隧道stcp 隧道OpenHanako Server记忆引擎工作台frps 隧道服务端 :7000云主机 frpcstcp 服务端 访客端Caddy WebDAV :8080frpc 客户端任务代理服务 :9000frp-Android若 mermaid 图未渲染以上方文字拓扑为准。stcp 链路实际是各端 frpc 主动连 frps再由云主机上的 frpc同时扮演 stcp 服务端与访客端转发到本地 HA / Caddy并经访客端反向取开发机上的任务代理服务。云主机OpenHanako ServerAgent 唯一驻地 frps隧道服务端 CaddyWebDAV 文件服务开发机frpc 客户端 任务代理服务FastAPI供云主机远程调用执行重活手机frp-Android 客户端PWA 访问四、分步教程第一步云主机部署 OpenHanako在云主机下载 OpenHanako Windows 版安装包正常安装首次启动配置语言、名字、模型供应商OpenAI 兼容 API key Base URL、三个模型开启局域网访问设置 → 访问与设备 → 局域网访问 → 开启记录访问地址手机端http://IP:端口/mobile电脑端http://IP:端口/desktop验证本机浏览器打开http://127.0.0.1:端口/desktop能出界面即部署成功。部署提示首次安装需要图形界面配置向导、开启局域网访问。如果公司网络封了 3389RDP用云厂商的网页版 VNC 控制台完成部署日常访问再走 frp 隧道。第二步打通 frp 隧道核心为什么用 frp直接公网访问http://IP:端口/mobile/时公司网络会掐掉 WebSocket 长连接页面能开但一直转圈判定为上网行为管理系统对明文 HTTP/WS 的干扰。而 frp 走加密二进制协议公司网络放行。frpFast Reverse Proxy是成熟的内网穿透工具我们用stcpsecret tcp模式——端口不暴露公网靠预共享密钥匹配安全。请使用 0.69.1 或更新稳定版当前最新 v0.70.1。2.1 云主机frps 服务端下载 frp 到云主机C:\frp_0.69.1_windows_amd64配置frps.tomlbindPort 7000 auth.method token auth.token 换成你的强随机token log.to ./frps.log log.level info log.maxDays 7启动frps.exe -c frps.toml验证frps.log出现frps started successfully即成功。2.2 云主机frpc 客户端暴露 HanaAgent云主机再跑一个 frpc把本机的 OpenHanako 端口注册成 stcp 服务frpc.tomlserverAddr 127.0.0.1 serverPort 7000 auth.method token auth.token 换成你的强随机token loginFailExit false [[proxies]] name hana-server type stcp secretKey 换成你的stcp密钥 localIP 127.0.0.1 localPort 端口loginFailExit false很重要开机时网络未就绪默认 true 会让 frpc 直接退出加这个参数它会持续重试。2.3 开发机frpc 客户端访问云主机开发机 frpc.toml用 visitor 访问云主机的 hana-serverserverAddr 云主机公网IP serverPort 7000 auth.method token auth.token 换成你的强随机token loginFailExit false [[visitors]] name hana-visitor type stcp secretKey 换成你的stcp密钥 serverName hana-server bindAddr 127.0.0.1 bindPort 端口验证开发机浏览器打开http://127.0.0.1:端口/mobile/能出登录页即隧道通了。2.4 手机frp-Android手机装 frp-Androidfrpc 客户端同样配置 stcp visitor 访问 hana-server。我的手机是鸿蒙 4.2兼容安卓 APK安装 arm64 版。版本兼容性frp 从 0.52 起才支持 TOML 配置。确认 frp-Android 内置内核 ≥ 0.52应用内可查看否则 TOML 配置不生效。当前 frp-AndroidAceDroidX 版构建时默认拉取最新 frp 内核一般没问题。同样建议配置loginFailExit false应对开机时网络未就绪。frp-Android 没有配置文件在 GUI 里新建代理新建配置 → 类型选stcp visitorserverName 填hana-server与云主机 proxy 名一致secretKey 填与云主机一致的 stcp 密钥bindPort 填与桌面端 visitor 相同的端口如 38084保存并启动验证手机浏览器打开http://127.0.0.1:bindPort/mobile/能出登录页即隧道通了。第三步记忆全量迁移开发机积累了几年记忆会话、长期记忆、置顶记忆要整体搬到云主机。分步做打包开发机压缩~/.hanako即C:\Users\用户名\.hanako整个目录我的是 4.5GB压缩后 1.8GB起 HTTP 服务开发机执行python -m http.server 8888起在打包文件所在目录云主机拉取云主机通过 frp 隧道下载http://127.0.0.1:7445/hanako.zip这一步需要一条临时的 frp 隧道和第四步方向相同开发机是服务方云主机是访问方开发机 frpc.toml 增加[[proxies]] name file-transfer type stcp secretKey 换成传输用stcp密钥 localIP 127.0.0.1 localPort 8888 # 开发机本地 HTTP 服务端口云主机 frpc.toml 增加[[visitors]] name file-transfer-visitor type stcp secretKey 换成传输用stcp密钥 serverName file-transfer bindAddr 127.0.0.1 bindPort 7445 # 云主机本地访问端口对应 http://127.0.0.1:74458888 是开发机起 HTTP 服务的端口7445 是它在云主机侧映射出的端口两者通过 stcp 隧道对接。覆盖解压覆盖云主机~/.hanako重启 OpenHanako校验用Get-FileHashPowerShell对比两端压缩包的 SHA256确保传输完整安全提醒python -m http.server监听 0.0.0.0含全部私密记忆的压缩包会在内网短暂暴露传输完立即关闭该服务。清理迁移完成后删除开发机和云主机 frpc.toml 里的 file-transfer 相关配置proxy visitor避免遗留不再使用的隧道。版本一致性OpenHanako 迭代极快。迁移前把云主机版本升到与开发机一致覆盖前先备份云主机原始数据目录。第四步任务代理服务让云主机指挥开发机关键认知OpenHanako 引擎在 Server 侧开发机连上云主机后执行命令跑在云主机不是开发机。要让开发机的 GPU 和内网能力被用上需要任务代理服务。开发机跑一个 FastAPI 服务Python 3.11conda 环境反向通过 frp 暴露给云主机注意这一步隧道方向和第二步相反开发机 frpc.toml 增加[[proxies]] name dev-agent type stcp secretKey 换成任务代理的stcp密钥 localIP 127.0.0.1 localPort 9000云主机 frpc.toml 增加[[visitors]] name dev-agent-visitor type stcp secretKey 换成任务代理的stcp密钥 serverName dev-agent bindAddr 127.0.0.1 bindPort 9000云主机 frpc 可以同时声明多个 proxy 和 visitor如 hana-server、dev-agent-visitor以及第五步将加的 workspace-files互不冲突。它同时扮演 stcp 服务端被访问方和访客端访问方双重角色这是 stcp 架构的关键点。任务代理接口设计都是踩过的坑云主机 Agent ──frp stcp── 开发机 FastAPI 服务127.0.0.1:9000 ├── /api/exec 执行命令 ├── /api/exec/async 异步长任务 ├── /api/files/* 文件读写 └── /api/process/* 进程管理最小骨架Python 3.11 FastAPI重点是统一鉴权fromfastapiimportFastAPI,Depends,Header,HTTPException appFastAPI(titleTask Agent)API_TOKEN换成你的API密钥defrequire_auth(authorization:strHeader(None)):ifnotauthorizationorauthorization!fBearer{API_TOKEN}:raiseHTTPException(status_code401,detailunauthorized)app.post(/api/exec,dependencies[Depends(require_auth)])asyncdefexec_cmd(payload:dict):importsubprocess procsubprocess.run(payload[cmd],shellTrue,capture_outputTrue,textTrue,timeout120,creationflagssubprocess.CREATE_NEW_PROCESS_GROUP,)return{exit_code:proc.returncode,stdout:proc.stdout[-4000:]}验证开发机上curl.exe -X POST http://127.0.0.1:9000/api/exec -H Authorization: Bearer 密钥 -d {\cmd\:\hostname\}返回开发机主机名即成功。注意用curl.exe而非curlPowerShell 里curl是 Invoke-WebRequest 的别名不认-X/-d参数。PowerShell 下推荐用单引号-d {cmd:hostname}cmd 下用双引号并转义\认证必须统一用 FastAPI 的Depends依赖注入统一鉴权见上方骨架。即使经隧道接口本身也要 API key防云主机本地被注入的 Agent 或恶意插件直接打 127.0.0.1:9000上方骨架仅演示鉴权与基本执行生产环境需按坑 2~4 补全超时处理与进程树清理。超时杀进程树Windows 下subprocess.run(timeout)只杀 cmd.exe孙进程残留。用CREATE_NEW_PROCESS_GROUPtaskkill /T /F并发控制信号量统一管理任务完成要清理否则自锁文件编码探测Windows 上 GBK/UTF-8 混存读取要自动探测否则改坏配置文件插件热加载 RCE 通道LLM 写的插件代码直接加载有风险必须人工确认第五步WebDAV 文件服务开发机/手机浏览工作台OpenHanako 的远程端看不到工作台文件所以单独搭了一个文件服务让开发机和手机能像网盘一样浏览工作台。云主机装 Caddy单 exe含 WebDAV 插件下载带 webdav 插件的版本https://caddyserver.com/api/download?oswindowsarchamd64pgithub.com%2Fmholt%2Fcaddy-webdav注意Windows 下这个 API 通常直接返回可执行文件MZ 头下载后改名caddy.exe即可用若拿到的是 zip 包解压得到 caddy.exe。Caddyfile127.0.0.1:8080 { # 只监听本机frp 隧道之外多一层纵深 basic_auth { admin $2a$14$你的密码哈希 } rewrite /dav /dav/ handle /dav/* { route { webdav { root C:/Users/Administrator/Desktop/OH-WorkSpace prefix /dav } } } handle { file_server { root C:/Users/Administrator/Desktop/OH-WorkSpace browse } } }密码哈希生成caddy hash-password --plaintext 你的密码frp 暴露云主机 frpc.toml 加一条 stcp 代理workspace-files端口 8080[[proxies]] name workspace-files type stcp secretKey 换成文件服务stcp密钥 localIP 127.0.0.1 localPort 8080手机/开发机加对应 visitorserverName “workspace-files”bindPort 8080访问http://127.0.0.1:8080/即可看到网页式文件列表/dav/端支持 WebDAV 客户端上传编辑。验证开发机/手机浏览器打开http://127.0.0.1:8080/输入用户名密码后看到文件列表即成功。注意Windows 下 Caddy 进程需对工作台目录有写权限上传/编辑才可用否则报错。WebDAV 客户端选择Windows 资源管理器映射网络驱动器要求 HTTPS 基础认证纯 HTTP 会被拒绝。推荐RaiDrive / CyberduckWindows、CX 文件管理器手机等支持 HTTP WebDAV 的应用。五、踩坑速查表类别坑解法网络公司网络拦明文 HTTP/WSfrp 隧道加密二进制协议网络RDP 端口被封部署用云厂商网页 VNC日常走 frpcmdBOM 编码批处理保存为无 BOMcmdLF 换行cmd 批处理必须 CRLFcmdecho 含括号if/else 块内 echo 文本禁括号cmd%errorlevel% 预展开块内用if errorlevel 1frpstcp 跨版本0.65 客户端连 0.69 服务端可用别急着加装服务端frpcustom listener doesnt exist先看 proxy 端日志是否start proxy success核对 serverName 与 proxy 名完全一致配了 user 要带前缀任务代理超时杀进程树Windows 下subprocess.run(timeout)只杀 cmd.exe孙进程残留用CREATE_NEW_PROCESS_GROUPtaskkill /T /F任务代理并发自锁信号量统一管理任务完成要清理否则跑满后永久 429任务代理插件热加载 RCE 通道LLM 写的插件代码加载前必须人工确认手机鸿蒙后台杀连接应用启动管理手动 电池不限制 WLAN 关闭手机Tailscale 国内延迟高放弃用自建 frp安全access key 明文传输全链路走 stcp 隧道不暴露公网CaddyWindows 下官网 API 返回 exe 非 zip下载后直接改名 caddy.exe 用Caddywebdav 模块不在标准版用官网 API 下载带插件版Caddy/dav无尾斜杠不匹配handle /dav/*Caddyfile 加rewrite /dav /dav/六、安全加固公网只开 frps 控制端口7000token 认证云主机防火墙只放行必要端口HanaAgent 的端口不暴露公网——所有访问走 frp stcp 隧道本机回环访问凭据PWA 需要 access keyWebDAV 需要用户名密码隧道需要 token secretKey多层防护信任边界stcp 的 visitor 与 proxy 通过预共享密钥secretKey相互认证密钥对不上隧道就建不起来frps 本身验证的是 token。密钥明文存于配置文件云主机是信任核心配置文件权限收紧token/secretKey 定期轮换换密钥即可让旧访客失效任务代理 开发机完全交给云主机 AgentFastAPI 接口本身要求 API key防云主机本地被注入的 Agent 直接打 127.0.0.1:9000七、资源与性能提示内存OpenHanako 安装包 400MBElectron 类应用加 frps、frpc、Caddy 常驻2G 内存的 Windows Server 很紧张。建议加大虚拟内存pagefile、关闭不必要的 Server 服务有条件直接升 4G带宽所有流量PWA、文件、任务代理都经 frps 中转4.5GB 迁移数据量耗时取决于云主机带宽。NAT 条件好时可试 xtcp打洞直连需配置fallbackTo实现失败回退 stcp作为进阶优化八、使用体验与总结日常使用上班开发机 PWA 连云主机 → 同一个 Agent、同一套记忆回家手机 PWA 连云主机 → 无缝续上重活编译/推理/大数据云主机通过 frp 下发到开发机任务代理执行任务执行位置约定避免云主机卡死重活上开发机轻活留云主机拿不准先问。三点感想架构决策要先实证再动手很多理论可行比如远程端执行在开发机被实测推翻早验证早省事踩坑记录比功能更重要cmd 四坑、鸿蒙保活三开关、Caddy 版本坑每一个都是真金白银换来的AI 助手 自有基础设施这套体系让 AI 助手真正长在了自己的网络环境里——能远程调度内网资源、能调用 GPU、记忆私有。这是云端 AI 服务给不了的下一步打算把任务代理的插件体系扩充起来折腾过 frp 内网穿透的朋友评论区聊聊你的玩法。