从你的 agent 开始 也可以从 GitHub 开始
不管走哪条路,检查和发布的流程都一样。更新只换代码,设置、地址和历史版本都原样保留。
你的 coding agent
推荐这种方式。把接入提示词粘给任何 coding agent,它会装好 Tofu 的客户端,你在浏览器里确认一下验证码就行。之后只有你开口,它才会在对话里上传、检查、部署。更新只替换代码,还是同一个 app,设置、地址和版本历史都保留。
agent 与命令行❯ setup prompt pasted · code approvedGitHub 分支
用只读授权导入一个分支,代码停在导入时的那次提交。任何套餐都能开自动更新,之后每次推送,最新提交照样先检查,通过了再部署。
main · push → deploy命令行
独立客户端在终端或云端沙箱里同样能上传、检查、部署。只要有 Node.js 22 或更高版本,在浏览器里确认一次就行,全程不用粘贴密钥。
$ node tofu-agent.mjs login
先检查,再构建 拦下了,就到此为止
要上传的文件会先过安全检查。开始构建前,会对真正要构建的内容再查一遍。查出可能伤害别人的问题(比如已知的恶意代码特征、钓鱼内容或泄露的密钥),就在这一步拦下。托管服务商什么都收不到,已上线的版本照常运行。如果只影响你自己的 app,比如数据表设成了谁都能改,只给警告,app 照原样上线。
构建显示“就绪”,还不等于 app 已上线
Tofu 先访问一次新版本,确认有响应,才把 app 的地址切到新版本。
已检查
上传的代码先过安全检查。没通过,就停在这一步,托管服务商什么都收不到。已构建
托管服务商在为这个 app 单独建的项目里构建,这期间已上线的版本照常运行。已验证
Tofu 访问新版本的专属地址,有响应才算通过。遇到要先登录的页面,记为“受保护”,不算出错。已发布
到这一步,你的 trytofu.app 地址才会切到新版本。任何一步失败,上一个版本都照常运行。
你的 agent 会读到什么
deploy 会限时等待最终结果,没等到,就由 status 接着查。agent 能直接读懂结果,不用打开网页去猜。
publiclyReachable- 只有匿名访问拿到了页面,才是 true。它回答的是“访客现在能打开吗?”
verification.access- 可能是
public(拿到了页面)、protection(有访问限制,匿名进不去,不是构建失败)或unreachable(地址返回 404 或没有响应时,会在 16 秒内反复再试,仍打不开才算)。 serving- app 的地址现在是否指向这次部署。构建已就绪,地址却没指向它,说明它没有发布。
{
"status": "ready",
"managedUrl": "https://franks-kitchen-3f9a1c07b2e4.trytofu.app/",
"serving": true,
"publiclyReachable": true,
"verification": {
"access": "public",
"httpStatus": 200
}
}每次部署都有记录 任何能正常运行的版本,都能一步切回
listDeployments
历史记录
每次部署都列出状态,并标出线上版本。线上的是最后一次发布成功的那一版,不一定是最近一次部署。
getBuildLogs · getRuntimeLogs
日志
托管平台的构建和运行日志都能看到。看起来像密钥或密码的内容会尽量打码。
rollback
回滚
把网址切回之前任何一个能正常运行的版本,不用重新构建。你的数据保持现状,不会跟着回滚。回滚前,你的 agent 会先问你。
构建失败,线上一切照旧 你的 agent 会拿到修复所需的信息
新版本要能正常打开才会发布。构建失败,线上版本就原样不动。Tofu 会把失败原因和日志摘要交给你的 coding agent,还会告诉它下一步怎么做。
线上版本不变
构建失败或打不开的版本,绝不会发布。你的 app 照常运行上一个版本。给 agent 的说明
说明里有失败原因、日志摘要(不含密钥)和下一步怎么做。不管用哪个套餐,内容都一样。修好,再部署一次
你的 agent 改好代码后重新部署。新版本同样要通过安全检查,能正常打开才会发布。
让你的 agent 修好失败的部署,它会读 repairContext:哪次部署失败了、线上现在是哪一版、下一步怎么做。Tofu 从不擅自改动你的代码或 GitHub 仓库。
变量名存在 Tofu 里 变量值只能存入,不能再读出来
变量名和生效范围放在控制台,变量值直接交给托管服务商保存。密钥存进去以后就读不出来了,控制台、Tofu 和你的 agent 都看不到。
粘贴 .env 文件的内容,每个值都会当作密钥保存。VERCEL_* 这类名称是预留的,不能自己设置。托管数据库的变量值由 Tofu 写入和管理,不能修改。保存后不会自动重新部署,要等下次部署才生效。
推送即部署 安全检查,一样不少
导入一个分支,确认框架,再打开自动更新。之后每次推送,Tofu 都会部署这个分支的最新提交;安全检查和发布流程,都和手动上传一样。更新失败,上一个正常的版本继续在线。
Tofu 用短期有效的只读 token 读取仓库,从不写入。手动上传后,自动更新会暂停,不会覆盖你上传的代码。你的 agent 可以关掉自动更新;要打开,得你本人在浏览器里完成 GitHub 授权。
有人访问就运行的 web app 你选好的技术栈,原样上线
这几种都是有人访问才运行,没人访问就自动休眠。每个套餐都能托管你的页面,也能托管需要后端的 app。
- 网站与 Web 框架
- Next.js
- Vite
- Astro
- SvelteKit
- Nuxt
- React Router
- Gatsby
- Static HTML
按框架自己的方式构建,已经构建好的静态网站就原样发布。
- Python
- FastAPI
- Flask
- Django
- Python
按 app 自带的依赖清单构建,作为 HTTP 进程启动,响应发到 app 地址的请求。
- Go
- Go
按 app 自带的 go.mod 构建,作为 HTTP 进程启动,app 需要监听环境变量 PORT 指定的端口。
- JavaScript 服务器
- Express
- Hono
- NestJS
- Node.js server
按文件名自动找到入口文件,作为 HTTP 进程启动,服务器要能响应根路径 / 的请求。
- 容器
- Dockerfile (container)
按 app 自带的容器文件(比如 Dockerfile)构建镜像,再作为服务运行。
即将推出
预览部署。 目前,每个项目的自动更新只跟踪一个分支、一个 app 根目录。还没有 pull request 预览,也不支持 tag,只部署最新的提交。
容器 app 的运行日志。 目前还看不到。查看时会明确提示暂不可用,不会给你一份空日志。
暂未支持
超出上限的网站需要付费套餐。 免费套餐可以把你上传的成品网站上线,文件最多 500 个,总大小不超过 50 MB。
Tofu 不做的事
需要一直运行的程序。 比如处理任务队列的后台程序、一直开着的定时调度器、不走 HTTP 的服务,在 Tofu 上都跑不了,换哪个套餐都一样。
写在 app 里的 cron 定时任务。 写在 app 的
vercel.json里的 cron,在 Tofu 上不会生效。需要定时执行,就让别的服务按时来调用你的 app。任何套餐都不承诺 app 一直在线。 Tofu 会尽力让你的 app 一直在线。想要可用性承诺(SLA),可以单独申请:告诉我们你的需求。
说说你想做什么 app,或者带上 agent 已经做好的 app。Tofu 帮你上线。
任何 coding agent 都能用
© 2026 Tofu
trytofu.ai
本页由英文翻译;如有内容冲突,请以英文原版为准。