构建一个(几乎)完全自托管、沙盒化的自主代理软件工厂
摘要
这篇博客文章详细介绍了如何设置一个完全自托管的自主代理软件工厂,该工厂使用LLMs来自主管理整个SDLC,包括编码、测试和部署,在家庭服务器上使用Coolify和Hermes等工具。
暂无内容
查看缓存全文
缓存时间: 2026/08/21 19:30
# 构建一个(近乎)完全自托管、沙盒化的代理软件工厂
来源:https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/
> 简而言之:它成功了!仅凭一个提示,它就创建了一个代码仓库、编写了应用和测试、让CI通过绿色检查、配置了Postgres数据库,并在无需我再次输入的情况下将成品应用部署到HTTPS环境背后。
> 如果你只想看最终成果,可以在文末找到演示视频(https://blog.jakesaunders.dev/building-an-almost-fully-self-hosted-sandboxed-agentic-software-factory/#enough-of-all-that-show-me-the-goods)。
大语言模型又变得有趣了!或许它们一直如此,只是我之前困在了“幻灭低谷期”。最近,每当需要一个小工具,我就直接自己构建。前几天在健身房时,我想要一个重量追踪器。我设想的应用是最基本的CRUD类型,但应用商店里的版本都要每月12英镑,于是我用Claude一键生成了一个。这很有趣,但以自动模式给LLM访问我电脑的权限仍然让我不太放心。所以,挑战是:如何创建一个完全远程的代理开发环境,通过结构化限制LLM而不是单纯信任它?我希望给它一个指令,让它自主完成整个软件开发生命周期(SDLC):
- 研究合适的技术栈和软件包
- 规划并编写代码和测试
- 提交到Git,构建并运行CI流水线
- 将作品部署到“生产”服务器,包括数据库、可观测性(o11y)和带SSL的域名
所有操作都在我的家庭服务器上完成,无需额外的云基础设施账单。这个实验唯一持续的成本是每月20英镑的Codex订阅费。
## 服务器(们)
它们在这里,展示了全部样貌。下面那台是2014年的双核i3处理器,我已作为家庭实验室运行了五年。它正顽强地托管着这个博客和大约45个其他Docker容器,从Pi-hole到完整的Prometheus/Loki/Grafana技术栈。它还有路由器转发的443端口。如果LLM搞坏了它,我会很恼火,所以今天我们不使用这台。上面那台是2021年的10代i7处理器,配备32GB内存,从eBay全新购买,上面没有任何数据。完美。
## 技术栈
核心开发技术栈通过Coolify实现自托管。推理和集成(如Tailscale、Telegram、DNS和ACME)仍然离开主机。你也可以托管推理服务,但我没有硬件,而且我更希望OpenAI补贴我的实验。
| 组件 | 备注 |
|------|------|
| Pi-hole | 本地DNS规则,附带好处是减少看到糟糕的广告。 |
| Tailscale | 让我的家庭网络如影随形。 |
| Coolify | 一个基于Docker的自托管、类Heroku的PaaS平台。 |
| Forgejo(带运行器) | 自托管的Git和CI。 |
| Hermes(带WebUI) | 一个OpenClaw风格的虚拟助手,使用Codex进行推理。 |
| Telegram | 可以从卫生间或任何地方与代理对话。 |
| Firecrawl(自托管) | 代理与网络之间的抓取/翻译层。 |
| Porkbun(域名注册商)与Let's Encrypt | 一个域名和即时SSL证书。 |
| 其他 | Postgres、Redis,你的应用需要的任何东西。底层就是Docker,对吧?
## 资源
这不是一份完整的操作指南。我或许能写一个Ansible一键脚本来设置所有内容;如果你想要,请在下面的GitHub仓库提交issue。不过,如果你读到这里,大概也能自己弄明白。
## 网络
第一道防护栏很明显:它在独立的物理机上。Hermes可以`rm -rf /`,最坏的情况也就是让我花几个小时重建。下一层防护是网络。我的旧服务器有路由器转发的443端口;这台没有。没有外部入口,大大减少了攻击面,也避免了来自互联网的各种背景辐射(比如有人对着我设置的每个DNS A记录试探性地访问`/wp-admin`)。但是,如果没有入口,我如何:
- 在手机上访问所有酷炫的新应用?
- 为自定义URL生成SSL证书,以便我能访问`https://cool-new-app.internal.jakeshomelab.me`?
我设置了Tailscale,并以旧服务器作为出口节点。当我离家时,选择它就会通过那台服务器和我正在使用的自定义DNS Pi-hole路由我的流量。Pi-hole允许你添加这样的dnsmasq规则:
```
address=/internal.jakeshomelab.me/192.168.1.201
```
现在,任何请求`*.internal.jakeshomelab.me`的域名都会解析到我的新服务器,Coolify的反向代理在那里接棒并提供我崭新的服务。
### SSL证书
通过Caddy或Traefik配合Docker标签,你可以从`https://my-service.internal.jakeshomelab.me`提供容器X上的3000端口服务。将A记录指向服务器,它就会联系Let's Encrypt,完成ACME验证并获取SSL证书。我三年前学会这个,现在看起来仍然像魔法。问题是A记录。我不希望公开将`my-service.internal.jakeshomelab.me`与我的IP关联起来,无论人们能否访问它。我想要为一个“幽灵”服务获取SSL证书。为了解决这个问题,我转向了DNS-01验证。老实说这对我来说是新的,但原理如下:
- 购买一个域名(本例中从Porkbun购买)。
- 生成Porkbun API密钥,并将其添加到Coolify的环境中,并授予对域名的写权限。
- 修改Coolify的Docker Compose文件以使用`lego`和Porkbun API:
```
- '--certificatesresolvers.letsencrypt.acme.dnschallenge=true'
- '--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=porkbun'
- '--log.level=INFO'
```
然后,当我注册一个新的URL时,Traefik/Coolify:
- 使用Porkbun API在`_acme-challenge.my-service.internal.jakeshomelab.me`创建一个新的TXT记录。
- Let's Encrypt验证挑战并颁发有效的SSL证书。
- Traefik删除该TXT记录。
就是这样!你现在有了一个有效的HTTPS URL,在你的tailnet内可达,没有公共的A或AAAA记录指向该服务。主机名可能仍会出现在公共证书透明日志中,但服务只能从tailnet访问。最棒的是Coolify可以即时完成这一切。我们的代理可以在任何子域名创建服务,它就能✨神奇地✨自己搞定。
将所有这些粘合在一起,你得到以下结果:
网络结构图(抱歉有点AI生成的痕迹!)
同样的设置也涵盖了工具,因此Coolify、Hermes、Forgejo和Firecrawl都生活在各自的本地子域名上。
## 开发技术栈与MCP
现在我们有了一个(大致)隔离的盒子,让我们继续看看工具。工具都是知名的;把它们粘合在一起才是有趣的部分。
### Forgejo
我们需要一个持久的地方来存储代码和运行CI。我决定不使用GitHub,因为:
- 给盒子我的GitHub令牌相当破坏了隔离性。而且它不是自托管的。
- 它的API和CI分钟数限制在新软件工厂的规模下行不通。
- 最近它大部分时间也都是宕机的。
Forgejo是一个很棒的自托管替代品。上面链接的Docker Compose文件设置了Forgejo及其运行器;注册你自己和运行器需要额外一点工作,但文档很完善。我还包含了一个用于将项目同步回GitHub的Compose文件。这会将你的GH令牌放在环境中,但权衡在于你自己。上面链接的Forgejo Hermes技能让代理完全控制该实例。
### Hermes
Hermes是一个具有代理能力的OpenClaw风格个人助手。我从未参与OpenClaw的热潮,所以无法比较两者,但Hermes有几个我发现很实用的功能:
- **Web UI**:标准的ChatGPT风格界面,适合在笔记本电脑上工作和管理技能。
- **共享文件系统**:我将其工作空间从Docker主机挂载并通过Samba共享。代理和我可以使用相同的文件,而不用来回复制粘贴Markdown和代码。
- **Telegram集成**:我可以从手机与代理聊天。设置花了两分钟,不需要登录详情,这很适合沙盒方法。
- **自构建技能**:Hermes可以创建和注册自己的技能。我没找到好的Coolify技能,于是它阅读了文档,查看了MCP,并构建了一个。
- **Firecrawl**:自托管的Firecrawl让代理能更优雅地访问SERP数据和大规模网络抓取。
让Hermes和Firecrawl在正确的位置设置正确的密钥是一件非常麻烦的事。我在上面链接的仓库中添加了对Coolify友好的Docker Compose文件。
Hermes正在为这篇博文构建演示Web应用。
### Coolify
Coolify是将这一切粘合在一起的胶水:一个基于Docker和Compose的自托管PaaS,每次更新都取得巨大进步。如果你想在自己的硬件上获得Heroku或DigitalOcean App Platform的便利性,我强烈推荐它。我最喜欢的一些功能包括:
- 底层就是Docker。现有部署大部分都能工作,如果Coolify做不到某些奇怪的事情,你可以从笔记本电脑`docker exec`。只有当你想抽象化时,事物才会被抽象化。
- SSL/路由技术栈,我在上面已经详细介绍过了。
- Coolify内置了许多针对最常见应用的预设配方。Postgres、Redis、Hermes、Forgejo和几乎任何其他应用都可以一键部署。
- 将Postgres备份到S3是三次点击的工作,环境变量和用户管理是内置的。
- GitHub webhook让你在推送到main分支时自动部署。
以下是我的Coolify设置运行中的几个截图:
Coolify的工具界面
Firecrawl服务和Docker Compose
## 它实际做了什么
下面的演示很好地展示了这一点,但启动枪是以下提示:
```
请为我构建一个跟踪卡路里摄入的应用。它应该类似于MyFitnessPal,但有一个表单用于添加特定食物和餐点,以便将来快速选择。你的任务是构建它,将其提交到一个新仓库并包含测试,用CI测试它,并将其部署到http://calories.internal.jakeshomelab.me。我希望它是一个完整的SvelteKit应用,使用Drizzle和Postgres作为数据库层。我希望使用tailwind进行CSS。它应该是移动端优先的。对于部署,请使用docker和docker compose,并部署你自己的Postgres实例。
```
从那里,它就自己干了起来:
- 创建了一个新的Git仓库并引导了SvelteKit、Drizzle、Postgres和Tailwind。
- 编写了应用及其测试,在合理的阶段提交了工作。
- 创建了一个CI流水线。
- 处理测试失败直到CI变绿。
- 用Docker Compose将应用及其自身的Postgres实例容器化。
- 将所有内容部署到Coolify上它自己的URL。
所有这一切都没有再输入一个提示。没有引导它通过失败的测试,也没有把错误信息复制回聊天。它只是不停地运行,直到应用启动。
那时我试了一下,在提交数据时遇到了CSRF问题。我又发了一个提示;它诊断了问题,修复了它,添加了回归测试并重新部署。而且它成功了!这就是我想要的循环:提示、仓库、代码、测试、CI、部署、修复bug。
显然,这不是一个复杂的应用,但它从一个段落变成了经过测试、已部署的软件,并处理了中间所有无聊的部分。这仍然感觉有点像巫术。
## 够了这些,给我看东西吧!
我不是YouTuber,但请看这里:
## 关于隔离的思考与下一步
完全代理开发与安全性之间总存在权衡。这是一个相当人为的例子:应用在完全隔离的环境中工作。大多数有用的软件与其他软件通信,这意味着要交出API密钥,而每个密钥都会在沙盒上增加一个小漏洞。即使在这个设置中,Hermes仍然可以:
- 毁掉新服务器及其上运行的所有东西。
- 删除仓库、数据库和部署。
- 泄露或滥用我给它的任何凭证。
- 像它的年终考核取决于此一样烧掉推理令牌。
- 随意发出对外请求并下载互联网给它的任何垃圾。
- 探测防火墙允许它访问的我网络上的任何其他东西。
所以不,这不是无害的。我所做的只是让这台机器成为可牺牲品,并严格限制我能关心到的、在其触及范围内的东西数量。故障模式现在是“重建eBay盒子并轮换少数几个密钥”,而不是“发现一个LLM热情地重组了我真正的笔记本电脑”。这更好,我想,但这不是魔法。明显的下一步是:
- 将盒子放在自己的VLAN上,并明确阻止它访问我的家庭网络其他部分。
- 根据提供商允许的最窄范围限定每个凭据的权限,并定期轮换它们。
- 自动化备份,并将重建整个盒子变成一键工作。- Coolify的数据库备份和我的共享Docker compose挂载应该使这相对容易。
- 在执行任何真正公开或难以撤销的操作前,要求批准。
然而到了某个时候,太多的审批门会把你神奇的自主软件工厂变回一堆你必须填写的表格。找到介于“每五分钟需要我”和“掌握发射密码”之间的有用平衡点,是下一个实验。
相似文章
Factory 2.0:从编码智能体到软件工厂(3分钟阅读)
Factory宣布其使命进入下一阶段:软件工厂,一个互联的、以智能体为原生的系统,用于端到端软件开发全生命周期,现已与大型企业投入生产。
@addyosmani: https://x.com/addyosmani/status/2079442194449232227
Addy Osmani 的这篇文章探讨了将软件工厂视为规模化代理循环的概念,区分了有人类监督的明工厂和没有人类监督的暗工厂,并强调了理解与设计循环、调控机制和工厂结构的重要性。
@matanSF: https://x.com/matanSF/status/2066578088184680920
Factory 发布 Factory 2.0,从编码代理演变为端到端、代理原生软件工厂,实现组织范围内的自主软件开发,具有模型独立性和自主智能。
@mattpocockuk: 我构建了自己的软件工厂,并将其开源。它叫 Sandcastle。以下是如何使用它:
Matt Pocock 构建并开源了一个名为 Sandcastle 的软件工厂,并分享了如何使用它。
自我构建的智能体IDE(4分钟阅读)
介绍bb,一个开源、MIT许可的智能体IDE,它充当智能体编排器,用户可扩展它以构建自定义功能,包括任务管理、代码审查等。