参考

API 概览

Tiyi 暴露唯一一份 ConnectRPC API。同一份 proto 同时为 Vben Admin UI(HTTP 上的 JSON)、tiyi CLI(HTTP 上的 JSON)与节点流(gRPC 双向)服务。proto/tiyi/v1/*.proto 是唯一的真相源 —— CLI 与 API 由架构保证同步。

传输

鉴权

三种鉴权面,按部署上下文选用:

鉴权面机制使用方
本地管理 socket admin.sock 上的 OS 文件权限 与服务端同主机的 tiyi CLI。
HS256 JWT HTTP 上的 Authorization: Bearer <jwt> Vben Admin UI、远程 CLI、任何从主机外驱动 API 的客户端。由 AuthService.Login 签发;RefreshToken 刷新。
节点流 token 一次性入网 token → 长期流 token 双向 AgentStream 上的节点。token 通过 AgentService.IssueEnrollmentToken 签发。

登录示例

$ curl -sS http://primary:8080/tiyi.v1.AuthService/Login \
    -H "Content-Type: application/json" \
    -d '{"username":"admin","password":"..."}'
{
  "accessToken": "<jwt>",
  "refreshToken": "<refresh>",
  "user": { "id": "<uuid>", "role": "Administrator" }
}

14 个服务

服务范围
SystemService健康、版本、Dashboard 汇总、设置、发布、复制、提主/降级。
AuthService登录、登出、刷新、当前用户、OIDC 重定向、access code。
UserService用户 CRUD、锁定/解锁、密码重置。
RoleService角色 + 权限查询。RBAC 表内置。
SiteService站点 CRUD、启用/停用、预览、按站点策略覆盖。
UpstreamService上游池 CRUD;引用中拒绝删除。
CertService上传、ACME 签发/续期、DNS provider CRUD。
PolicyServiceWAF 策略 CRUD、按层更新、版本快照、SecLang 预览、测试台。
RuleOverrideService按规则覆盖、自定义规则、IP 列表、限速端点。
CrsServiceCRS 目录浏览 + 导入 + 排除包安装/挂载。
AgentService节点 CRUD、入网 token、安装脚本、命令、节点组、AgentStream
TrustService客户端 IP 信任配置(租户 + 站点覆盖)、CDN 快照列表/刷新、explain。
AlertService告警规则 + 通道 CRUD、活动告警 ack/resolve、通道发送测试。
LogService安全/访问/错误/审计查询、获取、导出、实时跟踪。

错误码

Tiyi 返回标准 ConnectRPC 错误码(从 gRPC 映射)。CLI 与 UI 在标准码之上展现本地化消息:

HTTP常见原因
invalid_argument400参数形状或值被验证器拒绝。
unauthenticated401缺失或无效 JWT。
permission_denied403JWT 没有所需 RBAC 权限。
not_found404资源 ID 不存在或已软删除。
already_exists409违反唯一性约束(站点名、策略名等)。
failed_precondition412版本冲突、UPSTREAM_IN_USE、复制延迟门槛等。
unimplemented501RPC 未挂载(罕见 —— 2026-05-26 的 changelog 关闭了最后一批)。
internal500服务端 bug 或基础设施失败。相关情况下审计链有一行。

RBAC

每一个 RPC 声明一个权限要求,例如 site:readpolicy:writelog:readsystem:write。中间件把 JWT subject 的角色与权限表比对;权威映射在 internal/api/middleware.go。v3.0.0-rc.1 中有 52 个细粒度权限。

流式 RPC

权威规约

源码树中的 PRD-API 文档是每一个 RPC 的权威规约。它列出每个方法的请求/响应形状、RBAC 权限、错误码与审计行契约。本文档覆盖运维表面;那份文档覆盖 API 契约。它们应当一致 —— 不一致请提 issue。

生成式参考从 proto/ 重新生成 Connect Go 与 Protobuf Go:

$ make proto
$ ls internal/api/gen/tiyi/v1/
# 每个 .proto 对应 <service>.pb.go 与 <service>.connect.go