内容
# drobek
> 开源托管平台,适用于 **微型项目**。只需将小型HTML/静态应用上传,即可一步获取实时URL — 原生支持MCP。
**状态:** 🌱 初步阶段 — 我们正在完善概念。架构和API可能会发生变化。
---
## 问题
在公司内部,人们经常会产生 **小型一次性项目**:内部仪表盘、登陆页面、计算器、客户演示、"能否为我快速制作一个显示X的页面"。越来越多这样的项目都是 **通过AI代理快速生成**。
这些项目却没有合适的地方存放:
- **localhost** → 关闭笔记本电脑后就会消失
- **Slack中的ZIP文件** → 没人会运行它
- **"真正"的主机托管** (Vercel/Netlify/S3) → 对于单个HTML文件来说太过复杂:需要账户、Git仓库、构建步骤和配置
- **内部基础设施** → 需要向IT部门提交工单,等待一周
因此,许多优秀的小项目都无法接触到真正需要它们的人。
## drobek的作用
drobek的口号是 **"粘贴即上线。"** 只需将文件夹或HTML文件交给drobek,就能获取一个URL。无需为静态项目进行构建和配置。
主要的部署渠道是 **MCP原生部署**:同一个创建项目的AI代理会将其部署。 *"将此项目部署到drobek"* → 只需一个工具调用 → 实时URL。无需切换上下文,不需要离开聊天界面。
## 部署渠道(计划中)
- **MCP** — 创建项目的代理直接部署(主要渠道)
- **CLI** — `drobek deploy ./my-app`
- **网页拖放** — 适用于非开发人员
- **API / git push** — 适用于其他情况
*(具体渠道仍在讨论中 — 请参见开放问题。)*
## 核心概念
- **项目** — 已部署的单元(静态捆绑包或小型应用);具有名称、所有者和URL。
- **部署** — 项目的不可变版本(可回滚)。
- **渠道** — 部署到达的方式(MCP / CLI / 网页 / API)。
- **托管** — drobek在子域名(以及后续自定义域名)上提供项目服务,并使用TLS。
## 开放问题(待解决)
- **仅限静态内容,还是也支持运行后端?** (静态内容简单得多;后端需要隔离)
- 运行时和服务模型(对象存储 + 路由器?每个项目一个容器?)
- 不受信任的快速生成代码的隔离和安全性
- 身份验证和多租户
- 项目包如何通过MCP传输(内联?预签名上传?)
- 子域名 + 自定义域名 + 通配符TLS模型
- 配额、限制和生命周期(过时项目是否过期?)
## 自主托管快速入门
整个堆栈 **从源代码构建**,只需一个命令即可运行 — 克隆、复制环境变量、`docker compose up`,即可拥有一个可用的drobek:电子邮件登录、工作区、MCP OAuth服务器、部署管道、路径服务和仪表盘。
前提条件: **Docker** (compose v2)。 [go-task](https://taskfile.dev) 3 + Node 22 + pnpm 10 仅在主机侧的 `task check` / `task e2e` 需要,不会影响堆栈运行。
```sh
git clone https://github.com/freema/drobek && cd drobek
cp .env.example .env
# 两处编辑使其成为您的配置(其余部分具有有效的开发默认值):
# 1. SUPERADMIN_EMAIL → 您将使用的登录邮箱(成为超级管理员)
# 2. UPLOAD_SIGNING_SECRET → 真实的密钥: openssl rand -hex 32
docker compose up -d --build # 或: task up (等待健康检查)
```
六个服务启动,每个服务都有健康检查; **网页入口点自动应用核心Drizzle迁移** (日志 `__drizzle_migrations_core`,迁移 `0000`→`0002`)后提供服务:
| 服务 | 主机端口 | 容器内端口 | 健康检查 |
| ------- | --------- | ------------ | ----- |
| 网页(React Router 7 SSR) | [3041](http://localhost:3041) | 3000 | `GET /healthz` → `{ok,db,redis}`,依赖项宕机时503 |
| mcp-server(Express,OAuth 2.1 RS) | [3042](http://localhost:3042) | 3001 | `GET /health` → `{ok:true}` |
| worker(BullMQ部署消费者) | — | — | `pgrep scripts/worker.mjs` |
| postgres 17 | 5441 | 5432 | `pg_isready` |
| redis 7 | 6391 | 6379 | `redis-cli ping` |
| mailpit(开发SMTP接收器) | [8025](http://localhost:8025) | 1025/8025 | `/mailpit readyz` |
**从代理部署静态应用(主要流程):**
1. 打开 [localhost:3041](http://localhost:3041) 并使用您的电子邮件登录。开发堆栈将登录代码发送到 **mailpit** 接收器 — 在 [localhost:8025](http://localhost:8025) 读取(生产环境使用真实SMTP)。
2. 将MCP客户端(例如Claude Code)指向 `http://localhost:3042/mcp`。它会发现drobek OAuth授权服务器,您在浏览器中批准许可屏幕(选择工作区并授予`deploy:write`),然后它会收到一个作用域令牌。
3. 请求代理部署您的静态应用。它调用 `deploy_init` → 上传文件 → `deploy_commit`;工作器检查、存储和激活版本,应用在 `http://localhost:3041/<workspace>/app/<slug>` 上线。
4. 回滚(`rollback` 工具或仪表盘)并在 `/workspaces/<slug>/apps` 下浏览部署历史和应用列表。
`docker compose down -v` 清除卷(postgres、redis、blob)以便重新开始;`docker compose down` 保留数据。
日常命令:
```sh
task health # curl两个健康检查端点
task logs # 尾随网页 + mcp日志
task check # 主机侧:构建包、类型检查、lint、单元测试
task e2e # Playwright套件(包括@local和M1a验收测试)与堆栈对比
task e2e:smoke # 只读取@smoke规格(对任何目标都安全)
task db:generate # drizzle-kit生成(日志 __drizzle_migrations_core)
task db:migrate # 手动应用核心迁移
task stop # docker compose down
```
端到端M1a验收测试 —
[`tests-e2e/tests/m1a-acceptance.spec.ts`](./tests-e2e/tests/m1a-acceptance.spec.ts)
— 在一个测试中执行上述整个流程(登录 → 团队 → MCP OAuth → 部署 → 服务 → v2 → 回滚 → 仪表盘),是自托管堆栈工作的规范证明。
`/api/version` 返回git sha `task up` 通过 `GIT_SHA` 注入(备用 `dev`)。单体布局: `apps/{web,mcp-server}` +
`packages/{db,core,auth,tenancy,oauth,deploy,serving,dashboard,sdk}` +
`tests-e2e` (pnpm工作区)。架构和批准的D1–D5决策:
[`docs/ARCHITECTURE.md`](./docs/ARCHITECTURE.md).
## 许可证
[AGPL-3.0](./LICENSE).