跳转到内容

使用 Caddy 进行云端部署

当你要在云主机上运行一个远程 1mcp serve,并且需要安全的浏览器 Admin Console 与本地 CLI 访问时,使用本页。

Caddy 是第一条推荐的公开 HTTPS 反向代理路径。公开流量通过 HTTPS 到达 1MCP,1mcp serve 不在第一版设计中终止 TLS。Caddy 负责证书和 TLS 终止,然后把普通 HTTP 转发到 loopback 或私有网卡上的运行时。

部署形态

text
浏览器或本地 CLI
  -> https://mcp.example.com
  -> Caddy TLS 终止
  -> http://127.0.0.1:3050
  -> 1mcp serve

如果 Caddy 与 1MCP 在同一台主机上,把 1mcp serve 绑定到 127.0.0.1。如果 Caddy 在另一台主机上,把 1MCP 绑定到私有网卡,并用安全组或防火墙限制只有代理可以访问。

1MCP 运行时配置

把 MCP server 定义放在 mcp.json

json
{
  "$schema": "https://docs.1mcp.app/schemas/v1.0.0/mcp-config.json",
  "mcpServers": {}
}

在同级的 config.toml 应用配置中启用 Admin Console 和 CLI Admin Adapter:

toml
[admin]
enabled = true

在 loopback 上启动运行时,并声明公开 URL 与 Caddy 信任边界:

bash
ONE_MCP_ADMIN_USERNAME=operator \
ONE_MCP_ADMIN_PASSWORD='use-a-long-random-password' \
1mcp serve \
  --config /etc/1mcp/mcp.json \
  --host 127.0.0.1 \
  --port 3050 \
  --external-url https://mcp.example.com \
  --trust-proxy loopback \
  --enable-auth

externalUrl 必须是用户和本地 CLI 访问的公开 HTTPS origin。它用于公开 URL、Runtime Identity、OAuth 回调和安全 cookie 判断。

trustProxy 告诉 1MCP 哪些代理头可以代表原始协议和客户端地址。同机 Caddy 使用 loopback。如果 Caddy 通过私有网络访问 1MCP,使用明确的私有 CIDR,例如 10.0.0.0/8。除非已禁止所有绕过受信任代理的直连访问,否则不要使用 true

externalUrl 是 HTTPS 时,Admin Console cookie 会带上 Secure。只要运行时通过受信任代理头看到原始请求是 HTTPS,浏览器 Admin Session 就能在 Caddy 后正常工作,而不需要让 1mcp serve 自己终止 TLS。

Caddyfile

caddyfile
mcp.example.com {
  encode zstd gzip

  reverse_proxy 127.0.0.1:3050
}

Caddy 会为公开主机名申请和续期证书。如果 1MCP 绑定到非 loopback 地址,确保公网不能直接访问 3050 端口。

暴露前先创建 Admin Account

在配置公开 DNS 或开放防火墙之前,先创建第一个 Admin Account。在运行时主机上,用与 serve 相同的 --config--config-dir 选择本地 Runtime Scope,然后执行 bootstrap:

bash
1mcp admin bootstrap \
  --config /etc/1mcp/mcp.json \
  --username operator \
  --password 'use-a-long-random-password'

无人值守启动时,只在第一次启动使用环境变量 bootstrap:

bash
ONE_MCP_ADMIN_USERNAME=operator \
ONE_MCP_ADMIN_PASSWORD='use-a-long-random-password' \
1mcp serve --config /etc/1mcp/mcp.json --host 127.0.0.1 --port 3050

两种 bootstrap 路径都只会在没有任何 Admin Account 时创建第一个账号。首次启动成功后,从服务环境中移除密码。

Admin Session 与 OAuth 的区别

Admin Session 授权与 OAuth/client-token 授权彼此独立。

Admin Session 保护 /admin/admin/api/admin/cli/v11mcp admin login,以及 1mcp mcp enable --context prod 这类运行时后台管理变更。Admin Session 表示操作者可以管理该运行时。

OAuth 和 client-token 授权保护 MCP 协议客户端以及 OAuth 协议端点。放在 Caddy 后面后,OAuth 协议端点保持不变。有效的 OAuth 客户端 token 不会授予 Admin Console 权限,Admin Session 也不会替代 MCP 客户端的 OAuth 授权。

本地 CLI Target 设置

在你的工作站上,把远程运行时加入一个命名 Runtime Target Context。URL 使用 Caddy 提供的公开 HTTPS 地址:

bash
1mcp target add prod https://mcp.example.com/mcp --use
1mcp target verify prod

target addtarget verify 会读取 Runtime Identity endpoint,并把本地上下文绑定到运行时的 runtimeScopeId。如果之后运行时报告不同身份,1MCP 会在发送 OAuth token 或 Admin Session reference 前失败关闭。

使用公开 CA 证书时不需要额外 TLS 参数。如果使用私有 CA,把 CA bundle 绑定到目标:

bash
1mcp target add prod https://mcp.example.com/mcp --ca-file /path/to/org-ca.pem --use
1mcp target verify prod

生产环境避免使用 --insecure-skip-verify。如果必须导入或测试不安全 TLS 元数据,应保持临时状态,并在首次使用前显式确认。

身份验证通过后,为命名上下文建立 CLI Admin Session:

bash
1mcp admin login --context prod --username operator
1mcp admin status --context prod

之后运行时后台管理命令就可以使用远程上下文:

bash
1mcp mcp disable filesystem --context prod --json
1mcp mcp enable filesystem --context prod --json

暴露前检查清单

  • 公开 DNS 只指向 Caddy。
  • Caddy 将公开 HTTP 重定向到 HTTPS。
  • 1mcp serve 监听 127.0.0.1 或私有网卡,而不是公网网卡。
  • externalUrl 是公开 HTTPS origin。
  • trustProxy 与真实代理边界一致。
  • 开放公网访问前,第一个 Admin Account 已存在。
  • 本地 CLI target 使用 HTTPS,并通过 Runtime Identity 验证。

基于 Apache 2.0 许可发布