默认地址
每个应用都有 https://<app name>-<project>.glac.run,其中 <project> 是项目 id 中的六个字符。应用从创建起就有这个地址;重命名应用会改变它。glac cube get 和应用的 url 会显示它。
发往它的请求会经过平台前面的一个代理,代理负责处理 TLS,并挡住流量洪水 (DDoS)。代理有自己的限制:请求体最大 100 MB,响应最多停顿 125 秒。需要突破这些限制时,给应用设置 direct: true (glac cube update api --direct true):之后它还会在 direct.glac.run 下的 direct_url 上响应,这个地址绕过代理,前面只有平台自己的限制。地址页面并列给出了代理的限制和每个产品的直连域名。
每个应用和每个沙箱链接在 glac.run 下都有自己的域名。在 glac.run 进入公共后缀列表 (Public Suffix List) 之前,其中任何一个域名下的页面都能为整个 glac.run 设置 Cookie,而其他客户的页面可以读到它。请把你应用的 Cookie 限定在它自己的域名上(不设 Domain 属性),也不要信任作用于整个域的 Cookie。
自定义域名
POST /v1/domains 带上 {"domain": "api.example.com", "app": "api"},把你的域名指向一个应用(或带上 {domain, sandbox, port},指向沙箱的某个端口)。响应会列出证明这个域名属于你的 DNS 记录:
- 经过代理(默认,
proxied: true):一条从你的域名指向<token>.glac.run的CNAME。代理会检查域名并签发证书。 - 直连 (
proxied: false):一条指向<token>.direct.glac.run的CNAME;对于不能设置 CNAME 的根域名,则是在_sandbox-domain.<your name>上放一条带令牌的TXT记录,并把该域名的A和AAAA记录指向响应给出的地址。
证书会自动为你签发和续期。域名的每个地址都必须指向平台,直连域名前面不能有其他任何人的代理或 CDN。域名生效后,也要把记录留在你的 DNS 中:没有它,证书就不会续期。
glac domains create api.example.com --app api 做同样的事并打印记录,其余操作用 glac domains ls、get、update 和 rm;SDK(Python 中为 glac.domains)和 MCP 服务器的 domain_* 工具也都可以。
域名的 status 为 pending_verification、pending_certificate、active 或 detached(它的应用或沙箱已被删除)。部署和回滚都不需要修改域名:它跟随应用。一个项目最多有 100 个域名 (403 domain_limit_reached)。注册、修改和删除域名需要有 admin 权限范围的密钥。
在互联网上没有地址的应用
设置了 public: false (--public false) 的应用没有默认地址。项目中的其他服务和沙箱在项目的私有网络上通过 <app name>.internal 访问它,指向它的域名也仍然有效。参见服务与 Compose。
协议
客户端通过 HTTP/1.1、HTTP/2 或 HTTP/3 访问应用。通过 HTTP/2 或 HTTP/3 来的请求,如果你的服务支持不带 TLS 的 HTTP/2 (h2c),就以这种方式到达服务,否则以 HTTP/1.1 到达。无需任何设置:平台会向端口探测一次。通过 HTTP/1.1 来的请求以 HTTP/1.1 到达服务。
- gRPC 在你的服务支持不带 TLS 的 HTTP/2 时可用,普通端口上的 gRPC 服务器都支持(gRPC-Go、tonic、grpc-js、grpcio):一元调用、单向或双向流、元数据、trailer 和状态码都会原样透传。用 TLS 在应用地址的 443 端口上调用它。
- 一次调用或一个流算一个请求,无论它保持打开多久、传过多少条消息。在它打开期间,实例保持运行并按运行计量,所以请给长时间的流设置截止时间。
- 追踪请求头。请求的
traceparent和tracestate(W3C Trace Context) 会按客户端发送的原样到达你的服务,HTTP/1.1 和 HTTP/2 都一样,除非应用让平台参与其请求的追踪(它的traces):这时你的服务收到的是平台自己的traceparent,它的 span 是你的 span 的父 span;只有当应用接受客户端的追踪时,才会收到客户端的tracestate。参见追踪。 - WebSocket 通过 HTTP/1.1 连接。实例休眠时它保持打开,上面来了新数据就会唤醒实例。
- 到你服务的连接是共享的。响应之后,平台会让它到实例端口的连接再保持片刻(没有键的实例为一秒,键控实例或沙箱为 200 毫秒),并在这个连接上发送下一个请求,这个请求可能来自另一个客户端;在 HTTP/2 上,一个连接本来就承载所有客户端的请求。所以像 NTLM 那样把登录绑定到 TCP 连接上的服务,不能放在这些地址后面。这样保持的连接不会让实例保持运行。