关于 Drobek
Drobek 是供已有 AI Agent 使用的开源 Web 应用托管平台,Agent 通过 MCP 编写应用,平台负责编译、预览、版本管理和发布。它提供可自托管部署及认证、数据、表单、邮件、文件和 API 代理等平台模块。
主要功能
- 01MCP 驱动的应用构建流程
- 02编译反馈与实时预览
- 03不可变版本和发布回滚
- 04认证、数据及表单模块
- 05邮件、上传与 API 代理模块
- 06仪表板管理应用和密钥
适用场景
- 01让 Agent 构建并预览 Web 应用
- 02在发布前迭代修正应用
- 03将已构建版本发布或回滚
- 04为应用配置登录、数据和外部 API
MCP 相关
Drobek 提供支持 OAuth 2.1 的 MCP 服务,Agent 可调用工具创建应用、写入文件、获取编译结果并发布版本。支持连接托管实例或自托管实例。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://drobek.app/mcpclaude mcp add --transport http freema-drobek https://drobek.app/mcp{"mcpServers":{"freema-drobek":{"type":"http","url":"https://drobek.app/mcp"}}}在 Cursor 中打开{"servers":{"freema-drobek":{"type":"http","url":"https://drobek.app/mcp"}}}在 VS Code 中打开{"mcpServers":{"freema-drobek":{"type":"http","url":"https://drobek.app/mcp"}}}{"mcpServers":{"freema-drobek":{"serverUrl":"https://drobek.app/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
drobek
开源氛围编程托管平台:你的 AI Agent 构建 Web 应用,drobek 负责编译、预览和发布。
带上 Claude、Claude Code、Cursor 或 Codex。你的 Agent 通过 MCP 连接, 直接在工作区中编写应用,并获取编译反馈和实时预览。何时发布由你决定。 平台模块提供登录、数据、表单、电子邮件、上传、外部 API 和定时导入; 控制面板让你管理应用、用户和密钥。 如果你用 Claude artifact 构建了应用,你的 Agent 会原样迁移文件, 并为你提供预览。
这是一个开源、可自托管的 Lovable、Bolt.new 和 v0 替代方案,适合 已经拥有 Agent 的用户:drobek 没有自己的聊天功能,由你使用的 Agent 负责构建, 而 drobek 负责编译、版本管理、预览并托管它编写的内容。
试用 drobek.app · 自托管 · 作品集 · 文档
35 秒了解代理模块:你的 Agent 注册外部 API,管理员确认谁可以调用它,而你在控制面板中输入的密钥 永远不会传给应用或 Agent。
MCP Registry 名称:io.github.freema/drobek。托管的
Streamable HTTP 端点为 https://drobek.app/mcp,并使用 OAuth 2.1。
选择运行位置
| 开始使用 | |
|---|---|
| drobek.app | 维护者托管的实例。登录,然后连接你的 Agent。 |
| 你自己的服务器 | 使用 Postgres、Redis 和 Caddy 运行相同的公开镜像。按照自托管快速入门操作,然后将 Agent 连接到你服务器的 /mcp 端点。 |
核心部分采用 AGPL-3.0 许可。构建、测试和自托管均无需访问 运营 drobek.app 的私有仓库。 Agent 插件采用 MIT 许可,可 连接到任一实例。
看看大家构建了什么
- Drobek Tycoon — 可玩的托管公司模拟游戏,共有三个关卡。
- Pokédex — 通过 drobek 的代理模块搜索 PokéAPI 并查看统计数据,还可查看实时请求日志。
- Pixel Wall — 由身份验证、数据和其他平台模块支持的共享 64 × 40 画布。
- Pixel Crumbs — 浏览器像素艺术和动画编辑器。
- Drobek Skok — 带排行榜的像素平台游戏。
- Pekárna Drobek — 小型面包店的演示网站。
这些都是 drobek.app 上的公开应用。浏览作品集 查看更多示例。
构建你的第一个应用
-
选择上方的一个实例,然后连接你的 Agent。
-
请求构建一个小型应用,例如:
Build a shift planner for our team on drobek. Let people sign in and see their own shifts. Give me a preview to try before publishing. -
打开预览,请求修改,然后在准备就绪时让 Agent 发布。
应用在浏览器中运行。其后端由已安装的平台模块提供;任意应用服务器代码和每个应用单独执行 npm install 都不在执行模型范围内。如需集成你自己的后端,
编写平台模块。
工作流程
- 将 drobek 连接到你的 Agent(一个使用 OAuth 的 MCP 服务——你在浏览器中批准连接)。
- 请求构建一个应用:“为我们的仓库制作一个排班规划工具”。Agent 调用
create_app,获取一个可编译的初始项目以及规则说明。 - 它调用
write_files。drobek 在进程内使用 esbuild 编译文件,并在同一响应中返回编译错误;Agent 修复错误后再次写入。每次写入都会生成一个不可变版本。 - 每次成功编译后,应用都会立即在其预览主机上运行:
https://<slug>--preview.<APPS_DOMAIN>——Agent 会将链接发给你。 - 满意后,Agent 会调用
publish,版本便会在https://<slug>.<APPS_DOMAIN>(或你自己的域名)上线。发布较早的版本即可回滚。
这样构建的原因:
- 服务器绝不执行应用代码。 服务器只负责编译和提供服务;编译结果只在浏览器中运行。每个应用无需独立沙盒,无需
npm install,也不会执行 Agent 的服务器端代码。 - 密钥绝不会经过 Agent。 应用所有者在控制面板中设置密钥;模块在服务器端使用这些密钥。
- 每个应用都有自己的源站(
<slug>.<APPS_DOMAIN>),与控制面板的源站相互独立。 - 一个进程、一个镜像(
ghcr.io/freema/drobek)+ Postgres + Redis (TLS 使用 Caddy)。可在普通的小型服务器上运行。
核心概念
Agent 插件和平台模块负责不同的工作。 插件教你的 Agent 如何在 drobek 上构建应用。模块在 drobek 服务器上运行,为应用提供后端功能。安装插件不会安装服务器模块。参见仓库与兼容性映射。
-
工作区 — 包含不同角色的人员(工作区管理员 / 编辑者 / 查看者)。
-
应用 — 全局唯一的 slug,由某个工作区拥有。其主机包括:
<slug>.<APPS_DOMAIN>(已发布)、<slug>--preview.<APPS_DOMAIN>(最新编译成功的版本)、<slug>--v<N>.<APPS_DOMAIN>(确切的第 N 个版本),以及已验证的自定义域名。 -
版本 — 应用源文件和编译输出的不可变编号快照。发布时只需移动一个指针。
-
平台模块 — 应用唯一可用的后端:应用主机上
/__drobek/v1/<name>下的路由、浏览器 SDK 中的drobek.<name>、由 Agent 提议且在存在风险时由所有者确认的每应用配置,以及供 Agent 阅读的技能。内置模块(位于modules/,通过DROBEK_MODULES启用):auth— 应用用户通过邮件中的验证码登录(允许列表、管理员、<LoginGate>、所有者可撤销的会话);data— 具有逐操作规则(public/user/owner/admin)、JSON Schema 和 CSV 的记录集合;forms—<Form>提交内容会存储并通过邮件发送给所有者,同时提供机器人防护;email— 向应用所有者发送通知(绝不发送给任意地址),并设有每应用及服务器级预算;files— 终端用户上传文件,系统会根据字节内容识别文件类型,并设有每应用配额;proxy— 在 SSRF 防护机制后调用外部 API,并在服务器端注入密钥。
运营者可以依据公开契约添加自己的模块:
npm create drobek-module@latest <name>会生成一个模块脚手架,使用 npm 包@freema/drobek-modules+@freema/drobek-sdk(通过 npm 别名导入为@drobek/modules/@drobek/sdk)——docs/MODULES.md→ 编写模块。
自托管快速入门
你需要:
-
一台具有公网 IPv4(和/或 IPv6)的服务器,架构为 linux/amd64(v1 没有 ARM 镜像),且 80 和 443 端口可从互联网访问;
-
一个用于控制面板的域名和一个用于应用的域名。请在第 3 步之前创建这些 DNS 记录(Let's Encrypt 会检查它们):
记录 指向 示例 控制面板主机的 A(和/或AAAA)记录服务器 drobek.example.com通配符 A/AAAA*.<APPS_DOMAIN>服务器 *.apps.example.net为应用使用单独的可注册域名(如在
example.com旁使用example.net)更安全;使用apps.<your dashboard domain>也可以。 完全没有 DNS(测试机器)?在第 3 步使用DOMAIN=localhost——Caddy 的本地 CA(tls internal),只能从机器本身访问。 -
一个 SMTP 账户(主机、端口、用户名、密码、发件人地址)或一个 Resend API 密钥——登录验证码会通过电子邮件发送。
所有命令都以 root 身份运行(或在命令前加上 sudo)。
1. Docker、git 和 go-task
curl -fsSL https://get.docker.com | sh
apt-get install -y git openssl
snap install task --classic
docker compose version # → Docker Compose version v2.x (or newer)
task --version # → Task version: v3.x
2. drobek 文件(compose 文件、脚本、环境变量模板——镜像本身来自 GHCR)
git clone https://github.com/freema/drobek /opt/drobek
cd /opt/drobek
git checkout "$(git tag -l 'v*' --sort=-v:refname | head -n 1)" # the newest release (skip before the first one)
3. 配置——生成所有密钥,写入 .env.production(权限模式 600),使用镜像自带的生成器渲染 deployments/Caddyfile(主机上无需安装 Node):
DOMAIN=drobek.example.com APPS_DOMAIN=apps.example.net \
[email protected] [email protected] \
SMTP_HOST=smtp.example.com SMTP_PORT=587 [email protected] \
[email protected] \
task selfhost:init
预期输出(已删节):
✓ created .env.production from .env.production.example (mode 600)
✓ generated POSTGRES_PASSWORD
✓ generated DROBEK_MASTER_KEY
✓ generated TLS_ASK_TOKEN
✓ dashboard https://drobek.example.com · apps https://<slug>.apps.example.net
✓ TLS mode for the app hosts: on-demand
✓ rendered deployments/Caddyfile (on-demand)
✓ docker compose config: OK
然后填入 SMTP 密码(切勿在命令行中输入):
nano .env.production # SMTP_PASS='…' (single quotes if it has $, # or spaces)
task selfhost:init 不会询问任何内容,也不会覆盖密钥;你可以随时再次运行(更改 TLS 设置后,请运行 task tls:reload)。
真实域名的 TLS 默认模式为按需(每个应用主机一个 Let's Encrypt 证书,由 drobek 控制是否签发);使用 TLS_MODE=wildcard-file 或 TLS_MODE=dns 则选择通配符证书——参见 docs/SELF-HOSTING.md 中的“TLS”。
4. 启动
docker compose --env-file .env.production -f docker-compose.production.yaml up -d --wait
首次启动时会拉取镜像,drobek 会应用所有数据库迁移。预期结果:Container drobek-prod-postgres-1 Healthy、…-redis-1 Healthy、…-drobek-1 Healthy、…-caddy-1 Healthy。
curl -s https://drobek.example.com/healthz # → {"ok":true,"db":"up","redis":"up"}
curl -s https://drobek.example.com/api/version # → {"name":"drobek","sha":"<commit>","version":"vX.Y.Z","commitTime":"…","startedAt":"…","modules":[…]}
提示:alias dc='docker compose --env-file .env.production -f docker-compose.production.yaml'
——本指南的其余部分会完整写出命令。
5. 登录——打开 https://drobek.example.com,输入 SUPERADMIN_EMAIL,再输入通过电子邮件收到的 6 位验证码。登录后会进入 /me,其中包含一个个人工作区。
6. 连接 Agent(Claude Code)
claude mcp add --transport http drobek https://drobek.example.com/mcp
Claude Code 会发现 drobek 的 OAuth 服务,在浏览器中打开授权页面(read、write、publish),并获取与你绑定的令牌。如果 Agent 所在的机器上没有浏览器,请改为在服务器上创建 API 密钥,并将其作为标头传入:
docker compose --env-file .env.production -f docker-compose.production.yaml exec drobek \
node node_modules/@drobek/oauth/dist/cli/api-key-create.js \
--email [email protected] --name laptop --scopes read,write,publish
# → drk_… (shown once)
claude mcp add --transport http drobek https://drobek.example.com/mcp \
--header "Authorization: Bearer drk_…"
7. 发布应用——让 Agent 执行:“在 drobek 上构建一个小费计算器并发布。” 它会依次调用 create_app → write_files → publish;打开它返回的 published_url(https://tip-calculator.apps.example.net)。使用按需 TLS 时,首次访问新的应用主机需要等待几秒钟以获取证书。
没有 DNS 的测试机器——使用 Caddy 的本地 CA 执行相同步骤:
DOMAIN=localhost [email protected] SMTP_HOST=… task selfhost:init # → TLS mode internal
docker compose --env-file .env.production -f docker-compose.production.yaml up -d --wait
docker compose --env-file .env.production -f docker-compose.production.yaml cp \
caddy:/data/caddy/pki/authorities/local/root.crt ./drobek-root.crt
curl --cacert drobek-root.crt https://localhost/healthz
在浏览器/操作系统中信任 drobek-root.crt,即可在使用时不出现警告(Node 客户端:NODE_EXTRA_CA_CERTS=drobek-root.crt)。应用主机为
https://<slug>.apps.localhost,浏览器会将其解析到机器本身。
HTTPS_PORT=8443(以及 HTTP_PORT=8080)可让 Caddy 改用非 443 端口——此时所有 URL 都会带上端口。
备份(task backup、task backup:verify、task restore)、升级(task selfhost:upgrade)、轮换 DROBEK_MASTER_KEY(task selfhost:rekey)、三种 TLS 方式、自定义域名、滥用处理和所有设置:
docs/SELF-HOSTING.md。
连接你的 Agent
MCP 端点为 <PUBLIC_APP_URL>/mcp(OAuth 2.1;客户端会自行发现、注册并征求你的同意)。作用域:read、write、publish;令牌与你绑定,可访问你所属的每个工作区,并遵循你在各工作区中的角色。
- **Claude Code:**运行
claude mcp add --transport http drobek https://drobek.example.com/mcp,然后输入/mcp→ 登录。对于托管版 drobek,运行claude plugin marketplace add freema/drobek-plugin和claude plugin install drobek@drobek(MCP 服务 + 构建技能 +/drobek:build-app)。 - **Claude(网页端 / 桌面端):**使用
/mcpURL 添加自定义连接器。 - **Cursor:**在
~/.cursor/mcp.json中配置{ "mcpServers": { "drobek": { "url": "https://drobek.example.com/mcp" } } }。 - **Codex:**对于托管版 drobek,运行
codex plugin marketplace add freema/drobek-plugin、codex plugin add drobek@drobek、codex mcp login drobek。 - **脚本 / CI:**从
/me/api-keys获取个人drk_…API 密钥,并将其作为Authorization: Bearer drk_…使用。
Agent 可使用这些工具:list_apps、create_app、duplicate_app、get_app、read_file、write_files、restore_version;管理版本历史的 list_versions、keep_version、delete_versions、publish、set_gallery_listing;管理应用设置和生命周期的 unpublish、set_visibility、set_frame_ancestors、release_lease、delete_app、skill_info、configure_module、query_data;管理应用存储数据的 create_records、update_record、delete_record、delete_collection、purge_orphan_records;管理访客数量的 get_logs、get_analytics;管理视频、音频、图像和字体的 create_asset_upload、list_assets、delete_asset(使用上传 URL,文件不会经过模型);管理所有者模块标签页的 list_form_submissions、delete_form_submission、list_end_users、set_end_user_role、set_end_user_blocked、sign_out_end_users、list_uploads、delete_upload、remove_module_secret 和 list_activity;管理成员通过预览中的 Feedback 按钮留下的备注的 list_feedback、get_feedback_screenshot(以图像形式附加到备注的屏幕截图)、resolve_feedback 和 delete_feedback;查看用户所见内容的 request_screenshot(在打开的预览中显示 Capture 栏)和 get_screenshot;管理自定义域名的 list_domains、add_domain、verify_domain、set_primary_domain、remove_domain;管理代理模块外部 API 的 list_upstreams、register_upstream、set_upstream_streaming、remove_upstream;管理同步模块定时导入的 sync_now;以及管理工作区的 create_workspace、list_members、invite_member、set_member_role、remove_member 和 delete_workspace(超级管理员还可使用 set_workspace_publishing、set_workspace_module、takedown_app、restore_app 和 set_gallery_hidden)。完整的 Agent 合约(作用域、简介、技能、/llms.txt)见 docs/AGENT.md;运行中的服务会在 /llms.txt、/llms-full.txt 和 /build-with-your-agent 提供这些内容。不使用插件时,可运行 cp -r skills/drobek ~/.claude/skills/drobek,教 Agent 使用这一工作流程。
本地开发
前置条件:运行服务栈需要 Docker(compose v2);在主机端运行 task check / task e2e 需要 go-task
3、Node 22 和 pnpm 10。
git clone https://github.com/freema/drobek && cd drobek
cp .env.example .env
# Two edits make it yours (the rest have working dev defaults):
# 1. SUPERADMIN_EMAIL → the email you'll sign in with (becomes super-admin)
# 2. DROBEK_MASTER_KEY → a real key: openssl rand -hex 32
task dev # or: docker compose up -d --build
| 服务 | 主机端口 | 检查方式 |
|---|---|---|
drobek(仪表板 + OAuth AS + MCP /mcp) | 3041 | GET /healthz → {ok,db,redis}(依赖项不可用时返回 503);GET /health → {ok:true} |
| postgres 17 | 5441 | pg_isready |
| redis 7 | 6391 | redis-cli ping |
| mailpit(开发用 SMTP 接收器) | 8025 | 登录码会发送到这里 |
开发服务栈会运行所有内置模块以及示例模块
drobek-module-hello 和 drobek-module-acme-crm(可选,通过 task dev 安装到
./.modules)。在 localhost:3041 登录
(验证码位于 Mailpit),然后将 Agent 指向
http://localhost:3041/mcp。
在本地打开应用。 APPS_DOMAIN=apps.localhost:3041,浏览器
会将所有 *.localhost 域名解析到你的计算机——无需修改
/etc/hosts:
| 主机 | 提供内容 |
|---|---|
http://<slug>--preview.apps.localhost:3041 | 最新的已编译版本 |
http://<slug>.apps.localhost:3041 | 已发布版本(首次发布前会显示“尚未发布”) |
http://<slug>--v<N>.apps.localhost:3041 | 确切的 N 版本 |
curl 和 Node 并非在所有环境下都能解析 *.localhost;请改为在
Host 请求头中发送应用主机名:
curl -i -H 'Host: <slug>--preview.apps.localhost:3041' http://127.0.0.1:3041/
浏览器会拒绝纯 http://localhost 上的 __Host- Cookie,因此 HTTP 开发
服务栈(NODE_ENV ≠ production)会使用不带前缀、但仍仅限主机的
drobek_session / drobek_app_access / drobek_eu;生产环境和所有
HTTPS 来源都会使用 __Host- 名称。task dev:tls 会通过本地 CA,让开发服务栈
经由 Caddy 在 https://localhost 上运行。对于不需要 OAuth
流程的脚本:task api-key:create [email protected] NAME=laptop SCOPES=read,write。
常用命令:
task dev # build + start the stack, wait until healthy
task check # host-side gate: install, doc-lint, build packages + app bundle, typecheck, lint, knip, unit tests
task logs # tail the drobek service
task health # curl the health endpoints
task e2e # Playwright suite (incl. @local specs) vs the stack
task e2e:image # what CI runs: the prod image behind Caddy + the whole suite
task e2e:smoke # @smoke specs only (safe against any target, prod included)
task build # build the production image ghcr.io/freema/drobek:<sha>
task prod:proof # build + prove the prod image (size, non-root, fail-closed, live boot)
task dev:tls # dev stack behind Caddy (tls internal); task dev:tls:down to leave
task db:generate # drizzle-kit generate (journal __drizzle_migrations_core)
task down # stop the stack (docker compose down -v also wipes the data)
贡献者规则和仓库结构图:CLAUDE.md。
公开仓库、Agent 插件与服务模块的区别,以及外部使用者检查:docs/ECOSYSTEM.md。
端到端测试
tests-e2e 是一个包含两个层级的 Playwright 测试套件:
-
@local— 需要本地堆栈:直接对 Postgres / Redis / Mailpit 进行填充和读取。global-setup.ts会先对核心表执行 TRUNCATE,但仅当 设置了ALLOW_DESTRUCTIVE=1,且DATABASE_URL的主机在允许列表 (localhost、127.0.0.1、postgres)中时才会执行。 -
@smoke— 仅使用公共 HTTP + MCP,可安全用于生产环境:绝不访问 数据库、Redis 或 Mailpit。MCP 冒烟测试循环(mcp-loop.spec.ts)使用从 环境变量读取的SMOKE_API_KEY中的drk_密钥登录, 创建、预览并发布一个smoke-*应用,不留下任何残留。 MCP 没有删除工具,因此测试会按目标环境清理:针对本地堆栈 (TEST_ENV=local),会创建一个全新的smoke-<random>应用,并在测试结束时 删除它——即使测试失败也会删除——通过仪表板的删除操作完成, 并使用电子邮件 OTP(Mailpit)以冒烟测试用户身份登录;针对任何 其他目标(生产环境),则为每个密钥复用一个固定应用,smoke-<12 hex of a SHA-256 of the key>(list_apps→get_app,然后创建 新版本并发布),因此生产环境中每个冒烟测试身份恰好保留一个冒烟测试应用:BASE_URL_WEB=https://drobek.app SMOKE_API_KEY=drk_… task e2e:smoke如果没有密钥,目标为 localhost 时会跳过该测试,在其他任何目标上都会失败; 运行
task e2e时,会在本地数据库中生成一个一次性密钥。
mcp-loop.spec.ts 是 Agent 循环的端到端测试:使用官方 MCP SDK 客户端
和 OAuth provider(401 → discovery → DCR → 由
Playwright 驱动的 PKCE consent → token),然后依次执行 list_apps → create_app →
write_files(编译错误 → 修复)→ 预览主机 → publish → 生产主机 →
restore_version → get_app,并断言整个流程在 90 s 内完成。
task e2e 针对开发堆栈运行(task dev)。task e2e:image 是
CI 流程(.github/workflows/ci.yml 运行相同的 scripts/e2e-image.sh):
构建生产镜像,使用 docker-compose.e2e.yaml 启动(项目名为
drobek-e2e,使用独立的 loopback 端口,因此可以与开发堆栈并行运行),并在
Caddy 后方通过 tls internal 提供 https://localhost:8443 和
https://<slug>--preview.apps.localhost:8443,让它迁移一个全新的数据库,然后
运行 @smoke + @local(阶段 1);再使用
EMAIL_TRANSPORT=relay 和 PUBLISH_APPROVAL=approval 重新创建 drobek,并运行
需要这些设置的测试(阶段 2),最后拆除所有内容。如果某个测试在两个阶段中都未运行,
跳过保护脚本(scripts/e2e-skip-guard.mjs)会使此次运行失败。镜像以
NODE_ENV=production 运行,会忽略开发堆栈的快捷设置,因此 e2e 堆栈会提供符合生产环境形态的替代服务:
模拟 IdP(tests-e2e/mock-oidc.mjs)通过 Caddy 使用 https,作为服务端的
AUTH_OIDC_ISSUER;DNS 服务器(tests-e2e/dns-mock.mjs)作为
DOMAINS_DNS_SERVERS,从与开发 DNS 模拟器相同的 Redis 密钥中响应;以及 drobek 自身在
127.0.0.1:3451 上的端口,供仅由 Caddy 发送的内容使用(TLS 请求、客户端的
X-Real-IP)。设置 DROBEK_IMAGE=… 可跳过构建,设置 E2E_KEEP=1
可保留堆栈;额外参数会用一次 Playwright 运行替代各阶段
(task e2e:image -- tests/mcp-loop.spec.ts;设置 E2E_PHASE=2 可针对阶段 2 的配置运行)。
两个堆栈都会像运维人员那样安装两个外部模块:
examples/drobek-module-acme-crm 和仅供运维人员使用的测试 fixture
tests-e2e/fixtures/drobek-module-ops-probe(开发堆栈使用 task module:example 和
task module:fixture,镜像流程使用 scripts/e2e-image.sh)。该 fixture 是两个堆栈的错误报告器
(ERROR_REPORTER=capture:报告会发送到 e2e 的 proxy-echo,测试会从那里读取报告),也是
开发堆栈的电子邮件传输方式(EMAIL_TRANSPORT=relay:每条消息都会通过其 HTTP API 发送到 Mailpit);
镜像流程在第一阶段使用内置 SMTP,在第二阶段切换为 relay。
版本与升级
drobek 遵循语义化版本规范;在 0.x 阶段,小版本发布可能需要操作员执行步骤,具体会在发行说明中注明。每个版本发布都对应一个 git 标签 vX.Y.Z、一个不可变镜像 ghcr.io/freema/drobek:vX.Y.Z、一个 GitHub 发行版以及 CHANGELOG.md 中的一条记录;每次发布时,latest 和 previous 都会更新(docs/SELF-HOSTING.md → 镜像标签)。迁移只会向前执行,并作为 task selfhost:upgrade 的独立步骤运行;如果数据库版本比镜像新,镜像将拒绝启动并指出需要运行的版本。回滚时需使用上一个镜像,并在该版本迁移过数据库时,恢复迁移前所做的备份(升级与回滚)。模块会声明所需的契约版本范围,如果服务无法满足模块的要求,就会拒绝启动(docs/MODULES.md → 兼容性)。
扩展 drobek:编写模块
应用的后端由一组平台模块组成,任何人都可以编写模块:将基于已发布契约的 npm 包安装到应用中即可,操作员无需构建镜像。
npm create drobek-module@latest erp # routes, SDK slice, migration, SKILL.md, tests
该契约以 @freema/drobek-modules 的名称发布在 npm 上;脚手架会以模块代码导入时使用的名称安装它:@drobek/modules("@drobek/modules": "npm:@freema/drobek-modules@^X.Y.Z")。
docs/MODULES.md → 编写模块介绍了契约、发布与安装;examples/drobek-module-hello 是一个可运行的示例,examples/drobek-module-acme-crm 则是一个无需镜像即可安装的可选模块;已发布的模块列出了其他人可以安装的模块。
参与贡献
欢迎提交问题、提问和拉取请求,详情请参阅 CONTRIBUTING.md。问题和想法可发布到讨论区;安全问题请私下报告(SECURITY.md)。
文档
| 文档 | 内容 |
|---|---|
docs/ARCHITECTURE.md | 单进程、源站、版本、编译器、服务、模块、TLS、作业 |
docs/SELF-HOSTING.md | 快速入门、compose、所有环境变量、TLS、备份、升级、自定义域名、滥用 |
docs/MODULES.md | 平台模块契约和内置模块 |
docs/AGENT.md | 连接 Agent、工具与范围、简介、技能、llms.txt |
docs/SECURITY.md | 威胁模型以及如何报告漏洞 |
docs/LICENSING.md | AGPL-3.0 §13 及与托管版 drobek.app 的界限 |
CHANGELOG.md | 所有版本发布记录 |
许可证
AGPL-3.0 — 请参阅 docs/LICENSING.md。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。

