每个服务都是一个 URL。代理就是实现方式。
一个容器为每项 Hoody 套件服务提供独立的 HTTPS URL,还有 http-PORT 格式供自定义绑定。端口、鉴权、TLS 和真实客户端 IP 均在 URL 层解析。
代理运行在裸金属服务器上。Hoody 仅接收管理 API 调用——容器流量不离开你的服务器。
*.containers.hoody.com — wildcard TLS · no Certificate Transparency log exposure
统一语法,多种模式
每项套件服务都通过同一代理解析,但 URL slug 揭示其服务类型。语法统一,每项服务形态各异。
| 服务 | URL slug | 备注 |
|---|---|---|
| Workspaces | workspace-N | 其他服务 URL 的组合层 |
| Terminal | terminal-N | 每实例独立 shell;与 display-N 映射 |
| Display | display-N | 每实例 GUI / X11 桌面 |
| Browser | browser-N | 远程 Chrome 实例 |
| Code | code-N | 每索引一个 VS Code 实例 |
| Files | files | 单例——无实例编号 |
| SQLite | sqlite-N | 每数据库服务一个 slug |
| Exec | exec-N | 脚本即 API |
| Agent | agent-N | 每智能体 LLM 实例 |
| cURL | curl-N | 出站 HTTP 代理 |
| Daemon | hoody-daemon-N | 进程管理器 |
| Cron | —(当前通过 cURL) | 占位服务;调度通过 cURL 实现 |
| Notifications | n-N · notification-server-N | 浏览器桥接 + API |
| Pipe | —(通过其他服务) | 占位服务;流式传输分散在 Files/Terminal/Exec 中 |
项目 24 位十六进制 × 容器 24 位十六进制 = 2^192 组合。暴力枚举不可行。
绑定任意端口,自动获得 URL。
http-PORT 前缀将代理路由到容器内部端口,无需 nginx server 块,无需 ingress YAML。
# listening sockets
$ ss -ltnp
https://PROJECT_ID-CONTAINER_ID-http-4000.SERVER.containers.hoody.com
https://PROJECT_ID-CONTAINER_ID-http-5173.SERVER.containers.hoody.com
https://PROJECT_ID-CONTAINER_ID-http-7070.SERVER.containers.hoody.com
— Hoody-kit 端口由平台自身服务保留,其余任意。应用侧,绑定任意端口,通过 http-PORT 暴露。
— 应用必须绑定到 0.0.0.0 而非 localhost——套接字需要可从代理容器访问。
— 代理支持 HTTP/1.1、HTTP/2、HTTP/3 和 WebSocket 端到端传输。任意 UDP 流量不在路由范围内——如需原始 UDP,请使用专用 IPv4。
鉴权是 JSON 策略,而非应用中间件。
代理在请求到达容器前验证 JWT 声明、密码哈希、IP CIDR 范围和 Bearer Token。应用本身保持简洁。
{
"enable_proxy": true,
"default": "deny",
"groups": {
"dashboard": {
"type": "jwt",
"algorithm": "HS256",
"source": "header",
"key": "Authorization",
"secret": "<hmac-secret>",
"claims": { "role": ["admin", "viewer"] }
},
"office-only": {
"type": "ip",
"cidrs": ["203.0.113.0/24"]
}
},
"permissions": {
"dashboard": { "http": [4000, 5173] },
"office-only": { "ssh": true, "terminal": true }
}
}JWT
HS256 · RS256 · ES256 · header/cookie/query · 声明验证
密码
HTTP Basic · SHA-256 + 盐值 · 可嵌入 URL
IP
IPv4 CIDR 匹配 · 套接字层真实客户端 IP
Bearer Token
每组多个 Token · 适合 API 使用
容器级权限替换项目级权限——不合并。如需依赖继承,请明确设置两个作用域。
在加密 URL 之上添加易记 URL
一次 API 调用将加密 URL 转换为 api.mycompany.com。Let's Encrypt 在 30–60 秒内完成配置,每 90 天自动续签。
https://67e89abc…-890abcdef…-http-4000.node-us.containers.hoody.com
https://api.mycompany.com
别名命名规则:3–61 个字符,小写字母数字加连字符,首尾必须是字母或数字。自动生成的别名为 48 位十六进制。
否则你需要自行拼凑的东西
代理取代了大多数团队从头搭建的技术栈:反向代理 + 证书管理器 + VPN 或隧道 + 按应用鉴权 + 审计日志。自托管方案无法满足的核心假设——URL 即路由、URL 即鉴权范围、URL 即可嵌入——正是代理原生提供的能力。
| 场景 | Hoody 代理 | 自托管等效方案 |
|---|---|---|
| 通配符 HTTPS | 原生支持 — 原生支持 | certbot + 续签 cron + 证书轮换 |
| 路由到内部端口 | 原生支持 — 原生支持 | 每个服务一个 nginx server 块 |
| 真实客户端 IP | 原生支持 — 原生支持 | 每应用解析 X-Forwarded-For |
| JWT · Basic · IP · Token 认证 | 原生支持 — 原生支持 | 每应用中间件 + 会话库 |
| 自定义域名 + TLS | 原生支持 — 原生支持 | Cloudflare / DNS-01 / nginx 重载 |
| 集中请求审计 | 原生支持 — 原生支持 | nginx 日志 + 日志采集器 + 索引 |
| 可嵌入 iframe 的 URL | 原生支持 — 原生支持 | 每应用手动配置 CORS/CSP/TLS |
| 运行在自有硬件上 | 原生支持 — 原生支持 | 无论如何都需要自己运行 |
如果已在 Kubernetes 上使用 ingress controller、通过 Cloudflare Tunnels 接入 Okta SSO,或使用 Tailscale 进行 L3 私有访问,这些工具在其特定场景下仍然更优。当首要抽象是「URL 可寻址的容器服务」时,代理才真正发挥价值。
URL 优先模型让六种工作流变得轻而易举
来源于团队实际使用 Hoody 代理的场景模式。
无需反向代理即可发布 API
绑定到 0.0.0.0:4000,即可获得 http-4000.SERVER.containers.hoody.com。跳过 nginx、证书和 DNS 的繁琐配置。
自定义域名 + 自动 TLS
POST /api/v1/proxy-aliases,设置 CNAME,首次请求在 30–60 秒内完成 Let's Encrypt 配置。
通过别名切换实现蓝绿部署
将 api.company.com 指向容器 B,测试,再将别名切回。无需重载配置,无停机。
为 AI 智能体分配可驱动的容器
智能体获得 JWT,代理逐请求验证,智能体通过 HTTPS 写文件、运行命令、查询 SQLite。
多租户 SaaS 子域名
每个租户一个容器;别名为 TENANT.yourapp.com。租户隔离在 URL 层强制执行。
即时撤销
对 Control Plane 发起一次 DELETE 调用,URL 在一秒内失效,不存在缓存污染问题。
一次 API 调用,获得第一个 URL。
创建项目,创建容器,每项服务即刻上线。无需提前搭建基础设施。
另见——/platform/control-plane(代理别名、权限与日志 API)。