功能 · 托管与部署

上线,也能回滚

每个 app 单独​托管,​有自己的 trytofu.app 地址。​新版本​先检查​再构建,​确认​能正常​访问​才发布,​每一版​都留在​版本​历史里。​想回滚到​哪一版,​在控制台​点一下​就行,​也可以​直接跟你的 agent 说。

你的 agent 会调用的工具

  • deploy
  • status
  • listDeployments
  • getBuildLogs
  • getRuntimeLogs
  • rollback
3 个入口

从你的 agent 开始 也可以从 GitHub 开始

不管走​哪条路,​检查​和发布的​流程​都一样。​更新只换​代码,​设置、​地址​和历史​版本​都原样​保留。

  1. 你的 coding agent

    推荐​这种方式。​把接入​提示词​粘给任何 coding agent,​它会装好 Tofu 的客户端,​你在​浏览器里​确认一下​验证码​就行。​之后​只有你​开口,​它​才会在对话里​上传、​检查、​部署。​更新​只替换​代码,​还是同一个 app,​设置、​地址​和版本​历史​都保留。

    agent 与命令行

    ❯ setup prompt pasted · code approved

  2. GitHub 分支

    用只读​授权导入​一个分支,​代码停在​导入时的​那次​提交。​任何套餐​都能开​自动​更新,​之后​每次推送,​最新提交​照样​先检查,​通过了​再部署。

    main · push → deploy

  3. 命令行

    独立客户​端在终端​或云端沙​箱里同样​能上传、​检查、​部署。​只要有 Node.js 22 或更高​版本,​在浏览器里​确认​一次就行,​全程​不用粘贴​密钥。

    $ node tofu-agent.mjs login

构建前

先检查,​再构建 拦下了,​就到此为止

要上传的​文件​会先过​安全​检查。​开始​构建前,​会对真正​要构建的​内容再查​一遍。​查出​可能伤害​别人的​问题​(比如​已知的​恶意代码​特征、​钓鱼内容​或泄露的​密钥),​就在这一步拦下。​托管​服务商​什么都收​不到,​已上线的​版本照常​运行。​如果只影响​你自己的 app,​比如​数据表​设成了谁​都能改,​只给警告,app 照原样​上线。

安全检查​会查什么,​不会查什么

发布

构建显示​“就绪”,还不等于 app 已上线

Tofu 先访问​一次新​版本,​确认有​响应,​才把 app 的地址​切到新​版本。

  1. 已检查

    上传的​代码先过​安全​检查。​没通过,​就停在​这一步,​托管​服务商​什么都收​不到。
  2. 已构建

    托管​服务商在为这个 app 单独建的​项目里​构建,​这期间已​上线的​版本照常​运行。
  3. 已验证

    Tofu 访问新​版本的​专属​地址,​有响应​才算​通过。​遇到​要先登录的​页面,​记为“受​保护”,​不算出错。
  4. 已发布

    到这一步,​你的 trytofu.app 地址​才会切到​新版本。​任何一步失败,​上一个版本​都照常​运行。

你的 agent 会读到什么

deploy 会限时​等待最终​结果,​没等到,​就由 status 接着查。agent 能直接读​懂结果,​不用打开​网页去猜。

publiclyReachable
只有匿名​访问​拿到了​页面,​才是 true。​它回答​的是​“访客​现在​能打开吗?”
verification.access
可能是 public(拿到了​页面)、protection(有访问​限制,​匿名进​不去,​不是构建​失败)或 unreachable(地址​返回 404 或没有响应时,​会在 16 秒内反复​再试,​仍打不开​才算)。
serving
app 的地址​现在是否​指向​这次部署。​构建已​就绪,​地址​却没指向它,​说明它​没有发布。
tofu · deployexample · excerpt
{
  "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,​还会告诉​它下一步​怎么做。

  1. 线上版本不变

    构建失败​或打不开的​版本,​绝不​会发布。​你的 app 照常​运行上​一个版本。
  2. 给 agent 的说明

    说明里​有失败​原因、​日志摘要​(不含​密钥)​和下一步​怎么做。​不管用哪个套餐,​内容​都一样。
  3. 修好,​再部署一次

    你的 agent 改好​代码后​重新​部署。​新版本​同样​要通过安全​检查,​能正常​打开​才会发布。

让你的 agent 修好​失败的​部署,​它会读 repairContext:​哪次部署​失败了、​线上​现在是​哪一版、​下一步​怎么做。Tofu 从不擅自​改动​你的代码或 GitHub 仓库。

环境变量

变量名存在 Tofu 里 变量值​只能存入,​不能再读出来

变量名和​生效范围​放在​控制台,​变量值​直接交给​托管​服务商​保存。​密钥存​进去以后​就读​不出来了,​控制台、Tofu 和你的 agent 都看不到。

粘贴 .env 文件的​内容,​每个值​都会当作​密钥​保存。VERCEL_* 这类名称​是预​留的,​不能自己​设置。​托管​数据库的​变量值由 Tofu 写入​和管理,​不能修改。​保存后​不会自动​重新​部署,​要等下次​部署​才生效。

GitHub 自动更新,​每个套餐都能用

推送即部署 安全检查,​一样不少

导入​一个分支,​确认​框架,​再打开​自动​更新。​之后​每次推送,Tofu 都会部署​这个分支的​最新​提交;​安全检查​和发布​流程,​都和手动​上传​一样。​更新​失败,​上一个正常的​版本继续​在线。

Tofu 用短期​有效的​只读 token 读取​仓库,​从不写入。​手动​上传后,​自动更新​会暂停,​不会覆盖​你上传的​代码。​你的 agent 可以关掉​自动​更新;​要打开,​得你本人​在浏览器里​完成 GitHub 授权。

Tofu 能托管什么

有人访问​就运行的 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),​可以单独​申请:告诉我们​你的需求。

粘贴​一段提示词。10 分钟上线

用你​已经在用的 agent,10 分钟,​把 app、​数据库、​域名和​登录​都弄好。

免费开始