Skip to content
导航

查看应用日志:实例的输出、每个请求一行、平台的操作

应用所有实例在所有服务它的机器上的日志行,合并为一个序列。所需权限范围:read。

日志行分三种。output:实例的启动命令在标准输出或标准错误上打印的一行。request:交给实例的每个请求一行,在响应结束时写入;被所到机器拒绝的每个请求也有一行。platform:平台做了什么(实例的创建、停止、退役、删除,各附原因;机器开始服务某个版本,以及把它撤下),日志丢弃或丢失了什么,以及本调用对它所读取的机器要说明的情况。

日志行存放在哪里。每台服务该应用的机器保存自己实例的日志行,并随到随传到对象存储,分段用项目自己的密钥加密(见 sandboxd/openapi/openapi.json 中的 POST /internal/logs/shipped);没有上传的行,机器不会丢弃。读取时先取对象存储中的内容,再逐台机器取其后的内容,合并为一个序列:账户套餐保留天数内的每一行(按控制平面的默认启动设置,免费版 3 天,付费版 30 天;见 GET /v1/apps/{app}/logs/usage 的 kept_until),无论机器还在还是已经不在,无论实例在运行还是早已删除。已删除实例最后打印的内容,也和其他内容一样通过本调用读取,最后一行会说明它已被删除及原因。机器自己会为现存的实例保留最后几 MB 的输出,为已删除的实例保留最后 1 MB,保留七天(具体数字见机器的 GET /internal/node 中的 app_logs,其中还说明了机器会截断多长的行,以及实例打印速度超过保留速度时会丢弃什么,每次都会在日志中注明);已上传的内容另外保存在对象存储中。

缺失的行。如果机器在上传最后几行之前就从记录中消失,或者丢失了它为该应用保存的内容,这些行就永久缺失,在它们本应出现的位置会有一行说明(logs.gap,带 reason 为 node_gone 或 log_gone、from、to,以及最多缺失多少行);对象存储中无法读取的分段也一样 (unreadable)。无论读取请求筛选什么,这些行都会发送,只受时间范围限制。暂时无法上传的机器(对象存储连不上)会保留日志行,直到达到它为单个应用保留的上限,然后丢弃最旧的行,并用自己的一行说明(logs.gap,node_buffer:和其他日志行一样,最多每秒一行),计数中也会体现(用量中的 not_kept.node_buffer)。

一次读取读多少。一次读取最多从对象存储读取 256 MiB 的日志行,最长 10 秒(按控制平面的默认启动设置:--log-read-mib、--log-read-seconds):读到这么多时,无论是否在跟踪,都会以一个表示还有更多内容的标记 (more) 结束,读取方用游标继续。按内容筛选的行(status、method、path、request_id、event、stream、contains)会在读取到的全部内容中查找,包括对象存储和各机器上的。

顺序。同一台机器的行按该机器的顺序排列:按时间排序,请求行排在其实例为该请求打印的内容之后,误差在实例时钟与机器时钟相差的几毫秒之内(机器会把实例的时钟校准到与自己相差 5 毫秒以内):每行在采集处打上时间戳,输出行用实例的时钟(在代理程序从命令取得该行时),请求行用机器的时钟(在响应结束时)。不同机器之间,时间较早的行排在前面,各行的时间以各自机器的时钟为准:时钟有偏差的两台机器,其日志行的交错也会有相应的偏差,时间本身不做任何修改。只要另一台机器可能还有更早的行,这一行就不会发送;在跟踪的响应中最多为此等待 0.4 秒,在不跟踪的响应中最多等待 5 秒。有两类内容虽然排在某些行之后,时间却早于这些行:机器构建版本模板时启动命令打印的内容(from:template;每台机器一次),以及 template.built。

游标。每一行都带有 cursor:读完该行后,读取方在它有日志行的每台机器上所处的位置。读取方带着它回来(参数 cursor;事件流会自动把最后一个事件的 id 作为 Last-Event-ID 发送),就能收到之后的每一行,恰好一次,不重复也不遗漏。连接中断的代价,只是重新读取正在途中的内容。只要各机器还保留游标之后的行,游标就一直有效:机器之后丢弃的内容不会出现在响应中。

连不上的机器。响应中会缺少它的行,并有一行说明 (logs.incomplete),只说一次:适用于服务该应用某个版本的机器、读取方的游标在其上有位置的机器,以及本调用读取时断开的机器。其他机器的行照常到达。跟踪的读取方会在该机器重新连上时收到通知 (logs.complete),然后收到机器在此期间保存的内容,这些行带着它们自己的时间;不跟踪的读取方则在下次调用时凭游标收到它们。logs.anew:某台机器重新开始保存该应用的日志,之前保存的内容已不在,它的日志从头读取。

响应是逐行的 JSON,每行对应一条日志 (application/x-ndjson);如果请求带 Accept: text/event-stream,则为事件流:事件名是日志行的种类,事件的 id 是游标,数据是去掉 cursor 的日志行。mark 不是日志行:它在没有内容可发送时说明读取方所处的位置,出现在不跟踪的响应末尾,以及跟踪的响应中每静默十五秒时。不跟踪的响应在所有机器的内容都发送完后结束。跟踪的响应一直持续到读取方离开;跟踪到某个时间 (until) 的响应持续到该时间之后两秒。

平台写入的日志行不包含应用环境中的任何内容:请求行只有去掉查询部分的路径,除请求 id 外不含任何请求头。启动命令打印的内容属于应用自己,按打印时的原样记入日志,只有应用所在的项目能读取:对其他项目的密钥来说,这个应用并不存在,对象存储中的分段也用一个不加密其他项目日志行的密钥加密。已删除应用的日志按应用的 id 读取,不能按名称读取,在账户套餐保留日志行的期限内都可读取;其所有者可以用 DELETE /v1/apps/{app}/logs 删除某个时间之前的日志行。

GET
https://api.glac.ai/v1/apps/{app}/logs

授权

  • apiKeyHTTPrequired

路径参数

  • appstringrequired

    应用的 id (app-...) 或名称。

查询参数

  • sinceoptionalstring

    该时间及之后的行。

    format: date-time
  • untiloptionalstring

    该时间之前的行。

    format: date-time
  • instanceoptionalstring

    单个实例的行,按 id 指定 (sbx-...)。

  • versionoptionalstring

    单个版本的行:用 id (ver-...) 或版本号指定。

  • kindsoptionalstring

    要哪几种行:output、requests 和 platform 中的若干种,用逗号分隔。不给出时:全部。本调用对它所读取的机器的说明(logs.incomplete 等),无论请求什么都会发送。

    pattern: ^(output|requests|platform)(,(output|requests|platform))*$
  • followoptionalboolean

    true:响应持续发送新到的行,每行在写入后一秒内送达,调用之后创建的实例的行也包括在内。

    default: false
  • cursoroptionalstring

    读取方已有的最后一行的 cursor:响应从它之后开始。

    pattern: ^lc1-[A-Za-z0-9_-]*$
  • statusoptionalstring

    status 等于该值 (500)、在该百位段内 (5xx)、不小于该值 (>=400) 或小于该值 (<300) 的请求行。

    pattern: ^([1-9][0-9][0-9]|[1-9]xx|>=[1-9][0-9][0-9]|<[1-9][0-9][0-9])$
  • methodoptionalstring

    该方法的请求行,大小写均可。

    maxLength: 16 · minLength: 1
  • pathoptionalstring

    path 以此开头的请求行。

    maxLength: 1024 · minLength: 1
  • request_idoptionalstring

    该 id (request_id) 对应请求的那一行。

    maxLength: 64 · minLength: 1
  • eventoptionalstring

    该 event 的平台行。

    maxLength: 64 · minLength: 1
  • streamoptionalstdout或stderr

    该输出流的输出行。

  • containsoptionalstring

    text 或 message 中包含该内容的行,按原样匹配(区分大小写)。

    maxLength: 1024 · minLength: 1

请求头参数

  • Last-Event-IDoptionalstring

    用于事件流:读取方已有的最后一个事件的 id,即一个游标。查询中的 cursor 优先于它。

Returns

200

日志行。响应开始后出现的问题会在响应中说明 (logs.incomplete),或者导致响应结束。

EVENT-STREAM
X-NDJSON

以下之一:

  • LogOutput
    • timestringrequired

      打印时间,UTC,精确到微秒:按实例自己的时钟,机器在创建和唤醒实例时会校准它,误差不超过机器对实例最近两次读取之间的时间。

      format: date-time
    • kindoutputrequired
    • instancestring | nullrequired

      打印它的实例,按 id。机器构建版本模板时启动命令打印的行为 null (from)。

    • versionstring | nullrequired

      实例所属版本的 id。

    • streamstdout或stderrrequired
    • textstringrequired

      该行内容,不含结束它的换行符以及之前的回车符。不是 UTF-8 的字节会被替换 (U+FFFD)。尚未结束的行,在其最后一个字节已过一秒,或其实例被停止或删除时,按已收到的部分给出。

    • cursorstringrequired

      读完这一行后读取方所处的位置。

    • cut_bytesoptionalinteger

      该行超出了机器为单行保留的长度(默认 16,384 字节,除非机器另有设置):此值为从末尾截掉的字节数。

      minimum: 1
    • fromoptionaltemplate

      该行是在机器构建版本模板时、模板保存之前打印的:该机器上的每个实例都从这一行之后开始,它不属于任何实例。每台构建模板的机器各一次。

  • LogRequest
    • timestringrequired

      响应的最后一个字节从实例发出的时间,或者机器拒绝该请求的时间。

      format: date-time
    • kindrequestrequired
    • instancestring | nullrequired

      请求交给的实例。null:没有交给任何实例 (refused)。

    • versionstring | nullrequired

      请求所针对的版本的 id。

    • request_idstringrequired

      请求的 id:请求自带的 X-Request-Id,或机器为它生成的 id。实例会在这个请求头中收到它,因此实例打印的内容可以像这一行一样指明是哪个请求。

    • methodstringrequired
    • pathstringrequired

      请求的路径,不含 ? 之后的部分,最多前 1024 个字节。

    • statusinteger | nullrequired

      响应的状态码:实例的,或者机器拒绝请求时机器自己的。null:实例没有响应就关闭了连接。

    • duration_msnumberrequired

      从机器读完请求头到响应的最后一个字节,单位为毫秒。请求等待实例的时间也包括在内。

      minimum: 0
    • bytesintegerrequired

      转发的响应字节数,包括响应头。

      minimum: 0
    • cursorstringrequired
    • refusedoptionalstring

      机器自己回答了该请求,错误码为:应用在那里已满(app_full_here:边缘节点随后会尝试另一台机器;app_at_capacity),或者实例无法接收该请求。

    • instance_wasoptionalpaused或asleep

      请求到来时实例没有在运行,为它启动了实例。

    • wake_msoptionalnumber

      与 instance_was 一起:请求等待实例启动的时间,单位为毫秒。

      minimum: 0
    • upgradedoptionaltrue

      响应为 101,连接随后被原样转发,直到关闭。

    • timesoptionalinteger

      对于拒绝:这一秒机器以该错误码拒绝了该版本多少个请求,这一行对应其中的第一个。

      minimum: 1
    • sample_rateoptionalnumber

      如果应用保留的请求比例低于 1:这一行代表的比例,读取方可以据此还原总数。1:请求失败了,失败的请求全部保留 (keep_errors)。

      maximum: 1 · minimum: 0
    • trace_idoptionalstring

      请求带有符合 W3C Trace Context 规范的 traceparent 请求头:其链路的 id。发给导出目标的这一行的记录中,它作为 TraceId。

      pattern: ^[0-9a-f]{32}$
  • LogPlatform
    • timestringrequired
      format: date-time
    • kindplatformrequired
    • instancestring | nullrequired

      该行涉及的实例。null:涉及的是某台机器上的版本,或这次读取本身。

    • versionstring | nullrequired

      版本的 id。本调用对其所读取的机器的说明为 null。

    • eventstringrequired

      机器上:template.built(该版本的模板在那里构建完成;该行带有构建的时间)、version.served(机器被通知服务该版本)、version.removed(以及不再服务它,带 reason)、instance.made(took_ms、from_pool、kept)、instance.stopped(空闲实例被暂停或休眠:how、idle_ms、times;同一实例最多每秒说明一次)、instance.woken(静止的实例在没有请求的情况下被启动,因为应用要保持一定数量的实例运行:instance_was、wake_ms;由请求启动的实例没有这样的行,请求行会说明)、instance.retired(从此不再给该实例任何请求,手头的请求结束后它就会离开:reason)、instance.deleted(reason;实例的最后一行)、output.dropped(实例一秒内打印的行数超过了机器保留的上限:lines、bytes、reason)、output.lost(输出在机器读取之前就已从实例中消失:bytes、reason)、output.unavailable(实例来自平台开始保留启动命令输出之前的模板)、logs.keep_off 和 logs.keep_on(从此该版本的输出只保存在机器上、不长期保留,以及从此重新长期保留:reason)、logs.restarted(写这一行的程序之前的那个机器程序没有按顺序停止就结束了:它最后时刻尚未保存的请求行和平台行缺失,实例打印的内容会继续读取;last_seen)、logs.gap(机器在保存了单个应用的全部上限后,丢弃了尚未上传到对象存储的行:reason 为 node_buffer,from、to、lines、bytes;最多每秒说明一次)。本调用的:logs.incomplete、logs.complete、logs.anew (machines_unreachable),以及 logs.gap(永久缺失的行:reason 为 node_gone、log_gone 或 unreadable,from、to、lines,时间为该时段的开始)。export.dropped(日志行没有导出到项目的某个导出目标 (/v1/destinations):它们等待的时间超过了导出程序的上限,或者早于它能暂存的最后那部分:destination、destination_id、lines、from、to、reason;对于应用指标,未导出的是分钟,signal 为 metrics,用 minutes 代替 lines)。export.failing(某个导出目标在该机器上接收该应用的日志或指标时变为 failing:destination、destination_id、signal、since、error、next_try;每段失败期只说明一次,无论期间重试了多少次)以及 export.recovered(它重新接收了一批数据,失败期就此结束:destination、destination_id、signal、since,期间未发给它的 lines 或 minutes,rejected)。这三种都会作为一条记录发往其所指的导出目标,不发往其他目标。

    • messagestringrequired

      用一句话向人说明该事件。

    • cursorstringrequired
    • reasonoptionalstring

      原因。version_left:应用的流量已离开该版本,或者机器不再服务该应用。app_deleted:应用已被删除。broken:实例的端口不接受连接,或实例失败了。idle:空闲时间超过了实例的保留时长。deleted:被调用删除 (DELETE /v1/sandboxes/{id}),或被其机器删除而没有说明其他原因。丢弃输出的原因:rate_limit。丢失输出的原因:guest_buffer(两次读取之间打印的内容超过了实例的保留量)、deleted_unread(实例被就地删除,停止之前尚未交出的内容随之丢失)、agent_restarted(实例中保存输出的程序重新开始;丢失了多少无从得知)。logs.keep_off 和 logs.keep_on 的原因:setting(应用的 logs.keep)、over_plan(应用所属的账户已用完套餐包含的日志额度,且没有余额支付更多:这是控制平面的判断,即应用的 logs_over_plan);对 logs.keep_on 而言,是结束的那个原因。logs.gap 的原因:node_buffer(机器已保存了单个应用的全部上限,而对象存储连不上)、node_gone(机器已从记录中消失)、log_gone(机器丢失了它为该应用保存的内容,或重新开始保存)、unreadable(对象存储中有一个分段无法读取)。export.dropped 的原因:destination_down(导出目标没有接收,或连不上)、destination_slow(它接收的速度慢于数据到来的速度)、egress_stopped(账户发往互联网的流量被停止了)、exporter_down(这些行还足够新时,机器上没有运行导出程序)、node_buffer(机器在导出目标接收之前丢弃了它们:应用已达到单个应用的全部保留上限)。

    • fromoptionalstring

      logs.gap:缺失的最早那一行的时间,或者从何时起缺失。export.dropped:未导出的最早那一行的时间。

      format: date-time
    • tooptionalstring

      logs.gap:缺失的最晚那一行的时间,或者缺失到何时为止。export.dropped:未导出的最晚那一行的时间。

      format: date-time
    • took_msoptionalnumber | null

      instance.made:创建所用的时间,单位为毫秒。

    • from_pooloptionalboolean | null

      instance.made:该实例是否为预先创建好、在等待的实例。

    • keptoptionalboolean

      instance.made:是否在没有请求的情况下创建,因为应用要保持一定数量的实例运行(其 scale 的 min_instances)。这种实例的日志不以请求开头。

    • howoptionalstring

      instance.stopped:就地暂停,或者保存内存并停止其虚拟机。

    • idle_msoptionalnumber

      instance.stopped:已空闲多久,单位为毫秒。

    • timesoptionalinteger

      instance.stopped:这一行代表多少次停止。

      minimum: 1
    • instance_wasoptionalpaused或asleep

      instance.woken:实例被启动时所处的状态。

    • wake_msoptionalnumber

      instance.woken:启动所用的时间,单位为毫秒。

      minimum: 0
    • linesoptionalinteger

      output.dropped:多少行。logs.gap:各类行合计缺失多少行;对 node_gone 和 log_gone 为最多缺失的行数。export.dropped:多少行没有导出。以上均为 1 或更多。日志的 export.recovered:导出目标失败期间有多少行没有发给它,被它拒绝或超出导出程序的上限;0 或更多。

      minimum: 0
    • bytesoptionalinteger | null

      output.dropped:这些行共有多少字节。output.lost:多少字节;不知道时为 null。node_buffer 的 logs.gap:其中输出行的 text 的字节数。

    • last_seenoptionalstring | null

      logs.restarted:之前的机器程序最后一次被看到在运行的时间,误差在一秒以内;它没有留下相关记录时为 null。

      format: date-time
    • machines_unreachableoptionalinteger

      logs.incomplete、logs.complete、logs.anew:保存该应用日志行的机器中,现在有多少台连不上。

      minimum: 0
    • destinationoptionalstring

      export.dropped、export.failing、export.recovered:导出目标的名称。

    • destination_idoptionalstring

      export.dropped、export.failing、export.recovered:导出目标的 id。

      pattern: ^dst-
    • signaloptionallogs或metrics或traces

      应用指标分钟数的 export.dropped:metrics。export.failing、export.recovered:导出目标接收的哪一类失败了:日志、指标或链路追踪。

    • minutesoptionalinteger

      指标的 export.dropped:多少分钟没有导出(from 为第一分钟的开始,to 为最后一分钟的结束),1 或更多。指标的 export.recovered:导出目标失败期间有多少分钟没有发给它,0 或更多。

      minimum: 0
    • spansoptionalinteger

      链路追踪的 export.recovered:导出目标失败期间,应用请求的 span 有多少个没有发给它,0 或更多。(未发送的 span 没有 export.dropped 行:请求自己的那一行在日志中。)

      minimum: 0
    • sinceoptionalstring

      export.failing、export.recovered:这段失败期中第一次失败的尝试是何时进行的;同一段失败期的两行给出的时间相同。

      format: date-time
    • erroroptionalobject

      export.failing:导出目标在该机器上变为失败时出了什么问题,与其状态给出的一致 (last_error)。

      • codestringrequired

        用一个词说明原因:不会重发的响应(status、redirect),会重发且持续了一分钟的响应(status 为 429、502、503、504),不在公共互联网上的地址 (address),持续一分钟无法连接 (unreachable) 或没有及时响应 (no_answer)。

      • statusinteger | nullrequired

        响应的状态码;null:没有响应。

      • messagestringrequired

        它说了什么,或者为什么没有响应,导出目标的所有请求头的值都已去掉;什么都没说时为空。

        maxLength: 512
    • next_tryoptionalstring | null

      export.failing:下次尝试该导出目标的时间。

      format: date-time
    • rejectedoptionalinteger

      export.recovered:期间未发送的行(分钟、span)中有多少被导出目标拒绝;其余的则是等待时间超过了导出程序的暂存时长(行和分钟的 export.dropped)。

      minimum: 0
  • LogMark
    • kindmarkrequired
    • cursorstringrequired
    • moreoptionalboolean

      这次读取已读满单次读取对象存储的上限,并在这里结束:游标之后还有更多内容,读取方可以接着读。

{
  "time": "2019-08-24T14:15:22Z",
  "kind": "output",
  "instance": "string",
  "version": "string",
  "stream": "stdout",
  "text": "string",
  "cut_bytes": 1,
  "from": "template",
  "cursor": "string"
}

400

unknown_parameter;invalid_field:since 或 until 不是时间,instance 不是 id,kinds 指定了不存在的种类,follow 既不是 true 也不是 false,status 不是它接受的任何形式,stream 既不是 stdout 也不是 stderr,method、path、request_id、event 或 contains 为空或超出允许的长度;invalid_cursor:不是本调用给出的游标。
JSON
  • errorobjectrequired
    • typestringrequired
    • codestringrequired
    • messagestringrequired
    • paramstring | nullrequired
    • retryablebooleanrequired
    • request_idstringrequired
    • docs_urlstring | nullrequired
  • move_idoptionalstring

    随 already_moving 返回:该沙箱正在进行的迁移。

  • upgrade_idoptionalstring

    随 upgrade_in_progress(该键尚未结束的升级)、upgrade_started(已开始的升级)和 rollback_gone(回退被拒绝的那次升级)返回:即那次升级。

    pattern: ^upg-[0-9a-hjkmnp-tv-z]{16}$
  • moveoptionalobject

    随 move_over、move_going_back 和 move_taken_over 返回 (POST /internal/moves/{id}/cancel):迁移的当前状态。

    • objectstringrequired
    • idstringrequired
      pattern: ^mov-[0-9a-hjkmnp-tv-z]{16}$
    • sandbox_idstringrequired
    • project_idstringrequired
    • fromobjectrequired
      • idstringrequired
      • namestring | nullrequired

        节点名称;之后已从记录中消失的节点为 null。

    • toobjectrequired
      • idstringrequired
      • namestring | nullrequired

        节点名称;之后已从记录中消失的节点为 null。

    • epochintegerrequired

      迁移开始时表中记录的沙箱纪元:旧节点在这个纪元释放它,新节点在纪元加一时接管它,旧节点在纪元加二时收回它,从对象存储接管则在纪元加三时。

      minimum: 1
    • stepstringrequired

      迁移的进展:releasing(正在请旧节点释放它;表中记录它在旧节点上)、taking_over(正在请新节点接管它;表中记录它在新节点上)、reclaiming(新节点拒绝了它,正在请旧节点收回)、restoring(旧节点没有保留它的任何东西,正从对象存储接管)、done(已在新节点上)、failed(留在原处,或回到了原处,或停在某个时间无法消除的故障或运营方的取消发生时所在的位置:error 说明原因)。

    • whystringrequired

      发起迁移的原因:运营方的迁移、撤离或恢复。

    • wakebooleanrequired

      新节点是否唤醒它:按调用的指定,或按迁移开始时它的状态(是否在运行)。

    • from_storebooleanrequired

      新节点只从对象存储接管它。

    • releaseobject | nullrequired

      旧节点释放时的响应(sandboxd/openapi/openapi.json,releaseSandbox),不含释放所用的密钥;响应之前为 null。

    • takeoverobject | nullrequired

      结束迁移的那次接管的响应(节点文档中的 takeoverSandbox):磁盘和内存来自哪里 (source)、各用了多长时间 (ms)、memory;之前为 null。

    • errorrequired

      失败的迁移:失败原因(如果被带回旧节点,则为新节点的拒绝原因);已完成的迁移:null;进行中的迁移:如果当前步骤要再次请求,则为该步骤上次得到的答复。

      以下之一:

      • object
      • null
    • attemptsintegerrequired

      当前步骤已请求了多少次,仍没有得到确定的答复。

      minimum: 0
    • next_attempt_atstring | nullrequired

      该步骤何时再次请求;不在等待时为 null。

      format: date-time
    • batchstring | nullrequired

      它所属的撤离 (evc-…) 或恢复 (rcv-…)。

    • created_atstringrequired
      format: date-time
    • updated_atstringrequired
      format: date-time
    • ended_atstring | nullrequired
      format: date-time
  • lease_untiloptionalstring

    随 lease_held 返回:节点最后获得的租约最晚可以持有到何时,再加上让节点察觉租约到期所需的时间(在此之前 recoverNode 会被拒绝)。

    format: date-time
  • activeoptionalobject | null

    随 standby 返回:备用副本最后一次读取租约时的活动副本;没有副本持有租约时为 null。

    • namestringrequired
    • urlstringrequired
    • termintegerrequired
      minimum: 1
  • allowed_hostsoptionalarray | null

    随 secret_host_not_allowed 返回:机密可以发往的主机,即机密上设置的主机;没有设置时为 null(节点的 SecretHosts)。

  • problemsoptional数组,元素为object

    随 invalid_definition 返回:定义中的每个问题,各附其位置和内容。

    • atstringrequired

      在定义中的位置,用点分隔的路径 (services.web.port);针对整个定义时为空。

    • messagestringrequired
  • reportoptionalobject

    随 compose_refused 返回:导入的报告,说明拒绝了什么、为什么以及要改什么。

    • objectcompose_importrequired
    • namestring | nullrequired

      模型的 name:即每个服务的标签 compose.project。null:模型没有名称。

    • dry_runbooleanrequired
    • strictbooleanrequired
    • profiles数组,元素为stringrequired
    • treatmentsobjectrequired

      报告中每种处理方式各有多少项。

      • doneintegerrequired
        minimum: 0
      • adaptedintegerrequired
        minimum: 0
      • ignoredintegerrequired
        minimum: 0
      • refusedintegerrequired
        minimum: 0
    • items数组,元素为objectrequired

      模型的顶层元素:name,以及每个卷、网络、config、secret 和扩展。

      • atstringrequired

        在模型中的位置:对服务而言,是其属性(ports[0]、depends_on.db、environment.KEY),针对整个服务时为空;对顶层而言,是元素 (volumes.db-data)。

      • treatmentdone或adapted或ignored或refusedrequired

        done:在平台上含义相同;adapted:平台用另一种方式实现同样的效果;ignored:只对本地运行有意义(带 strict 时会被拒绝);refused:平台做不到,而忽略它会让程序悄悄出错。

      • whystringrequired
      • changestring | nullrequired

        被拒绝的项:要改什么。其他情况为 null。

    • services数组,元素为objectrequired

      导入所采纳的服务,按模型中的顺序。

      • namestringrequired

        服务的名称,也是其应用的名称。

      • app_idstring | nullrequired

        其应用。null:试运行,且项目中没有该服务。

        pattern: ^app-
      • statuscreated或changed或unchangedrequired

        导入对其应用做了(试运行时为将会做)什么:创建、写入变化的部分,或什么都不做。

      • kindservice或jobrequired

        job:模型中有服务等待它完成,它会在每次需要它的部署中运行到结束。

      • statefulbooleanrequired

        它挂载自己的存储卷:只有一个实例,由该实例持有存储卷。

      • versionbooleanrequired

        导入的部署是否为它创建版本:即解析引用后其版本的构成与当前版本不同。

      • items数组,元素为objectrequired
        • atstringrequired

          在模型中的位置:对服务而言,是其属性(ports[0]、depends_on.db、environment.KEY),针对整个服务时为空;对顶层而言,是元素 (volumes.db-data)。

        • treatmentdone或adapted或ignored或refusedrequired

          done:在平台上含义相同;adapted:平台用另一种方式实现同样的效果;ignored:只对本地运行有意义(带 strict 时会被拒绝);refused:平台做不到,而忽略它会让程序悄悄出错。

        • whystringrequired
        • changestring | nullrequired

          被拒绝的项:要改什么。其他情况为 null。

      • appobjectrequired

        导入写入的服务应用字段:其版本的构成,以及立即生效的设置。

        • imagestring | nullrequired

          应用下一个版本的构成,连同其后的七个字段:即其最新版本的构成,加上此后的修改。null:应用没有镜像,也没有版本。

        • image_pull_secretstring | nullrequired

          保存镜像仓库凭据的机密的名称。任何响应都不包含其值。null:没有。

        • start_commandrequired

          以下之一:

          • StartCommand
          • null
        • start_argsrequired

          放在镜像 ENTRYPOINT 之后、取代其 CMD 的内容。null:使用镜像的 CMD,或者整个 start_command。

          以下之一:

          • array<string>
          • null
        • portinteger | nullrequired
        • readyobjectrequired

          判断实例已启动的方式,版本的模板会在实例启动后保存:三者必须恰好给出一个。前两种从实例外部检查,所以服务必须监听所有地址 (0.0.0.0)。

          • httpoptionalstring

            一个以 / 开头的路径:在应用端口上对它发起 GET,返回 200 到 399 之间的状态码。

          • tcpoptionaltrue

            应用端口接受连接。

          • commandoptional

            在实例中执行成功的一条命令。由实例的 shell 运行:参数列表会被写成一行交给它。

            以下之一:

            • string
            • array<string>
        • env映射,值为stringrequired
        • secrets映射,值为stringrequired

          机密的名称。任何响应都不包含值。

        • sizeobjectrequired

          单个实例最多能使用的资源。按实际用量计费。

          • vcpusintegerrequired
            minimum: 1
          • memory_bytesintegerrequired

            偶数个 MiB(即节点为虚拟机加载内存所用的 2 MiB 页的整数倍),以字节表示。其他任何大小都返回 400 invalid_field(param 为 size.memory_bytes):没有节点会创建这种大小的实例,正如没有节点会创建这种大小的沙箱(节点的 SandboxLimitsCreate.memory_bytes)。

            minimum: 134217728
        • volumes数组,元素为objectrequired
          • volumestringrequired
          • pathstringrequired
          • read_onlybooleanrequired
          • nocopyoptionalunknown

            只有给出为 true 时才会出现。

        • kindstringrequired
        • files数组,元素为objectrequired
          • pathstringrequired
          • modeintegerrequired
          • uidintegerrequired
          • gidintegerrequired
          • contentoptionalstring
          • secretoptionalstring
        • userstring | nullrequired
        • working_dirstring | nullrequired
        • stoprequired

          以下之一:

          • ServiceStop
            • signalstring | nullrequired
            • grace_msinteger | nullrequired
          • null
        • hostnamestring | nullrequired
        • regions数组,元素为stringrequired

          按 na、eu、ap 的顺序。

        • scaleobjectrequired
          • min_instancesintegerrequired

            无论有没有请求,应用在一个区域内保持运行的实例数:即下限。该区域服务该应用的节点按分摊 max_instances 的方式分摊它(两个节点、下限为 2:各一个;下限为 1:一个,在最先尝试的节点上;下限为 5:三个和两个),不在线的节点由其他节点补足。节点在收到通知时就创建自己那部分,而不是等到第一个请求,也不会因为空闲而停止或删除这些实例;它们按运行中的实例计量。0(未设置时的值):没有下限。调低后,超出部分的实例从那一刻起视为空闲,并像空闲实例一样被停止和删除。最多为 max_instances(如果给出),且不超过账户套餐允许应用在一个区域请求的数量(caps.app_instances.limit:5、50 和 500):超出会被拒绝,返回 403 plan_cap_reached。

            minimum: 0
          • max_instancesinteger | nullrequired

            应用在一个区域内最多有多少个实例:由该区域服务该应用的节点分摊。最多为账户套餐允许应用请求的数量(caps.app_instances.limit:免费版 5,付费版 500):超出会被拒绝,返回 403 plan_cap_reached;在允许的套餐上请求的数值会保留,但受当前套餐数值的限制。null:未指定数量的应用使用套餐的数值(caps.app_instances.default:免费版 2,付费版 50),如果 min_instances 更大则用它。告诉节点的数值,不超过账户除其他运行中资源外还能容纳的运行量,也不少于应用当前运行的实例数。

            minimum: 1
          • concurrencyinteger | nullrequired

            单个实例同时处理的上限:边缘节点发给它的请求,加上它在项目网络上打开的连接(经由其服务的地址,节点会按连接把它们分给各个实例;或者直接连到它自己的地址)。达到上限的实例即为已满,更多的请求会创建新实例。null(未设置时的值):没有上限。此时节点会在现有实例的 CPU 或内存接近其规格时增加实例,应用不必猜一个数字;一次只处理一个请求的服务应设为 1。

            maximum: 1000 · minimum: 1
          • sleep_after_msinteger | nullrequired

            实例在没有请求时最多等待多久就停止,单位为毫秒。在这个上限以内,节点根据应用自己的流量选择等待时间:在应用最近一段时间里两次请求之间的间隔上,比较多运行一秒空闲与停止再恢复所花的 CPU 时间,选出成本最低的等待时间;这样,请求间隔比停止成本还短的应用会一直运行,请求间隔很长的应用则在最后一个响应结束后立即停止(0:总是立即停止)。null(未设置时的值):平台的上限,三秒。设置过 100(2026年10月28日之前的默认值)的应用,从那天起视为 null。持续停止的实例会在 delete_after_ms 后被其节点删除,下一个需要实例的请求会得到一个新实例;min_instances 保持运行的实例既不会停止也不会删除。

            maximum: 600000 · minimum: 0
          • sleep_notice_msinteger | nullrequired

            在实例因空闲而停止之前多久,向连接到其客户机 /run/sbx/awake 的程序发送一行 sleep N,单位为毫秒:程序可以借此写出手头的数据、关闭连接,或者发起保持,从而推迟停止。无论它们是否响应,停止都会在这段时间之后到来;没有程序连接时,不会推迟。键控实例也会收到通知。0 或 null:不通知(默认)。

            maximum: 60000 · minimum: 0
          • sleep_hold_max_msintegerrequired

            实例中的程序发起的保持,在空闲时间到期后最多还能让实例运行多久,单位为毫秒:程序连接 /run/sbx/awake,如果某个请求在响应之后还有后续工作,就在响应它之前发送 +,工作完成后发送 -(或关闭连接,或退出);最后一个保持解除 sleep_after_ms 之后,实例停止。超过这个时间,无论有什么保持,实例都会停止;如果 sleep_notice_ms 要求通知,会先向已连接的程序发送 sleep N cap。保持期间实例在运行,并按运行计量。0:不理会保持。null:30000(默认)。

            maximum: 900000 · minimum: 0
          • delete_after_msinteger | nullrequired

            实例空闲多久后被删除,与停止使用同一个起算点:下一个需要实例的请求会得到一个新实例,即版本模板的克隆,不含被删除的实例在内存和磁盘中积累的东西(需要长久保存的数据请放在存储卷或数据库中)。一秒到一小时,一小时是平台的时间,也是上限:超出会被拒绝 (400 invalid_field),需要保持预热的实例应计入 min_instances。null(未设置时的值):节点的一小时 (--app-delete-after-seconds)。修改对应用现有的实例和之后创建的实例同样有效:每个节点至少每秒按应用当前的时间检查一次每个实例。不适用于应用的键控实例,键控实例用 keys.delete_after_idle_ms。

            maximum: 3600000 · minimum: 1000
          • suspend_after_msoptionalinteger | null

            已停止的实例在保存内存并真正休眠之前保持暂停多久,单位为毫秒:暂停时,下一个请求在一两毫秒内得到响应,内存照常计量;休眠时,唤醒要多几毫秒,只计量它保存的数据。节点会把它限制在节点让任何实例保持暂停的最长时间内(十分钟);宿主机内存不足、其他虚拟机需要占用槽位,或者有人请求休眠,都会让它更早休眠。null(默认):节点的最长时间。数据库的 suspend_after_seconds 就是其应用的这一设置。

            maximum: 86400000 · minimum: 1000
          • wake_daily_atoptionalstring | null

            每天的某个 UTC 时刻 (HH:MM),在此时唤醒应用中处于休眠状态的键控实例和有状态服务的实例,让它们完成等待唤醒才能做的工作(比如数据库维护);节点根据应用请求创建和删除的实例只会被请求唤醒。唤醒本身不算活动:唤醒后运行的东西才算,运行完毕后实例会再次休眠。此外,无论这里怎么设置,有状态服务的实例都会为其 PostgreSQL 服务器 pg_cron 任务的下一次运行而被唤醒。null(默认):不唤醒。数据库的 wake_daily_at 就是其应用的这一设置。

            pattern: ^([01][0-9]|2[0-3]):[0-5][0-9]$
        • keysrequired

          以下之一:

          • object
          • null
        • egressobject | nullrequired

          与沙箱相同的出站规则(default、allow、deny、http、inject),没有时为 null;按调用给出的原样保存(PATCH 会像节点那样按键逐个合并)。规则立即生效,不产生新版本:服务该应用的节点会把它们应用到其组内的每个实例上,包括现有的实例(运行中的实例对其已有连接也生效)和之后创建的实例;键控实例不受这些规则约束。控制平面只检查它们是不是由这些键组成、不超过 256 KiB 的对象:规则的内容由节点在应用时检查,节点读不懂其规则的实例,所有出站流量都会被拒绝(节点日志会说明原因)。

          • defaultoptionalallow或deny或null
          • allowoptionalarray | null
          • denyoptionalarray | null
          • httpoptionalarray | null
          • injectoptionalarray | null
          • deny_portsoptionalarray | null

            任何连接都到达不了的端口,TCP 或 UDP,无论连往哪里,也无论规则的其他部分怎么说。浏览器会话的规则总是包含 25、465、587 以及矿池监听的端口(3333、4444、5555、7777、14444、45700):无论其规则如何修改,控制平面都会把它们加上。

        • metadata映射,值为stringrequired
        • logsobjectrequired

          应用日志包含哪些内容,每一项为给出的值或默认值 (AppLogSettings)。

          • outputbooleanrequired
          • keepbooleanrequired
          • requestsobjectrequired
            • sample_ratenumberrequired
              maximum: 1 · minimum: 0
            • keep_errorsbooleanrequired
        • publicbooleanrequired

          是否在其默认域名 (url) 上响应。

        • depends_on数组,元素为objectrequired
          • servicestringrequired
          • conditionstringrequired
        • networkobjectrequired
          • aliases数组,元素为stringrequired
          • endpoint_modestringrequired
        • drivesoptional数组,元素为object

          其实例挂载的云盘 (AppCreate.drives):没有指定时为空列表 []。

          • drivestringrequired
          • pathstringrequired
          • modestringrequired
        • key_drivesoptional数组,元素为object

          每个键的实例自有的云盘 (AppCreate.key_drives):没有给出时为空列表 []。

          • namestringrequired
          • pathstringrequired
          • size_bytesinteger | nullrequired
            format: int64
          • nocopyoptionalunknown

            只有给出为 true 时才会出现。

        • runtimeoptional

          运行时设置 (AppCreate.runtime)。null:没有。

          以下之一:

          • Runtime
            • ulimits映射,值为RuntimeLimitGivenrequired
            • sysctls映射,值为stringrequired
            • tmpfs数组,元素为objectrequired
              • pathstringrequired
              • size_bytesinteger | nullrequired
              • modeintegerrequired
            • dnsobjectrequired
              • servers数组,元素为stringrequired
              • search数组,元素为stringrequired
              • options数组,元素为stringrequired
            • shm_size_bytesinteger | nullrequired
          • null
        • tracesoptionalobject

          应用请求的链路追踪包含哪些内容,每一项为给出的值或默认值 (AppTraceSettings):sample_rate 为 0 时不产生任何 span。

          • sample_ratenumberrequired
            maximum: 1 · minimum: 0
          • trust_incomingbooleanrequired
    • volumes数组,元素为objectrequired

      服务挂载的项目存储卷。

      • modelstring | nullrequired

        它在模型中的名称。null:为有状态服务挂载但未命名卷的路径创建的。

      • namestringrequired

        它在项目中的名称。

      • idstring | nullrequired

        null:尚未创建 (to_make)。

        pattern: ^vol-
      • sharedbooleanrequired

        有多个服务挂载它,或者某个服务有多个实例:每个服务的每个实例同时挂载它。

      • statusto_make或made或there或externalrequired

        to_make:导入会创建它(试运行时对将要创建的存储卷这样说明);made:本次导入创建了它;there:之前的导入创建了它,或者已有同名的存储卷;external:模型把它标为 external,而项目中已有它。

      • used_by数组,元素为stringrequired
    • secrets数组,元素为objectrequired

      模型中授予服务的 secrets。

      • modelstringrequired

        它在模型中的名称。

      • namestringrequired

        保存它的项目机密:即模型中的名称,其中机密名称不允许的每个字符都写成下划线。

      • therebooleanrequired

        项目中是否已有它。导入(非试运行)时如果它还不存在,会被拒绝,返回 404 secret_not_found。

      • used_by数组,元素为stringrequired
    • left_out数组,元素为objectrequired

      属于未启用 profile 的服务,导入不会处理它们。

      • namestringrequired
      • profiles数组,元素为stringrequired
    • absent数组,元素为stringrequired

      项目中有而模型中没有的服务:保持原样。

    • deploystring | nullrequired

      导入触发的部署 (GET /v1/deploys/{id})。null:试运行,或者没有服务需要新版本。

      pattern: ^dpl-
  • accountsoptional数组,元素为object

    随 sole_owner 返回:该用户是唯一所有者的那些账户。

    • idstringrequired
      pattern: ^acct-[0-9a-hjkmnp-tv-z]{16}$
    • namestringrequired

401

missing_api_key, invalid_api_key, expired_api_key, invalid_token.
JSON
  • errorobjectrequired
    • typestringrequired
    • codestringrequired
    • messagestringrequired
    • paramstring | nullrequired
    • retryablebooleanrequired
    • request_idstringrequired
    • docs_urlstring | nullrequired
  • move_idoptionalstring

    随 already_moving 返回:该沙箱正在进行的迁移。

  • upgrade_idoptionalstring

    随 upgrade_in_progress(该键尚未结束的升级)、upgrade_started(已开始的升级)和 rollback_gone(回退被拒绝的那次升级)返回:即那次升级。

    pattern: ^upg-[0-9a-hjkmnp-tv-z]{16}$
  • moveoptionalobject

    随 move_over、move_going_back 和 move_taken_over 返回 (POST /internal/moves/{id}/cancel):迁移的当前状态。

    • objectstringrequired
    • idstringrequired
      pattern: ^mov-[0-9a-hjkmnp-tv-z]{16}$
    • sandbox_idstringrequired
    • project_idstringrequired
    • fromobjectrequired
      • idstringrequired
      • namestring | nullrequired

        节点名称;之后已从记录中消失的节点为 null。

    • toobjectrequired
      • idstringrequired
      • namestring | nullrequired

        节点名称;之后已从记录中消失的节点为 null。

    • epochintegerrequired

      迁移开始时表中记录的沙箱纪元:旧节点在这个纪元释放它,新节点在纪元加一时接管它,旧节点在纪元加二时收回它,从对象存储接管则在纪元加三时。

      minimum: 1
    • stepstringrequired

      迁移的进展:releasing(正在请旧节点释放它;表中记录它在旧节点上)、taking_over(正在请新节点接管它;表中记录它在新节点上)、reclaiming(新节点拒绝了它,正在请旧节点收回)、restoring(旧节点没有保留它的任何东西,正从对象存储接管)、done(已在新节点上)、failed(留在原处,或回到了原处,或停在某个时间无法消除的故障或运营方的取消发生时所在的位置:error 说明原因)。

    • whystringrequired

      发起迁移的原因:运营方的迁移、撤离或恢复。

    • wakebooleanrequired

      新节点是否唤醒它:按调用的指定,或按迁移开始时它的状态(是否在运行)。

    • from_storebooleanrequired

      新节点只从对象存储接管它。

    • releaseobject | nullrequired

      旧节点释放时的响应(sandboxd/openapi/openapi.json,releaseSandbox),不含释放所用的密钥;响应之前为 null。

    • takeoverobject | nullrequired

      结束迁移的那次接管的响应(节点文档中的 takeoverSandbox):磁盘和内存来自哪里 (source)、各用了多长时间 (ms)、memory;之前为 null。

    • errorrequired

      失败的迁移:失败原因(如果被带回旧节点,则为新节点的拒绝原因);已完成的迁移:null;进行中的迁移:如果当前步骤要再次请求,则为该步骤上次得到的答复。

      以下之一:

      • object
      • null
    • attemptsintegerrequired

      当前步骤已请求了多少次,仍没有得到确定的答复。

      minimum: 0
    • next_attempt_atstring | nullrequired

      该步骤何时再次请求;不在等待时为 null。

      format: date-time
    • batchstring | nullrequired

      它所属的撤离 (evc-…) 或恢复 (rcv-…)。

    • created_atstringrequired
      format: date-time
    • updated_atstringrequired
      format: date-time
    • ended_atstring | nullrequired
      format: date-time
  • lease_untiloptionalstring

    随 lease_held 返回:节点最后获得的租约最晚可以持有到何时,再加上让节点察觉租约到期所需的时间(在此之前 recoverNode 会被拒绝)。

    format: date-time
  • activeoptionalobject | null

    随 standby 返回:备用副本最后一次读取租约时的活动副本;没有副本持有租约时为 null。

    • namestringrequired
    • urlstringrequired
    • termintegerrequired
      minimum: 1
  • allowed_hostsoptionalarray | null

    随 secret_host_not_allowed 返回:机密可以发往的主机,即机密上设置的主机;没有设置时为 null(节点的 SecretHosts)。

  • problemsoptional数组,元素为object

    随 invalid_definition 返回:定义中的每个问题,各附其位置和内容。

    • atstringrequired

      在定义中的位置,用点分隔的路径 (services.web.port);针对整个定义时为空。

    • messagestringrequired
  • reportoptionalobject

    随 compose_refused 返回:导入的报告,说明拒绝了什么、为什么以及要改什么。

    • objectcompose_importrequired
    • namestring | nullrequired

      模型的 name:即每个服务的标签 compose.project。null:模型没有名称。

    • dry_runbooleanrequired
    • strictbooleanrequired
    • profiles数组,元素为stringrequired
    • treatmentsobjectrequired

      报告中每种处理方式各有多少项。

      • doneintegerrequired
        minimum: 0
      • adaptedintegerrequired
        minimum: 0
      • ignoredintegerrequired
        minimum: 0
      • refusedintegerrequired
        minimum: 0
    • items数组,元素为objectrequired

      模型的顶层元素:name,以及每个卷、网络、config、secret 和扩展。

      • atstringrequired

        在模型中的位置:对服务而言,是其属性(ports[0]、depends_on.db、environment.KEY),针对整个服务时为空;对顶层而言,是元素 (volumes.db-data)。

      • treatmentdone或adapted或ignored或refusedrequired

        done:在平台上含义相同;adapted:平台用另一种方式实现同样的效果;ignored:只对本地运行有意义(带 strict 时会被拒绝);refused:平台做不到,而忽略它会让程序悄悄出错。

      • whystringrequired
      • changestring | nullrequired

        被拒绝的项:要改什么。其他情况为 null。

    • services数组,元素为objectrequired

      导入所采纳的服务,按模型中的顺序。

      • namestringrequired

        服务的名称,也是其应用的名称。

      • app_idstring | nullrequired

        其应用。null:试运行,且项目中没有该服务。

        pattern: ^app-
      • statuscreated或changed或unchangedrequired

        导入对其应用做了(试运行时为将会做)什么:创建、写入变化的部分,或什么都不做。

      • kindservice或jobrequired

        job:模型中有服务等待它完成,它会在每次需要它的部署中运行到结束。

      • statefulbooleanrequired

        它挂载自己的存储卷:只有一个实例,由该实例持有存储卷。

      • versionbooleanrequired

        导入的部署是否为它创建版本:即解析引用后其版本的构成与当前版本不同。

      • items数组,元素为objectrequired
        • atstringrequired

          在模型中的位置:对服务而言,是其属性(ports[0]、depends_on.db、environment.KEY),针对整个服务时为空;对顶层而言,是元素 (volumes.db-data)。

        • treatmentdone或adapted或ignored或refusedrequired

          done:在平台上含义相同;adapted:平台用另一种方式实现同样的效果;ignored:只对本地运行有意义(带 strict 时会被拒绝);refused:平台做不到,而忽略它会让程序悄悄出错。

        • whystringrequired
        • changestring | nullrequired

          被拒绝的项:要改什么。其他情况为 null。

      • appobjectrequired

        导入写入的服务应用字段:其版本的构成,以及立即生效的设置。

        • imagestring | nullrequired

          应用下一个版本的构成,连同其后的七个字段:即其最新版本的构成,加上此后的修改。null:应用没有镜像,也没有版本。

        • image_pull_secretstring | nullrequired

          保存镜像仓库凭据的机密的名称。任何响应都不包含其值。null:没有。

        • start_commandrequired

          以下之一:

          • StartCommand
          • null
        • start_argsrequired

          放在镜像 ENTRYPOINT 之后、取代其 CMD 的内容。null:使用镜像的 CMD,或者整个 start_command。

          以下之一:

          • array<string>
          • null
        • portinteger | nullrequired
        • readyobjectrequired

          判断实例已启动的方式,版本的模板会在实例启动后保存:三者必须恰好给出一个。前两种从实例外部检查,所以服务必须监听所有地址 (0.0.0.0)。

          • httpoptionalstring

            一个以 / 开头的路径:在应用端口上对它发起 GET,返回 200 到 399 之间的状态码。

          • tcpoptionaltrue

            应用端口接受连接。

          • commandoptional

            在实例中执行成功的一条命令。由实例的 shell 运行:参数列表会被写成一行交给它。

            以下之一:

            • string
            • array<string>
        • env映射,值为stringrequired
        • secrets映射,值为stringrequired

          机密的名称。任何响应都不包含值。

        • sizeobjectrequired

          单个实例最多能使用的资源。按实际用量计费。

          • vcpusintegerrequired
            minimum: 1
          • memory_bytesintegerrequired

            偶数个 MiB(即节点为虚拟机加载内存所用的 2 MiB 页的整数倍),以字节表示。其他任何大小都返回 400 invalid_field(param 为 size.memory_bytes):没有节点会创建这种大小的实例,正如没有节点会创建这种大小的沙箱(节点的 SandboxLimitsCreate.memory_bytes)。

            minimum: 134217728
        • volumes数组,元素为objectrequired
          • volumestringrequired
          • pathstringrequired
          • read_onlybooleanrequired
          • nocopyoptionalunknown

            只有给出为 true 时才会出现。

        • kindstringrequired
        • files数组,元素为objectrequired
          • pathstringrequired
          • modeintegerrequired
          • uidintegerrequired
          • gidintegerrequired
          • contentoptionalstring
          • secretoptionalstring
        • userstring | nullrequired
        • working_dirstring | nullrequired
        • stoprequired

          以下之一:

          • ServiceStop
            • signalstring | nullrequired
            • grace_msinteger | nullrequired
          • null
        • hostnamestring | nullrequired
        • regions数组,元素为stringrequired

          按 na、eu、ap 的顺序。

        • scaleobjectrequired
          • min_instancesintegerrequired

            无论有没有请求,应用在一个区域内保持运行的实例数:即下限。该区域服务该应用的节点按分摊 max_instances 的方式分摊它(两个节点、下限为 2:各一个;下限为 1:一个,在最先尝试的节点上;下限为 5:三个和两个),不在线的节点由其他节点补足。节点在收到通知时就创建自己那部分,而不是等到第一个请求,也不会因为空闲而停止或删除这些实例;它们按运行中的实例计量。0(未设置时的值):没有下限。调低后,超出部分的实例从那一刻起视为空闲,并像空闲实例一样被停止和删除。最多为 max_instances(如果给出),且不超过账户套餐允许应用在一个区域请求的数量(caps.app_instances.limit:5、50 和 500):超出会被拒绝,返回 403 plan_cap_reached。

            minimum: 0
          • max_instancesinteger | nullrequired

            应用在一个区域内最多有多少个实例:由该区域服务该应用的节点分摊。最多为账户套餐允许应用请求的数量(caps.app_instances.limit:免费版 5,付费版 500):超出会被拒绝,返回 403 plan_cap_reached;在允许的套餐上请求的数值会保留,但受当前套餐数值的限制。null:未指定数量的应用使用套餐的数值(caps.app_instances.default:免费版 2,付费版 50),如果 min_instances 更大则用它。告诉节点的数值,不超过账户除其他运行中资源外还能容纳的运行量,也不少于应用当前运行的实例数。

            minimum: 1
          • concurrencyinteger | nullrequired

            单个实例同时处理的上限:边缘节点发给它的请求,加上它在项目网络上打开的连接(经由其服务的地址,节点会按连接把它们分给各个实例;或者直接连到它自己的地址)。达到上限的实例即为已满,更多的请求会创建新实例。null(未设置时的值):没有上限。此时节点会在现有实例的 CPU 或内存接近其规格时增加实例,应用不必猜一个数字;一次只处理一个请求的服务应设为 1。

            maximum: 1000 · minimum: 1
          • sleep_after_msinteger | nullrequired

            实例在没有请求时最多等待多久就停止,单位为毫秒。在这个上限以内,节点根据应用自己的流量选择等待时间:在应用最近一段时间里两次请求之间的间隔上,比较多运行一秒空闲与停止再恢复所花的 CPU 时间,选出成本最低的等待时间;这样,请求间隔比停止成本还短的应用会一直运行,请求间隔很长的应用则在最后一个响应结束后立即停止(0:总是立即停止)。null(未设置时的值):平台的上限,三秒。设置过 100(2026年10月28日之前的默认值)的应用,从那天起视为 null。持续停止的实例会在 delete_after_ms 后被其节点删除,下一个需要实例的请求会得到一个新实例;min_instances 保持运行的实例既不会停止也不会删除。

            maximum: 600000 · minimum: 0
          • sleep_notice_msinteger | nullrequired

            在实例因空闲而停止之前多久,向连接到其客户机 /run/sbx/awake 的程序发送一行 sleep N,单位为毫秒:程序可以借此写出手头的数据、关闭连接,或者发起保持,从而推迟停止。无论它们是否响应,停止都会在这段时间之后到来;没有程序连接时,不会推迟。键控实例也会收到通知。0 或 null:不通知(默认)。

            maximum: 60000 · minimum: 0
          • sleep_hold_max_msintegerrequired

            实例中的程序发起的保持,在空闲时间到期后最多还能让实例运行多久,单位为毫秒:程序连接 /run/sbx/awake,如果某个请求在响应之后还有后续工作,就在响应它之前发送 +,工作完成后发送 -(或关闭连接,或退出);最后一个保持解除 sleep_after_ms 之后,实例停止。超过这个时间,无论有什么保持,实例都会停止;如果 sleep_notice_ms 要求通知,会先向已连接的程序发送 sleep N cap。保持期间实例在运行,并按运行计量。0:不理会保持。null:30000(默认)。

            maximum: 900000 · minimum: 0
          • delete_after_msinteger | nullrequired

            实例空闲多久后被删除,与停止使用同一个起算点:下一个需要实例的请求会得到一个新实例,即版本模板的克隆,不含被删除的实例在内存和磁盘中积累的东西(需要长久保存的数据请放在存储卷或数据库中)。一秒到一小时,一小时是平台的时间,也是上限:超出会被拒绝 (400 invalid_field),需要保持预热的实例应计入 min_instances。null(未设置时的值):节点的一小时 (--app-delete-after-seconds)。修改对应用现有的实例和之后创建的实例同样有效:每个节点至少每秒按应用当前的时间检查一次每个实例。不适用于应用的键控实例,键控实例用 keys.delete_after_idle_ms。

            maximum: 3600000 · minimum: 1000
          • suspend_after_msoptionalinteger | null

            已停止的实例在保存内存并真正休眠之前保持暂停多久,单位为毫秒:暂停时,下一个请求在一两毫秒内得到响应,内存照常计量;休眠时,唤醒要多几毫秒,只计量它保存的数据。节点会把它限制在节点让任何实例保持暂停的最长时间内(十分钟);宿主机内存不足、其他虚拟机需要占用槽位,或者有人请求休眠,都会让它更早休眠。null(默认):节点的最长时间。数据库的 suspend_after_seconds 就是其应用的这一设置。

            maximum: 86400000 · minimum: 1000
          • wake_daily_atoptionalstring | null

            每天的某个 UTC 时刻 (HH:MM),在此时唤醒应用中处于休眠状态的键控实例和有状态服务的实例,让它们完成等待唤醒才能做的工作(比如数据库维护);节点根据应用请求创建和删除的实例只会被请求唤醒。唤醒本身不算活动:唤醒后运行的东西才算,运行完毕后实例会再次休眠。此外,无论这里怎么设置,有状态服务的实例都会为其 PostgreSQL 服务器 pg_cron 任务的下一次运行而被唤醒。null(默认):不唤醒。数据库的 wake_daily_at 就是其应用的这一设置。

            pattern: ^([01][0-9]|2[0-3]):[0-5][0-9]$
        • keysrequired

          以下之一:

          • object
          • null
        • egressobject | nullrequired

          与沙箱相同的出站规则(default、allow、deny、http、inject),没有时为 null;按调用给出的原样保存(PATCH 会像节点那样按键逐个合并)。规则立即生效,不产生新版本:服务该应用的节点会把它们应用到其组内的每个实例上,包括现有的实例(运行中的实例对其已有连接也生效)和之后创建的实例;键控实例不受这些规则约束。控制平面只检查它们是不是由这些键组成、不超过 256 KiB 的对象:规则的内容由节点在应用时检查,节点读不懂其规则的实例,所有出站流量都会被拒绝(节点日志会说明原因)。

          • defaultoptionalallow或deny或null
          • allowoptionalarray | null
          • denyoptionalarray | null
          • httpoptionalarray | null
          • injectoptionalarray | null
          • deny_portsoptionalarray | null

            任何连接都到达不了的端口,TCP 或 UDP,无论连往哪里,也无论规则的其他部分怎么说。浏览器会话的规则总是包含 25、465、587 以及矿池监听的端口(3333、4444、5555、7777、14444、45700):无论其规则如何修改,控制平面都会把它们加上。

        • metadata映射,值为stringrequired
        • logsobjectrequired

          应用日志包含哪些内容,每一项为给出的值或默认值 (AppLogSettings)。

          • outputbooleanrequired
          • keepbooleanrequired
          • requestsobjectrequired
            • sample_ratenumberrequired
              maximum: 1 · minimum: 0
            • keep_errorsbooleanrequired
        • publicbooleanrequired

          是否在其默认域名 (url) 上响应。

        • depends_on数组,元素为objectrequired
          • servicestringrequired
          • conditionstringrequired
        • networkobjectrequired
          • aliases数组,元素为stringrequired
          • endpoint_modestringrequired
        • drivesoptional数组,元素为object

          其实例挂载的云盘 (AppCreate.drives):没有指定时为空列表 []。

          • drivestringrequired
          • pathstringrequired
          • modestringrequired
        • key_drivesoptional数组,元素为object

          每个键的实例自有的云盘 (AppCreate.key_drives):没有给出时为空列表 []。

          • namestringrequired
          • pathstringrequired
          • size_bytesinteger | nullrequired
            format: int64
          • nocopyoptionalunknown

            只有给出为 true 时才会出现。

        • runtimeoptional

          运行时设置 (AppCreate.runtime)。null:没有。

          以下之一:

          • Runtime
            • ulimits映射,值为RuntimeLimitGivenrequired
            • sysctls映射,值为stringrequired
            • tmpfs数组,元素为objectrequired
              • pathstringrequired
              • size_bytesinteger | nullrequired
              • modeintegerrequired
            • dnsobjectrequired
              • servers数组,元素为stringrequired
              • search数组,元素为stringrequired
              • options数组,元素为stringrequired
            • shm_size_bytesinteger | nullrequired
          • null
        • tracesoptionalobject

          应用请求的链路追踪包含哪些内容,每一项为给出的值或默认值 (AppTraceSettings):sample_rate 为 0 时不产生任何 span。

          • sample_ratenumberrequired
            maximum: 1 · minimum: 0
          • trust_incomingbooleanrequired
    • volumes数组,元素为objectrequired

      服务挂载的项目存储卷。

      • modelstring | nullrequired

        它在模型中的名称。null:为有状态服务挂载但未命名卷的路径创建的。

      • namestringrequired

        它在项目中的名称。

      • idstring | nullrequired

        null:尚未创建 (to_make)。

        pattern: ^vol-
      • sharedbooleanrequired

        有多个服务挂载它,或者某个服务有多个实例:每个服务的每个实例同时挂载它。

      • statusto_make或made或there或externalrequired

        to_make:导入会创建它(试运行时对将要创建的存储卷这样说明);made:本次导入创建了它;there:之前的导入创建了它,或者已有同名的存储卷;external:模型把它标为 external,而项目中已有它。

      • used_by数组,元素为stringrequired
    • secrets数组,元素为objectrequired

      模型中授予服务的 secrets。

      • modelstringrequired

        它在模型中的名称。

      • namestringrequired

        保存它的项目机密:即模型中的名称,其中机密名称不允许的每个字符都写成下划线。

      • therebooleanrequired

        项目中是否已有它。导入(非试运行)时如果它还不存在,会被拒绝,返回 404 secret_not_found。

      • used_by数组,元素为stringrequired
    • left_out数组,元素为objectrequired

      属于未启用 profile 的服务,导入不会处理它们。

      • namestringrequired
      • profiles数组,元素为stringrequired
    • absent数组,元素为stringrequired

      项目中有而模型中没有的服务:保持原样。

    • deploystring | nullrequired

      导入触发的部署 (GET /v1/deploys/{id})。null:试运行,或者没有服务需要新版本。

      pattern: ^dpl-
  • accountsoptional数组,元素为object

    随 sole_owner 返回:该用户是唯一所有者的那些账户。

    • idstringrequired
      pattern: ^acct-[0-9a-hjkmnp-tv-z]{16}$
    • namestringrequired

402

account_in_debt:账户欠费(余额低于零),付清之前账户的任何东西都不能使用:其密钥以及其沙箱令牌的每个调用都会这样被拒绝,以下除外:读取欠款和付款的调用;列出和读取其存储卷的备份,以及从备份创建存储卷的调用(POST /v1/volumes,带上 from_backup,正在删除账户存储的数据时除外),这是停止付款的账户最需要的;此外,除非控制平面以 --debt-allows-delete false 启动,还有列出、读取和删除账户存储的存储卷、快照和沙箱,以及删除其备份的调用。新建备份始终不行。在检查密钥的权限范围之前就拒绝,无论路径是什么。错误信息会说明欠款金额、起始时间、账户存储的数据何时会被删除、如何付款、可以删除存储的数据以免金额继续增长,以及仍然可以从备份创建存储卷(GET /v1/billing、debt)。
JSON
  • errorobjectrequired
    • typestringrequired
    • codestringrequired
    • messagestringrequired
    • paramstring | nullrequired
    • retryablebooleanrequired
    • request_idstringrequired
    • docs_urlstring | nullrequired
  • move_idoptionalstring

    随 already_moving 返回:该沙箱正在进行的迁移。

  • upgrade_idoptionalstring

    随 upgrade_in_progress(该键尚未结束的升级)、upgrade_started(已开始的升级)和 rollback_gone(回退被拒绝的那次升级)返回:即那次升级。

    pattern: ^upg-[0-9a-hjkmnp-tv-z]{16}$
  • moveoptionalobject

    随 move_over、move_going_back 和 move_taken_over 返回 (POST /internal/moves/{id}/cancel):迁移的当前状态。

    • objectstringrequired
    • idstringrequired
      pattern: ^mov-[0-9a-hjkmnp-tv-z]{16}$
    • sandbox_idstringrequired
    • project_idstringrequired
    • fromobjectrequired
      • idstringrequired
      • namestring | nullrequired

        节点名称;之后已从记录中消失的节点为 null。

    • toobjectrequired
      • idstringrequired
      • namestring | nullrequired

        节点名称;之后已从记录中消失的节点为 null。

    • epochintegerrequired

      迁移开始时表中记录的沙箱纪元:旧节点在这个纪元释放它,新节点在纪元加一时接管它,旧节点在纪元加二时收回它,从对象存储接管则在纪元加三时。

      minimum: 1
    • stepstringrequired

      迁移的进展:releasing(正在请旧节点释放它;表中记录它在旧节点上)、taking_over(正在请新节点接管它;表中记录它在新节点上)、reclaiming(新节点拒绝了它,正在请旧节点收回)、restoring(旧节点没有保留它的任何东西,正从对象存储接管)、done(已在新节点上)、failed(留在原处,或回到了原处,或停在某个时间无法消除的故障或运营方的取消发生时所在的位置:error 说明原因)。

    • whystringrequired

      发起迁移的原因:运营方的迁移、撤离或恢复。

    • wakebooleanrequired

      新节点是否唤醒它:按调用的指定,或按迁移开始时它的状态(是否在运行)。

    • from_storebooleanrequired

      新节点只从对象存储接管它。

    • releaseobject | nullrequired

      旧节点释放时的响应(sandboxd/openapi/openapi.json,releaseSandbox),不含释放所用的密钥;响应之前为 null。

    • takeoverobject | nullrequired

      结束迁移的那次接管的响应(节点文档中的 takeoverSandbox):磁盘和内存来自哪里 (source)、各用了多长时间 (ms)、memory;之前为 null。

    • errorrequired

      失败的迁移:失败原因(如果被带回旧节点,则为新节点的拒绝原因);已完成的迁移:null;进行中的迁移:如果当前步骤要再次请求,则为该步骤上次得到的答复。

      以下之一:

      • object
      • null
    • attemptsintegerrequired

      当前步骤已请求了多少次,仍没有得到确定的答复。

      minimum: 0
    • next_attempt_atstring | nullrequired

      该步骤何时再次请求;不在等待时为 null。

      format: date-time
    • batchstring | nullrequired

      它所属的撤离 (evc-…) 或恢复 (rcv-…)。

    • created_atstringrequired
      format: date-time
    • updated_atstringrequired
      format: date-time
    • ended_atstring | nullrequired
      format: date-time
  • lease_untiloptionalstring

    随 lease_held 返回:节点最后获得的租约最晚可以持有到何时,再加上让节点察觉租约到期所需的时间(在此之前 recoverNode 会被拒绝)。

    format: date-time
  • activeoptionalobject | null

    随 standby 返回:备用副本最后一次读取租约时的活动副本;没有副本持有租约时为 null。

    • namestringrequired
    • urlstringrequired
    • termintegerrequired
      minimum: 1
  • allowed_hostsoptionalarray | null

    随 secret_host_not_allowed 返回:机密可以发往的主机,即机密上设置的主机;没有设置时为 null(节点的 SecretHosts)。

  • problemsoptional数组,元素为object

    随 invalid_definition 返回:定义中的每个问题,各附其位置和内容。

    • atstringrequired

      在定义中的位置,用点分隔的路径 (services.web.port);针对整个定义时为空。

    • messagestringrequired
  • reportoptionalobject

    随 compose_refused 返回:导入的报告,说明拒绝了什么、为什么以及要改什么。

    • objectcompose_importrequired
    • namestring | nullrequired

      模型的 name:即每个服务的标签 compose.project。null:模型没有名称。

    • dry_runbooleanrequired
    • strictbooleanrequired
    • profiles数组,元素为stringrequired
    • treatmentsobjectrequired

      报告中每种处理方式各有多少项。

      • doneintegerrequired
        minimum: 0
      • adaptedintegerrequired
        minimum: 0
      • ignoredintegerrequired
        minimum: 0
      • refusedintegerrequired
        minimum: 0
    • items数组,元素为objectrequired

      模型的顶层元素:name,以及每个卷、网络、config、secret 和扩展。

      • atstringrequired

        在模型中的位置:对服务而言,是其属性(ports[0]、depends_on.db、environment.KEY),针对整个服务时为空;对顶层而言,是元素 (volumes.db-data)。

      • treatmentdone或adapted或ignored或refusedrequired

        done:在平台上含义相同;adapted:平台用另一种方式实现同样的效果;ignored:只对本地运行有意义(带 strict 时会被拒绝);refused:平台做不到,而忽略它会让程序悄悄出错。

      • whystringrequired
      • changestring | nullrequired

        被拒绝的项:要改什么。其他情况为 null。

    • services数组,元素为objectrequired

      导入所采纳的服务,按模型中的顺序。

      • namestringrequired

        服务的名称,也是其应用的名称。

      • app_idstring | nullrequired

        其应用。null:试运行,且项目中没有该服务。

        pattern: ^app-
      • statuscreated或changed或unchangedrequired

        导入对其应用做了(试运行时为将会做)什么:创建、写入变化的部分,或什么都不做。

      • kindservice或jobrequired

        job:模型中有服务等待它完成,它会在每次需要它的部署中运行到结束。

      • statefulbooleanrequired

        它挂载自己的存储卷:只有一个实例,由该实例持有存储卷。

      • versionbooleanrequired

        导入的部署是否为它创建版本:即解析引用后其版本的构成与当前版本不同。

      • items数组,元素为objectrequired
        • atstringrequired

          在模型中的位置:对服务而言,是其属性(ports[0]、depends_on.db、environment.KEY),针对整个服务时为空;对顶层而言,是元素 (volumes.db-data)。

        • treatmentdone或adapted或ignored或refusedrequired

          done:在平台上含义相同;adapted:平台用另一种方式实现同样的效果;ignored:只对本地运行有意义(带 strict 时会被拒绝);refused:平台做不到,而忽略它会让程序悄悄出错。

        • whystringrequired
        • changestring | nullrequired

          被拒绝的项:要改什么。其他情况为 null。

      • appobjectrequired

        导入写入的服务应用字段:其版本的构成,以及立即生效的设置。

        • imagestring | nullrequired

          应用下一个版本的构成,连同其后的七个字段:即其最新版本的构成,加上此后的修改。null:应用没有镜像,也没有版本。

        • image_pull_secretstring | nullrequired

          保存镜像仓库凭据的机密的名称。任何响应都不包含其值。null:没有。

        • start_commandrequired

          以下之一:

          • StartCommand
          • null
        • start_argsrequired

          放在镜像 ENTRYPOINT 之后、取代其 CMD 的内容。null:使用镜像的 CMD,或者整个 start_command。

          以下之一:

          • array<string>
          • null
        • portinteger | nullrequired
        • readyobjectrequired

          判断实例已启动的方式,版本的模板会在实例启动后保存:三者必须恰好给出一个。前两种从实例外部检查,所以服务必须监听所有地址 (0.0.0.0)。

          • httpoptionalstring

            一个以 / 开头的路径:在应用端口上对它发起 GET,返回 200 到 399 之间的状态码。

          • tcpoptionaltrue

            应用端口接受连接。

          • commandoptional

            在实例中执行成功的一条命令。由实例的 shell 运行:参数列表会被写成一行交给它。

            以下之一:

            • string
            • array<string>
        • env映射,值为stringrequired
        • secrets映射,值为stringrequired

          机密的名称。任何响应都不包含值。

        • sizeobjectrequired

          单个实例最多能使用的资源。按实际用量计费。

          • vcpusintegerrequired
            minimum: 1
          • memory_bytesintegerrequired

            偶数个 MiB(即节点为虚拟机加载内存所用的 2 MiB 页的整数倍),以字节表示。其他任何大小都返回 400 invalid_field(param 为 size.memory_bytes):没有节点会创建这种大小的实例,正如没有节点会创建这种大小的沙箱(节点的 SandboxLimitsCreate.memory_bytes)。

            minimum: 134217728
        • volumes数组,元素为objectrequired
          • volumestringrequired
          • pathstringrequired
          • read_onlybooleanrequired
          • nocopyoptionalunknown

            只有给出为 true 时才会出现。

        • kindstringrequired
        • files数组,元素为objectrequired
          • pathstringrequired
          • modeintegerrequired
          • uidintegerrequired
          • gidintegerrequired
          • contentoptionalstring
          • secretoptionalstring
        • userstring | nullrequired
        • working_dirstring | nullrequired
        • stoprequired

          以下之一:

          • ServiceStop
            • signalstring | nullrequired
            • grace_msinteger | nullrequired
          • null
        • hostnamestring | nullrequired
        • regions数组,元素为stringrequired

          按 na、eu、ap 的顺序。

        • scaleobjectrequired
          • min_instancesintegerrequired

            无论有没有请求,应用在一个区域内保持运行的实例数:即下限。该区域服务该应用的节点按分摊 max_instances 的方式分摊它(两个节点、下限为 2:各一个;下限为 1:一个,在最先尝试的节点上;下限为 5:三个和两个),不在线的节点由其他节点补足。节点在收到通知时就创建自己那部分,而不是等到第一个请求,也不会因为空闲而停止或删除这些实例;它们按运行中的实例计量。0(未设置时的值):没有下限。调低后,超出部分的实例从那一刻起视为空闲,并像空闲实例一样被停止和删除。最多为 max_instances(如果给出),且不超过账户套餐允许应用在一个区域请求的数量(caps.app_instances.limit:5、50 和 500):超出会被拒绝,返回 403 plan_cap_reached。

            minimum: 0
          • max_instancesinteger | nullrequired

            应用在一个区域内最多有多少个实例:由该区域服务该应用的节点分摊。最多为账户套餐允许应用请求的数量(caps.app_instances.limit:免费版 5,付费版 500):超出会被拒绝,返回 403 plan_cap_reached;在允许的套餐上请求的数值会保留,但受当前套餐数值的限制。null:未指定数量的应用使用套餐的数值(caps.app_instances.default:免费版 2,付费版 50),如果 min_instances 更大则用它。告诉节点的数值,不超过账户除其他运行中资源外还能容纳的运行量,也不少于应用当前运行的实例数。

            minimum: 1
          • concurrencyinteger | nullrequired

            单个实例同时处理的上限:边缘节点发给它的请求,加上它在项目网络上打开的连接(经由其服务的地址,节点会按连接把它们分给各个实例;或者直接连到它自己的地址)。达到上限的实例即为已满,更多的请求会创建新实例。null(未设置时的值):没有上限。此时节点会在现有实例的 CPU 或内存接近其规格时增加实例,应用不必猜一个数字;一次只处理一个请求的服务应设为 1。

            maximum: 1000 · minimum: 1
          • sleep_after_msinteger | nullrequired

            实例在没有请求时最多等待多久就停止,单位为毫秒。在这个上限以内,节点根据应用自己的流量选择等待时间:在应用最近一段时间里两次请求之间的间隔上,比较多运行一秒空闲与停止再恢复所花的 CPU 时间,选出成本最低的等待时间;这样,请求间隔比停止成本还短的应用会一直运行,请求间隔很长的应用则在最后一个响应结束后立即停止(0:总是立即停止)。null(未设置时的值):平台的上限,三秒。设置过 100(2026年10月28日之前的默认值)的应用,从那天起视为 null。持续停止的实例会在 delete_after_ms 后被其节点删除,下一个需要实例的请求会得到一个新实例;min_instances 保持运行的实例既不会停止也不会删除。

            maximum: 600000 · minimum: 0
          • sleep_notice_msinteger | nullrequired

            在实例因空闲而停止之前多久,向连接到其客户机 /run/sbx/awake 的程序发送一行 sleep N,单位为毫秒:程序可以借此写出手头的数据、关闭连接,或者发起保持,从而推迟停止。无论它们是否响应,停止都会在这段时间之后到来;没有程序连接时,不会推迟。键控实例也会收到通知。0 或 null:不通知(默认)。

            maximum: 60000 · minimum: 0
          • sleep_hold_max_msintegerrequired

            实例中的程序发起的保持,在空闲时间到期后最多还能让实例运行多久,单位为毫秒:程序连接 /run/sbx/awake,如果某个请求在响应之后还有后续工作,就在响应它之前发送 +,工作完成后发送 -(或关闭连接,或退出);最后一个保持解除 sleep_after_ms 之后,实例停止。超过这个时间,无论有什么保持,实例都会停止;如果 sleep_notice_ms 要求通知,会先向已连接的程序发送 sleep N cap。保持期间实例在运行,并按运行计量。0:不理会保持。null:30000(默认)。

            maximum: 900000 · minimum: 0
          • delete_after_msinteger | nullrequired

            实例空闲多久后被删除,与停止使用同一个起算点:下一个需要实例的请求会得到一个新实例,即版本模板的克隆,不含被删除的实例在内存和磁盘中积累的东西(需要长久保存的数据请放在存储卷或数据库中)。一秒到一小时,一小时是平台的时间,也是上限:超出会被拒绝 (400 invalid_field),需要保持预热的实例应计入 min_instances。null(未设置时的值):节点的一小时 (--app-delete-after-seconds)。修改对应用现有的实例和之后创建的实例同样有效:每个节点至少每秒按应用当前的时间检查一次每个实例。不适用于应用的键控实例,键控实例用 keys.delete_after_idle_ms。

            maximum: 3600000 · minimum: 1000
          • suspend_after_msoptionalinteger | null

            已停止的实例在保存内存并真正休眠之前保持暂停多久,单位为毫秒:暂停时,下一个请求在一两毫秒内得到响应,内存照常计量;休眠时,唤醒要多几毫秒,只计量它保存的数据。节点会把它限制在节点让任何实例保持暂停的最长时间内(十分钟);宿主机内存不足、其他虚拟机需要占用槽位,或者有人请求休眠,都会让它更早休眠。null(默认):节点的最长时间。数据库的 suspend_after_seconds 就是其应用的这一设置。

            maximum: 86400000 · minimum: 1000
          • wake_daily_atoptionalstring | null

            每天的某个 UTC 时刻 (HH:MM),在此时唤醒应用中处于休眠状态的键控实例和有状态服务的实例,让它们完成等待唤醒才能做的工作(比如数据库维护);节点根据应用请求创建和删除的实例只会被请求唤醒。唤醒本身不算活动:唤醒后运行的东西才算,运行完毕后实例会再次休眠。此外,无论这里怎么设置,有状态服务的实例都会为其 PostgreSQL 服务器 pg_cron 任务的下一次运行而被唤醒。null(默认):不唤醒。数据库的 wake_daily_at 就是其应用的这一设置。

            pattern: ^([01][0-9]|2[0-3]):[0-5][0-9]$
        • keysrequired

          以下之一:

          • object
          • null
        • egressobject | nullrequired

          与沙箱相同的出站规则(default、allow、deny、http、inject),没有时为 null;按调用给出的原样保存(PATCH 会像节点那样按键逐个合并)。规则立即生效,不产生新版本:服务该应用的节点会把它们应用到其组内的每个实例上,包括现有的实例(运行中的实例对其已有连接也生效)和之后创建的实例;键控实例不受这些规则约束。控制平面只检查它们是不是由这些键组成、不超过 256 KiB 的对象:规则的内容由节点在应用时检查,节点读不懂其规则的实例,所有出站流量都会被拒绝(节点日志会说明原因)。

          • defaultoptionalallow或deny或null
          • allowoptionalarray | null
          • denyoptionalarray | null
          • httpoptionalarray | null
          • injectoptionalarray | null
          • deny_portsoptionalarray | null

            任何连接都到达不了的端口,TCP 或 UDP,无论连往哪里,也无论规则的其他部分怎么说。浏览器会话的规则总是包含 25、465、587 以及矿池监听的端口(3333、4444、5555、7777、14444、45700):无论其规则如何修改,控制平面都会把它们加上。

        • metadata映射,值为stringrequired
        • logsobjectrequired

          应用日志包含哪些内容,每一项为给出的值或默认值 (AppLogSettings)。

          • outputbooleanrequired
          • keepbooleanrequired
          • requestsobjectrequired
            • sample_ratenumberrequired
              maximum: 1 · minimum: 0
            • keep_errorsbooleanrequired
        • publicbooleanrequired

          是否在其默认域名 (url) 上响应。

        • depends_on数组,元素为objectrequired
          • servicestringrequired
          • conditionstringrequired
        • networkobjectrequired
          • aliases数组,元素为stringrequired
          • endpoint_modestringrequired
        • drivesoptional数组,元素为object

          其实例挂载的云盘 (AppCreate.drives):没有指定时为空列表 []。

          • drivestringrequired
          • pathstringrequired
          • modestringrequired
        • key_drivesoptional数组,元素为object

          每个键的实例自有的云盘 (AppCreate.key_drives):没有给出时为空列表 []。

          • namestringrequired
          • pathstringrequired
          • size_bytesinteger | nullrequired
            format: int64
          • nocopyoptionalunknown

            只有给出为 true 时才会出现。

        • runtimeoptional

          运行时设置 (AppCreate.runtime)。null:没有。

          以下之一:

          • Runtime
            • ulimits映射,值为RuntimeLimitGivenrequired
            • sysctls映射,值为stringrequired
            • tmpfs数组,元素为objectrequired
              • pathstringrequired
              • size_bytesinteger | nullrequired
              • modeintegerrequired
            • dnsobjectrequired
              • servers数组,元素为stringrequired
              • search数组,元素为stringrequired
              • options数组,元素为stringrequired
            • shm_size_bytesinteger | nullrequired
          • null
        • tracesoptionalobject

          应用请求的链路追踪包含哪些内容,每一项为给出的值或默认值 (AppTraceSettings):sample_rate 为 0 时不产生任何 span。

          • sample_ratenumberrequired
            maximum: 1 · minimum: 0
          • trust_incomingbooleanrequired
    • volumes数组,元素为objectrequired

      服务挂载的项目存储卷。

      • modelstring | nullrequired

        它在模型中的名称。null:为有状态服务挂载但未命名卷的路径创建的。

      • namestringrequired

        它在项目中的名称。

      • idstring | nullrequired

        null:尚未创建 (to_make)。

        pattern: ^vol-
      • sharedbooleanrequired

        有多个服务挂载它,或者某个服务有多个实例:每个服务的每个实例同时挂载它。

      • statusto_make或made或there或externalrequired

        to_make:导入会创建它(试运行时对将要创建的存储卷这样说明);made:本次导入创建了它;there:之前的导入创建了它,或者已有同名的存储卷;external:模型把它标为 external,而项目中已有它。

      • used_by数组,元素为stringrequired
    • secrets数组,元素为objectrequired

      模型中授予服务的 secrets。

      • modelstringrequired

        它在模型中的名称。

      • namestringrequired

        保存它的项目机密:即模型中的名称,其中机密名称不允许的每个字符都写成下划线。

      • therebooleanrequired

        项目中是否已有它。导入(非试运行)时如果它还不存在,会被拒绝,返回 404 secret_not_found。

      • used_by数组,元素为stringrequired
    • left_out数组,元素为objectrequired

      属于未启用 profile 的服务,导入不会处理它们。

      • namestringrequired
      • profiles数组,元素为stringrequired
    • absent数组,元素为stringrequired

      项目中有而模型中没有的服务:保持原样。

    • deploystring | nullrequired

      导入触发的部署 (GET /v1/deploys/{id})。null:试运行,或者没有服务需要新版本。

      pattern: ^dpl-
  • accountsoptional数组,元素为object

    随 sole_owner 返回:该用户是唯一所有者的那些账户。

    • idstringrequired
      pattern: ^acct-[0-9a-hjkmnp-tv-z]{16}$
    • namestringrequired

403

key_scope:密钥没有调用所需的权限范围(错误信息会指明是哪一个);needs_api_key:使用的是运营方的密钥或 SSH 网关的密钥;account_held:账户因付款问题被冻结,除 GET /v1/account 外,用它的密钥发起的所有调用都会这样被拒绝,而且在检查权限范围之前就拒绝 (x-error-codes);installation_key_scope:限定于某个托管应用安装的密钥,用在了与该安装自身无关的调用上。(沙箱令牌会被转给其节点,节点对它没有的调用返回 404 no_such_route。)
JSON
  • errorobjectrequired
    • typestringrequired
    • codestringrequired
    • messagestringrequired
    • paramstring | nullrequired
    • retryablebooleanrequired
    • request_idstringrequired
    • docs_urlstring | nullrequired
  • move_idoptionalstring

    随 already_moving 返回:该沙箱正在进行的迁移。

  • upgrade_idoptionalstring

    随 upgrade_in_progress(该键尚未结束的升级)、upgrade_started(已开始的升级)和 rollback_gone(回退被拒绝的那次升级)返回:即那次升级。

    pattern: ^upg-[0-9a-hjkmnp-tv-z]{16}$
  • moveoptionalobject

    随 move_over、move_going_back 和 move_taken_over 返回 (POST /internal/moves/{id}/cancel):迁移的当前状态。

    • objectstringrequired
    • idstringrequired
      pattern: ^mov-[0-9a-hjkmnp-tv-z]{16}$
    • sandbox_idstringrequired
    • project_idstringrequired
    • fromobjectrequired
      • idstringrequired
      • namestring | nullrequired

        节点名称;之后已从记录中消失的节点为 null。

    • toobjectrequired
      • idstringrequired
      • namestring | nullrequired

        节点名称;之后已从记录中消失的节点为 null。

    • epochintegerrequired

      迁移开始时表中记录的沙箱纪元:旧节点在这个纪元释放它,新节点在纪元加一时接管它,旧节点在纪元加二时收回它,从对象存储接管则在纪元加三时。

      minimum: 1
    • stepstringrequired

      迁移的进展:releasing(正在请旧节点释放它;表中记录它在旧节点上)、taking_over(正在请新节点接管它;表中记录它在新节点上)、reclaiming(新节点拒绝了它,正在请旧节点收回)、restoring(旧节点没有保留它的任何东西,正从对象存储接管)、done(已在新节点上)、failed(留在原处,或回到了原处,或停在某个时间无法消除的故障或运营方的取消发生时所在的位置:error 说明原因)。

    • whystringrequired

      发起迁移的原因:运营方的迁移、撤离或恢复。

    • wakebooleanrequired

      新节点是否唤醒它:按调用的指定,或按迁移开始时它的状态(是否在运行)。

    • from_storebooleanrequired

      新节点只从对象存储接管它。

    • releaseobject | nullrequired

      旧节点释放时的响应(sandboxd/openapi/openapi.json,releaseSandbox),不含释放所用的密钥;响应之前为 null。

    • takeoverobject | nullrequired

      结束迁移的那次接管的响应(节点文档中的 takeoverSandbox):磁盘和内存来自哪里 (source)、各用了多长时间 (ms)、memory;之前为 null。

    • errorrequired

      失败的迁移:失败原因(如果被带回旧节点,则为新节点的拒绝原因);已完成的迁移:null;进行中的迁移:如果当前步骤要再次请求,则为该步骤上次得到的答复。

      以下之一:

      • object
      • null
    • attemptsintegerrequired

      当前步骤已请求了多少次,仍没有得到确定的答复。

      minimum: 0
    • next_attempt_atstring | nullrequired

      该步骤何时再次请求;不在等待时为 null。

      format: date-time
    • batchstring | nullrequired

      它所属的撤离 (evc-…) 或恢复 (rcv-…)。

    • created_atstringrequired
      format: date-time
    • updated_atstringrequired
      format: date-time
    • ended_atstring | nullrequired
      format: date-time
  • lease_untiloptionalstring

    随 lease_held 返回:节点最后获得的租约最晚可以持有到何时,再加上让节点察觉租约到期所需的时间(在此之前 recoverNode 会被拒绝)。

    format: date-time
  • activeoptionalobject | null

    随 standby 返回:备用副本最后一次读取租约时的活动副本;没有副本持有租约时为 null。

    • namestringrequired
    • urlstringrequired
    • termintegerrequired
      minimum: 1
  • allowed_hostsoptionalarray | null

    随 secret_host_not_allowed 返回:机密可以发往的主机,即机密上设置的主机;没有设置时为 null(节点的 SecretHosts)。

  • problemsoptional数组,元素为object

    随 invalid_definition 返回:定义中的每个问题,各附其位置和内容。

    • atstringrequired

      在定义中的位置,用点分隔的路径 (services.web.port);针对整个定义时为空。

    • messagestringrequired
  • reportoptionalobject

    随 compose_refused 返回:导入的报告,说明拒绝了什么、为什么以及要改什么。

    • objectcompose_importrequired
    • namestring | nullrequired

      模型的 name:即每个服务的标签 compose.project。null:模型没有名称。

    • dry_runbooleanrequired
    • strictbooleanrequired
    • profiles数组,元素为stringrequired
    • treatmentsobjectrequired

      报告中每种处理方式各有多少项。

      • doneintegerrequired
        minimum: 0
      • adaptedintegerrequired
        minimum: 0
      • ignoredintegerrequired
        minimum: 0
      • refusedintegerrequired
        minimum: 0
    • items数组,元素为objectrequired

      模型的顶层元素:name,以及每个卷、网络、config、secret 和扩展。

      • atstringrequired

        在模型中的位置:对服务而言,是其属性(ports[0]、depends_on.db、environment.KEY),针对整个服务时为空;对顶层而言,是元素 (volumes.db-data)。

      • treatmentdone或adapted或ignored或refusedrequired

        done:在平台上含义相同;adapted:平台用另一种方式实现同样的效果;ignored:只对本地运行有意义(带 strict 时会被拒绝);refused:平台做不到,而忽略它会让程序悄悄出错。

      • whystringrequired
      • changestring | nullrequired

        被拒绝的项:要改什么。其他情况为 null。

    • services数组,元素为objectrequired

      导入所采纳的服务,按模型中的顺序。

      • namestringrequired

        服务的名称,也是其应用的名称。

      • app_idstring | nullrequired

        其应用。null:试运行,且项目中没有该服务。

        pattern: ^app-
      • statuscreated或changed或unchangedrequired

        导入对其应用做了(试运行时为将会做)什么:创建、写入变化的部分,或什么都不做。

      • kindservice或jobrequired

        job:模型中有服务等待它完成,它会在每次需要它的部署中运行到结束。

      • statefulbooleanrequired

        它挂载自己的存储卷:只有一个实例,由该实例持有存储卷。

      • versionbooleanrequired

        导入的部署是否为它创建版本:即解析引用后其版本的构成与当前版本不同。

      • items数组,元素为objectrequired
        • atstringrequired

          在模型中的位置:对服务而言,是其属性(ports[0]、depends_on.db、environment.KEY),针对整个服务时为空;对顶层而言,是元素 (volumes.db-data)。

        • treatmentdone或adapted或ignored或refusedrequired

          done:在平台上含义相同;adapted:平台用另一种方式实现同样的效果;ignored:只对本地运行有意义(带 strict 时会被拒绝);refused:平台做不到,而忽略它会让程序悄悄出错。

        • whystringrequired
        • changestring | nullrequired

          被拒绝的项:要改什么。其他情况为 null。

      • appobjectrequired

        导入写入的服务应用字段:其版本的构成,以及立即生效的设置。

        • imagestring | nullrequired

          应用下一个版本的构成,连同其后的七个字段:即其最新版本的构成,加上此后的修改。null:应用没有镜像,也没有版本。

        • image_pull_secretstring | nullrequired

          保存镜像仓库凭据的机密的名称。任何响应都不包含其值。null:没有。

        • start_commandrequired

          以下之一:

          • StartCommand
          • null
        • start_argsrequired

          放在镜像 ENTRYPOINT 之后、取代其 CMD 的内容。null:使用镜像的 CMD,或者整个 start_command。

          以下之一:

          • array<string>
          • null
        • portinteger | nullrequired
        • readyobjectrequired

          判断实例已启动的方式,版本的模板会在实例启动后保存:三者必须恰好给出一个。前两种从实例外部检查,所以服务必须监听所有地址 (0.0.0.0)。

          • httpoptionalstring

            一个以 / 开头的路径:在应用端口上对它发起 GET,返回 200 到 399 之间的状态码。

          • tcpoptionaltrue

            应用端口接受连接。

          • commandoptional

            在实例中执行成功的一条命令。由实例的 shell 运行:参数列表会被写成一行交给它。

            以下之一:

            • string
            • array<string>
        • env映射,值为stringrequired
        • secrets映射,值为stringrequired

          机密的名称。任何响应都不包含值。

        • sizeobjectrequired

          单个实例最多能使用的资源。按实际用量计费。

          • vcpusintegerrequired
            minimum: 1
          • memory_bytesintegerrequired

            偶数个 MiB(即节点为虚拟机加载内存所用的 2 MiB 页的整数倍),以字节表示。其他任何大小都返回 400 invalid_field(param 为 size.memory_bytes):没有节点会创建这种大小的实例,正如没有节点会创建这种大小的沙箱(节点的 SandboxLimitsCreate.memory_bytes)。

            minimum: 134217728
        • volumes数组,元素为objectrequired
          • volumestringrequired
          • pathstringrequired
          • read_onlybooleanrequired
          • nocopyoptionalunknown

            只有给出为 true 时才会出现。

        • kindstringrequired
        • files数组,元素为objectrequired
          • pathstringrequired
          • modeintegerrequired
          • uidintegerrequired
          • gidintegerrequired
          • contentoptionalstring
          • secretoptionalstring
        • userstring | nullrequired
        • working_dirstring | nullrequired
        • stoprequired

          以下之一:

          • ServiceStop
            • signalstring | nullrequired
            • grace_msinteger | nullrequired
          • null
        • hostnamestring | nullrequired
        • regions数组,元素为stringrequired

          按 na、eu、ap 的顺序。

        • scaleobjectrequired
          • min_instancesintegerrequired

            无论有没有请求,应用在一个区域内保持运行的实例数:即下限。该区域服务该应用的节点按分摊 max_instances 的方式分摊它(两个节点、下限为 2:各一个;下限为 1:一个,在最先尝试的节点上;下限为 5:三个和两个),不在线的节点由其他节点补足。节点在收到通知时就创建自己那部分,而不是等到第一个请求,也不会因为空闲而停止或删除这些实例;它们按运行中的实例计量。0(未设置时的值):没有下限。调低后,超出部分的实例从那一刻起视为空闲,并像空闲实例一样被停止和删除。最多为 max_instances(如果给出),且不超过账户套餐允许应用在一个区域请求的数量(caps.app_instances.limit:5、50 和 500):超出会被拒绝,返回 403 plan_cap_reached。

            minimum: 0
          • max_instancesinteger | nullrequired

            应用在一个区域内最多有多少个实例:由该区域服务该应用的节点分摊。最多为账户套餐允许应用请求的数量(caps.app_instances.limit:免费版 5,付费版 500):超出会被拒绝,返回 403 plan_cap_reached;在允许的套餐上请求的数值会保留,但受当前套餐数值的限制。null:未指定数量的应用使用套餐的数值(caps.app_instances.default:免费版 2,付费版 50),如果 min_instances 更大则用它。告诉节点的数值,不超过账户除其他运行中资源外还能容纳的运行量,也不少于应用当前运行的实例数。

            minimum: 1
          • concurrencyinteger | nullrequired

            单个实例同时处理的上限:边缘节点发给它的请求,加上它在项目网络上打开的连接(经由其服务的地址,节点会按连接把它们分给各个实例;或者直接连到它自己的地址)。达到上限的实例即为已满,更多的请求会创建新实例。null(未设置时的值):没有上限。此时节点会在现有实例的 CPU 或内存接近其规格时增加实例,应用不必猜一个数字;一次只处理一个请求的服务应设为 1。

            maximum: 1000 · minimum: 1
          • sleep_after_msinteger | nullrequired

            实例在没有请求时最多等待多久就停止,单位为毫秒。在这个上限以内,节点根据应用自己的流量选择等待时间:在应用最近一段时间里两次请求之间的间隔上,比较多运行一秒空闲与停止再恢复所花的 CPU 时间,选出成本最低的等待时间;这样,请求间隔比停止成本还短的应用会一直运行,请求间隔很长的应用则在最后一个响应结束后立即停止(0:总是立即停止)。null(未设置时的值):平台的上限,三秒。设置过 100(2026年10月28日之前的默认值)的应用,从那天起视为 null。持续停止的实例会在 delete_after_ms 后被其节点删除,下一个需要实例的请求会得到一个新实例;min_instances 保持运行的实例既不会停止也不会删除。

            maximum: 600000 · minimum: 0
          • sleep_notice_msinteger | nullrequired

            在实例因空闲而停止之前多久,向连接到其客户机 /run/sbx/awake 的程序发送一行 sleep N,单位为毫秒:程序可以借此写出手头的数据、关闭连接,或者发起保持,从而推迟停止。无论它们是否响应,停止都会在这段时间之后到来;没有程序连接时,不会推迟。键控实例也会收到通知。0 或 null:不通知(默认)。

            maximum: 60000 · minimum: 0
          • sleep_hold_max_msintegerrequired

            实例中的程序发起的保持,在空闲时间到期后最多还能让实例运行多久,单位为毫秒:程序连接 /run/sbx/awake,如果某个请求在响应之后还有后续工作,就在响应它之前发送 +,工作完成后发送 -(或关闭连接,或退出);最后一个保持解除 sleep_after_ms 之后,实例停止。超过这个时间,无论有什么保持,实例都会停止;如果 sleep_notice_ms 要求通知,会先向已连接的程序发送 sleep N cap。保持期间实例在运行,并按运行计量。0:不理会保持。null:30000(默认)。

            maximum: 900000 · minimum: 0
          • delete_after_msinteger | nullrequired

            实例空闲多久后被删除,与停止使用同一个起算点:下一个需要实例的请求会得到一个新实例,即版本模板的克隆,不含被删除的实例在内存和磁盘中积累的东西(需要长久保存的数据请放在存储卷或数据库中)。一秒到一小时,一小时是平台的时间,也是上限:超出会被拒绝 (400 invalid_field),需要保持预热的实例应计入 min_instances。null(未设置时的值):节点的一小时 (--app-delete-after-seconds)。修改对应用现有的实例和之后创建的实例同样有效:每个节点至少每秒按应用当前的时间检查一次每个实例。不适用于应用的键控实例,键控实例用 keys.delete_after_idle_ms。

            maximum: 3600000 · minimum: 1000
          • suspend_after_msoptionalinteger | null

            已停止的实例在保存内存并真正休眠之前保持暂停多久,单位为毫秒:暂停时,下一个请求在一两毫秒内得到响应,内存照常计量;休眠时,唤醒要多几毫秒,只计量它保存的数据。节点会把它限制在节点让任何实例保持暂停的最长时间内(十分钟);宿主机内存不足、其他虚拟机需要占用槽位,或者有人请求休眠,都会让它更早休眠。null(默认):节点的最长时间。数据库的 suspend_after_seconds 就是其应用的这一设置。

            maximum: 86400000 · minimum: 1000
          • wake_daily_atoptionalstring | null

            每天的某个 UTC 时刻 (HH:MM),在此时唤醒应用中处于休眠状态的键控实例和有状态服务的实例,让它们完成等待唤醒才能做的工作(比如数据库维护);节点根据应用请求创建和删除的实例只会被请求唤醒。唤醒本身不算活动:唤醒后运行的东西才算,运行完毕后实例会再次休眠。此外,无论这里怎么设置,有状态服务的实例都会为其 PostgreSQL 服务器 pg_cron 任务的下一次运行而被唤醒。null(默认):不唤醒。数据库的 wake_daily_at 就是其应用的这一设置。

            pattern: ^([01][0-9]|2[0-3]):[0-5][0-9]$
        • keysrequired

          以下之一:

          • object
          • null
        • egressobject | nullrequired

          与沙箱相同的出站规则(default、allow、deny、http、inject),没有时为 null;按调用给出的原样保存(PATCH 会像节点那样按键逐个合并)。规则立即生效,不产生新版本:服务该应用的节点会把它们应用到其组内的每个实例上,包括现有的实例(运行中的实例对其已有连接也生效)和之后创建的实例;键控实例不受这些规则约束。控制平面只检查它们是不是由这些键组成、不超过 256 KiB 的对象:规则的内容由节点在应用时检查,节点读不懂其规则的实例,所有出站流量都会被拒绝(节点日志会说明原因)。

          • defaultoptionalallow或deny或null
          • allowoptionalarray | null
          • denyoptionalarray | null
          • httpoptionalarray | null
          • injectoptionalarray | null
          • deny_portsoptionalarray | null

            任何连接都到达不了的端口,TCP 或 UDP,无论连往哪里,也无论规则的其他部分怎么说。浏览器会话的规则总是包含 25、465、587 以及矿池监听的端口(3333、4444、5555、7777、14444、45700):无论其规则如何修改,控制平面都会把它们加上。

        • metadata映射,值为stringrequired
        • logsobjectrequired

          应用日志包含哪些内容,每一项为给出的值或默认值 (AppLogSettings)。

          • outputbooleanrequired
          • keepbooleanrequired
          • requestsobjectrequired
            • sample_ratenumberrequired
              maximum: 1 · minimum: 0
            • keep_errorsbooleanrequired
        • publicbooleanrequired

          是否在其默认域名 (url) 上响应。

        • depends_on数组,元素为objectrequired
          • servicestringrequired
          • conditionstringrequired
        • networkobjectrequired
          • aliases数组,元素为stringrequired
          • endpoint_modestringrequired
        • drivesoptional数组,元素为object

          其实例挂载的云盘 (AppCreate.drives):没有指定时为空列表 []。

          • drivestringrequired
          • pathstringrequired
          • modestringrequired
        • key_drivesoptional数组,元素为object

          每个键的实例自有的云盘 (AppCreate.key_drives):没有给出时为空列表 []。

          • namestringrequired
          • pathstringrequired
          • size_bytesinteger | nullrequired
            format: int64
          • nocopyoptionalunknown

            只有给出为 true 时才会出现。

        • runtimeoptional

          运行时设置 (AppCreate.runtime)。null:没有。

          以下之一:

          • Runtime
            • ulimits映射,值为RuntimeLimitGivenrequired
            • sysctls映射,值为stringrequired
            • tmpfs数组,元素为objectrequired
              • pathstringrequired
              • size_bytesinteger | nullrequired
              • modeintegerrequired
            • dnsobjectrequired
              • servers数组,元素为stringrequired
              • search数组,元素为stringrequired
              • options数组,元素为stringrequired
            • shm_size_bytesinteger | nullrequired
          • null
        • tracesoptionalobject

          应用请求的链路追踪包含哪些内容,每一项为给出的值或默认值 (AppTraceSettings):sample_rate 为 0 时不产生任何 span。

          • sample_ratenumberrequired
            maximum: 1 · minimum: 0
          • trust_incomingbooleanrequired
    • volumes数组,元素为objectrequired

      服务挂载的项目存储卷。

      • modelstring | nullrequired

        它在模型中的名称。null:为有状态服务挂载但未命名卷的路径创建的。

      • namestringrequired

        它在项目中的名称。

      • idstring | nullrequired

        null:尚未创建 (to_make)。

        pattern: ^vol-
      • sharedbooleanrequired

        有多个服务挂载它,或者某个服务有多个实例:每个服务的每个实例同时挂载它。

      • statusto_make或made或there或externalrequired

        to_make:导入会创建它(试运行时对将要创建的存储卷这样说明);made:本次导入创建了它;there:之前的导入创建了它,或者已有同名的存储卷;external:模型把它标为 external,而项目中已有它。

      • used_by数组,元素为stringrequired
    • secrets数组,元素为objectrequired

      模型中授予服务的 secrets。

      • modelstringrequired

        它在模型中的名称。

      • namestringrequired

        保存它的项目机密:即模型中的名称,其中机密名称不允许的每个字符都写成下划线。

      • therebooleanrequired

        项目中是否已有它。导入(非试运行)时如果它还不存在,会被拒绝,返回 404 secret_not_found。

      • used_by数组,元素为stringrequired
    • left_out数组,元素为objectrequired

      属于未启用 profile 的服务,导入不会处理它们。

      • namestringrequired
      • profiles数组,元素为stringrequired
    • absent数组,元素为stringrequired

      项目中有而模型中没有的服务:保持原样。

    • deploystring | nullrequired

      导入触发的部署 (GET /v1/deploys/{id})。null:试运行,或者没有服务需要新版本。

      pattern: ^dpl-
  • accountsoptional数组,元素为object

    随 sole_owner 返回:该用户是唯一所有者的那些账户。

    • idstringrequired
      pattern: ^acct-[0-9a-hjkmnp-tv-z]{16}$
    • namestringrequired

404

app_not_found(已删除的应用在其日志行保留期内可以按 id 找到);version_not_found(应用没有该版本)。
JSON
  • errorobjectrequired
    • typestringrequired
    • codestringrequired
    • messagestringrequired
    • paramstring | nullrequired
    • retryablebooleanrequired
    • request_idstringrequired
    • docs_urlstring | nullrequired
  • move_idoptionalstring

    随 already_moving 返回:该沙箱正在进行的迁移。

  • upgrade_idoptionalstring

    随 upgrade_in_progress(该键尚未结束的升级)、upgrade_started(已开始的升级)和 rollback_gone(回退被拒绝的那次升级)返回:即那次升级。

    pattern: ^upg-[0-9a-hjkmnp-tv-z]{16}$
  • moveoptionalobject

    随 move_over、move_going_back 和 move_taken_over 返回 (POST /internal/moves/{id}/cancel):迁移的当前状态。

    • objectstringrequired
    • idstringrequired
      pattern: ^mov-[0-9a-hjkmnp-tv-z]{16}$
    • sandbox_idstringrequired
    • project_idstringrequired
    • fromobjectrequired
      • idstringrequired
      • namestring | nullrequired

        节点名称;之后已从记录中消失的节点为 null。

    • toobjectrequired
      • idstringrequired
      • namestring | nullrequired

        节点名称;之后已从记录中消失的节点为 null。

    • epochintegerrequired

      迁移开始时表中记录的沙箱纪元:旧节点在这个纪元释放它,新节点在纪元加一时接管它,旧节点在纪元加二时收回它,从对象存储接管则在纪元加三时。

      minimum: 1
    • stepstringrequired

      迁移的进展:releasing(正在请旧节点释放它;表中记录它在旧节点上)、taking_over(正在请新节点接管它;表中记录它在新节点上)、reclaiming(新节点拒绝了它,正在请旧节点收回)、restoring(旧节点没有保留它的任何东西,正从对象存储接管)、done(已在新节点上)、failed(留在原处,或回到了原处,或停在某个时间无法消除的故障或运营方的取消发生时所在的位置:error 说明原因)。

    • whystringrequired

      发起迁移的原因:运营方的迁移、撤离或恢复。

    • wakebooleanrequired

      新节点是否唤醒它:按调用的指定,或按迁移开始时它的状态(是否在运行)。

    • from_storebooleanrequired

      新节点只从对象存储接管它。

    • releaseobject | nullrequired

      旧节点释放时的响应(sandboxd/openapi/openapi.json,releaseSandbox),不含释放所用的密钥;响应之前为 null。

    • takeoverobject | nullrequired

      结束迁移的那次接管的响应(节点文档中的 takeoverSandbox):磁盘和内存来自哪里 (source)、各用了多长时间 (ms)、memory;之前为 null。

    • errorrequired

      失败的迁移:失败原因(如果被带回旧节点,则为新节点的拒绝原因);已完成的迁移:null;进行中的迁移:如果当前步骤要再次请求,则为该步骤上次得到的答复。

      以下之一:

      • object
      • null
    • attemptsintegerrequired

      当前步骤已请求了多少次,仍没有得到确定的答复。

      minimum: 0
    • next_attempt_atstring | nullrequired

      该步骤何时再次请求;不在等待时为 null。

      format: date-time
    • batchstring | nullrequired

      它所属的撤离 (evc-…) 或恢复 (rcv-…)。

    • created_atstringrequired
      format: date-time
    • updated_atstringrequired
      format: date-time
    • ended_atstring | nullrequired
      format: date-time
  • lease_untiloptionalstring

    随 lease_held 返回:节点最后获得的租约最晚可以持有到何时,再加上让节点察觉租约到期所需的时间(在此之前 recoverNode 会被拒绝)。

    format: date-time
  • activeoptionalobject | null

    随 standby 返回:备用副本最后一次读取租约时的活动副本;没有副本持有租约时为 null。

    • namestringrequired
    • urlstringrequired
    • termintegerrequired
      minimum: 1
  • allowed_hostsoptionalarray | null

    随 secret_host_not_allowed 返回:机密可以发往的主机,即机密上设置的主机;没有设置时为 null(节点的 SecretHosts)。

  • problemsoptional数组,元素为object

    随 invalid_definition 返回:定义中的每个问题,各附其位置和内容。

    • atstringrequired

      在定义中的位置,用点分隔的路径 (services.web.port);针对整个定义时为空。

    • messagestringrequired
  • reportoptionalobject

    随 compose_refused 返回:导入的报告,说明拒绝了什么、为什么以及要改什么。

    • objectcompose_importrequired
    • namestring | nullrequired

      模型的 name:即每个服务的标签 compose.project。null:模型没有名称。

    • dry_runbooleanrequired
    • strictbooleanrequired
    • profiles数组,元素为stringrequired
    • treatmentsobjectrequired

      报告中每种处理方式各有多少项。

      • doneintegerrequired
        minimum: 0
      • adaptedintegerrequired
        minimum: 0
      • ignoredintegerrequired
        minimum: 0
      • refusedintegerrequired
        minimum: 0
    • items数组,元素为objectrequired

      模型的顶层元素:name,以及每个卷、网络、config、secret 和扩展。

      • atstringrequired

        在模型中的位置:对服务而言,是其属性(ports[0]、depends_on.db、environment.KEY),针对整个服务时为空;对顶层而言,是元素 (volumes.db-data)。

      • treatmentdone或adapted或ignored或refusedrequired

        done:在平台上含义相同;adapted:平台用另一种方式实现同样的效果;ignored:只对本地运行有意义(带 strict 时会被拒绝);refused:平台做不到,而忽略它会让程序悄悄出错。

      • whystringrequired
      • changestring | nullrequired

        被拒绝的项:要改什么。其他情况为 null。

    • services数组,元素为objectrequired

      导入所采纳的服务,按模型中的顺序。

      • namestringrequired

        服务的名称,也是其应用的名称。

      • app_idstring | nullrequired

        其应用。null:试运行,且项目中没有该服务。

        pattern: ^app-
      • statuscreated或changed或unchangedrequired

        导入对其应用做了(试运行时为将会做)什么:创建、写入变化的部分,或什么都不做。

      • kindservice或jobrequired

        job:模型中有服务等待它完成,它会在每次需要它的部署中运行到结束。

      • statefulbooleanrequired

        它挂载自己的存储卷:只有一个实例,由该实例持有存储卷。

      • versionbooleanrequired

        导入的部署是否为它创建版本:即解析引用后其版本的构成与当前版本不同。

      • items数组,元素为objectrequired
        • atstringrequired

          在模型中的位置:对服务而言,是其属性(ports[0]、depends_on.db、environment.KEY),针对整个服务时为空;对顶层而言,是元素 (volumes.db-data)。

        • treatmentdone或adapted或ignored或refusedrequired

          done:在平台上含义相同;adapted:平台用另一种方式实现同样的效果;ignored:只对本地运行有意义(带 strict 时会被拒绝);refused:平台做不到,而忽略它会让程序悄悄出错。

        • whystringrequired
        • changestring | nullrequired

          被拒绝的项:要改什么。其他情况为 null。

      • appobjectrequired

        导入写入的服务应用字段:其版本的构成,以及立即生效的设置。

        • imagestring | nullrequired

          应用下一个版本的构成,连同其后的七个字段:即其最新版本的构成,加上此后的修改。null:应用没有镜像,也没有版本。

        • image_pull_secretstring | nullrequired

          保存镜像仓库凭据的机密的名称。任何响应都不包含其值。null:没有。

        • start_commandrequired

          以下之一:

          • StartCommand
          • null
        • start_argsrequired

          放在镜像 ENTRYPOINT 之后、取代其 CMD 的内容。null:使用镜像的 CMD,或者整个 start_command。

          以下之一:

          • array<string>
          • null
        • portinteger | nullrequired
        • readyobjectrequired

          判断实例已启动的方式,版本的模板会在实例启动后保存:三者必须恰好给出一个。前两种从实例外部检查,所以服务必须监听所有地址 (0.0.0.0)。

          • httpoptionalstring

            一个以 / 开头的路径:在应用端口上对它发起 GET,返回 200 到 399 之间的状态码。

          • tcpoptionaltrue

            应用端口接受连接。

          • commandoptional

            在实例中执行成功的一条命令。由实例的 shell 运行:参数列表会被写成一行交给它。

            以下之一:

            • string
            • array<string>
        • env映射,值为stringrequired
        • secrets映射,值为stringrequired

          机密的名称。任何响应都不包含值。

        • sizeobjectrequired

          单个实例最多能使用的资源。按实际用量计费。

          • vcpusintegerrequired
            minimum: 1
          • memory_bytesintegerrequired

            偶数个 MiB(即节点为虚拟机加载内存所用的 2 MiB 页的整数倍),以字节表示。其他任何大小都返回 400 invalid_field(param 为 size.memory_bytes):没有节点会创建这种大小的实例,正如没有节点会创建这种大小的沙箱(节点的 SandboxLimitsCreate.memory_bytes)。

            minimum: 134217728
        • volumes数组,元素为objectrequired
          • volumestringrequired
          • pathstringrequired
          • read_onlybooleanrequired
          • nocopyoptionalunknown

            只有给出为 true 时才会出现。

        • kindstringrequired
        • files数组,元素为objectrequired
          • pathstringrequired
          • modeintegerrequired
          • uidintegerrequired
          • gidintegerrequired
          • contentoptionalstring
          • secretoptionalstring
        • userstring | nullrequired
        • working_dirstring | nullrequired
        • stoprequired

          以下之一:

          • ServiceStop
            • signalstring | nullrequired
            • grace_msinteger | nullrequired
          • null
        • hostnamestring | nullrequired
        • regions数组,元素为stringrequired

          按 na、eu、ap 的顺序。

        • scaleobjectrequired
          • min_instancesintegerrequired

            无论有没有请求,应用在一个区域内保持运行的实例数:即下限。该区域服务该应用的节点按分摊 max_instances 的方式分摊它(两个节点、下限为 2:各一个;下限为 1:一个,在最先尝试的节点上;下限为 5:三个和两个),不在线的节点由其他节点补足。节点在收到通知时就创建自己那部分,而不是等到第一个请求,也不会因为空闲而停止或删除这些实例;它们按运行中的实例计量。0(未设置时的值):没有下限。调低后,超出部分的实例从那一刻起视为空闲,并像空闲实例一样被停止和删除。最多为 max_instances(如果给出),且不超过账户套餐允许应用在一个区域请求的数量(caps.app_instances.limit:5、50 和 500):超出会被拒绝,返回 403 plan_cap_reached。

            minimum: 0
          • max_instancesinteger | nullrequired

            应用在一个区域内最多有多少个实例:由该区域服务该应用的节点分摊。最多为账户套餐允许应用请求的数量(caps.app_instances.limit:免费版 5,付费版 500):超出会被拒绝,返回 403 plan_cap_reached;在允许的套餐上请求的数值会保留,但受当前套餐数值的限制。null:未指定数量的应用使用套餐的数值(caps.app_instances.default:免费版 2,付费版 50),如果 min_instances 更大则用它。告诉节点的数值,不超过账户除其他运行中资源外还能容纳的运行量,也不少于应用当前运行的实例数。

            minimum: 1
          • concurrencyinteger | nullrequired

            单个实例同时处理的上限:边缘节点发给它的请求,加上它在项目网络上打开的连接(经由其服务的地址,节点会按连接把它们分给各个实例;或者直接连到它自己的地址)。达到上限的实例即为已满,更多的请求会创建新实例。null(未设置时的值):没有上限。此时节点会在现有实例的 CPU 或内存接近其规格时增加实例,应用不必猜一个数字;一次只处理一个请求的服务应设为 1。

            maximum: 1000 · minimum: 1
          • sleep_after_msinteger | nullrequired

            实例在没有请求时最多等待多久就停止,单位为毫秒。在这个上限以内,节点根据应用自己的流量选择等待时间:在应用最近一段时间里两次请求之间的间隔上,比较多运行一秒空闲与停止再恢复所花的 CPU 时间,选出成本最低的等待时间;这样,请求间隔比停止成本还短的应用会一直运行,请求间隔很长的应用则在最后一个响应结束后立即停止(0:总是立即停止)。null(未设置时的值):平台的上限,三秒。设置过 100(2026年10月28日之前的默认值)的应用,从那天起视为 null。持续停止的实例会在 delete_after_ms 后被其节点删除,下一个需要实例的请求会得到一个新实例;min_instances 保持运行的实例既不会停止也不会删除。

            maximum: 600000 · minimum: 0
          • sleep_notice_msinteger | nullrequired

            在实例因空闲而停止之前多久,向连接到其客户机 /run/sbx/awake 的程序发送一行 sleep N,单位为毫秒:程序可以借此写出手头的数据、关闭连接,或者发起保持,从而推迟停止。无论它们是否响应,停止都会在这段时间之后到来;没有程序连接时,不会推迟。键控实例也会收到通知。0 或 null:不通知(默认)。

            maximum: 60000 · minimum: 0
          • sleep_hold_max_msintegerrequired

            实例中的程序发起的保持,在空闲时间到期后最多还能让实例运行多久,单位为毫秒:程序连接 /run/sbx/awake,如果某个请求在响应之后还有后续工作,就在响应它之前发送 +,工作完成后发送 -(或关闭连接,或退出);最后一个保持解除 sleep_after_ms 之后,实例停止。超过这个时间,无论有什么保持,实例都会停止;如果 sleep_notice_ms 要求通知,会先向已连接的程序发送 sleep N cap。保持期间实例在运行,并按运行计量。0:不理会保持。null:30000(默认)。

            maximum: 900000 · minimum: 0
          • delete_after_msinteger | nullrequired

            实例空闲多久后被删除,与停止使用同一个起算点:下一个需要实例的请求会得到一个新实例,即版本模板的克隆,不含被删除的实例在内存和磁盘中积累的东西(需要长久保存的数据请放在存储卷或数据库中)。一秒到一小时,一小时是平台的时间,也是上限:超出会被拒绝 (400 invalid_field),需要保持预热的实例应计入 min_instances。null(未设置时的值):节点的一小时 (--app-delete-after-seconds)。修改对应用现有的实例和之后创建的实例同样有效:每个节点至少每秒按应用当前的时间检查一次每个实例。不适用于应用的键控实例,键控实例用 keys.delete_after_idle_ms。

            maximum: 3600000 · minimum: 1000
          • suspend_after_msoptionalinteger | null

            已停止的实例在保存内存并真正休眠之前保持暂停多久,单位为毫秒:暂停时,下一个请求在一两毫秒内得到响应,内存照常计量;休眠时,唤醒要多几毫秒,只计量它保存的数据。节点会把它限制在节点让任何实例保持暂停的最长时间内(十分钟);宿主机内存不足、其他虚拟机需要占用槽位,或者有人请求休眠,都会让它更早休眠。null(默认):节点的最长时间。数据库的 suspend_after_seconds 就是其应用的这一设置。

            maximum: 86400000 · minimum: 1000
          • wake_daily_atoptionalstring | null

            每天的某个 UTC 时刻 (HH:MM),在此时唤醒应用中处于休眠状态的键控实例和有状态服务的实例,让它们完成等待唤醒才能做的工作(比如数据库维护);节点根据应用请求创建和删除的实例只会被请求唤醒。唤醒本身不算活动:唤醒后运行的东西才算,运行完毕后实例会再次休眠。此外,无论这里怎么设置,有状态服务的实例都会为其 PostgreSQL 服务器 pg_cron 任务的下一次运行而被唤醒。null(默认):不唤醒。数据库的 wake_daily_at 就是其应用的这一设置。

            pattern: ^([01][0-9]|2[0-3]):[0-5][0-9]$
        • keysrequired

          以下之一:

          • object
          • null
        • egressobject | nullrequired

          与沙箱相同的出站规则(default、allow、deny、http、inject),没有时为 null;按调用给出的原样保存(PATCH 会像节点那样按键逐个合并)。规则立即生效,不产生新版本:服务该应用的节点会把它们应用到其组内的每个实例上,包括现有的实例(运行中的实例对其已有连接也生效)和之后创建的实例;键控实例不受这些规则约束。控制平面只检查它们是不是由这些键组成、不超过 256 KiB 的对象:规则的内容由节点在应用时检查,节点读不懂其规则的实例,所有出站流量都会被拒绝(节点日志会说明原因)。

          • defaultoptionalallow或deny或null
          • allowoptionalarray | null
          • denyoptionalarray | null
          • httpoptionalarray | null
          • injectoptionalarray | null
          • deny_portsoptionalarray | null

            任何连接都到达不了的端口,TCP 或 UDP,无论连往哪里,也无论规则的其他部分怎么说。浏览器会话的规则总是包含 25、465、587 以及矿池监听的端口(3333、4444、5555、7777、14444、45700):无论其规则如何修改,控制平面都会把它们加上。

        • metadata映射,值为stringrequired
        • logsobjectrequired

          应用日志包含哪些内容,每一项为给出的值或默认值 (AppLogSettings)。

          • outputbooleanrequired
          • keepbooleanrequired
          • requestsobjectrequired
            • sample_ratenumberrequired
              maximum: 1 · minimum: 0
            • keep_errorsbooleanrequired
        • publicbooleanrequired

          是否在其默认域名 (url) 上响应。

        • depends_on数组,元素为objectrequired
          • servicestringrequired
          • conditionstringrequired
        • networkobjectrequired
          • aliases数组,元素为stringrequired
          • endpoint_modestringrequired
        • drivesoptional数组,元素为object

          其实例挂载的云盘 (AppCreate.drives):没有指定时为空列表 []。

          • drivestringrequired
          • pathstringrequired
          • modestringrequired
        • key_drivesoptional数组,元素为object

          每个键的实例自有的云盘 (AppCreate.key_drives):没有给出时为空列表 []。

          • namestringrequired
          • pathstringrequired
          • size_bytesinteger | nullrequired
            format: int64
          • nocopyoptionalunknown

            只有给出为 true 时才会出现。

        • runtimeoptional

          运行时设置 (AppCreate.runtime)。null:没有。

          以下之一:

          • Runtime
            • ulimits映射,值为RuntimeLimitGivenrequired
            • sysctls映射,值为stringrequired
            • tmpfs数组,元素为objectrequired
              • pathstringrequired
              • size_bytesinteger | nullrequired
              • modeintegerrequired
            • dnsobjectrequired
              • servers数组,元素为stringrequired
              • search数组,元素为stringrequired
              • options数组,元素为stringrequired
            • shm_size_bytesinteger | nullrequired
          • null
        • tracesoptionalobject

          应用请求的链路追踪包含哪些内容,每一项为给出的值或默认值 (AppTraceSettings):sample_rate 为 0 时不产生任何 span。

          • sample_ratenumberrequired
            maximum: 1 · minimum: 0
          • trust_incomingbooleanrequired
    • volumes数组,元素为objectrequired

      服务挂载的项目存储卷。

      • modelstring | nullrequired

        它在模型中的名称。null:为有状态服务挂载但未命名卷的路径创建的。

      • namestringrequired

        它在项目中的名称。

      • idstring | nullrequired

        null:尚未创建 (to_make)。

        pattern: ^vol-
      • sharedbooleanrequired

        有多个服务挂载它,或者某个服务有多个实例:每个服务的每个实例同时挂载它。

      • statusto_make或made或there或externalrequired

        to_make:导入会创建它(试运行时对将要创建的存储卷这样说明);made:本次导入创建了它;there:之前的导入创建了它,或者已有同名的存储卷;external:模型把它标为 external,而项目中已有它。

      • used_by数组,元素为stringrequired
    • secrets数组,元素为objectrequired

      模型中授予服务的 secrets。

      • modelstringrequired

        它在模型中的名称。

      • namestringrequired

        保存它的项目机密:即模型中的名称,其中机密名称不允许的每个字符都写成下划线。

      • therebooleanrequired

        项目中是否已有它。导入(非试运行)时如果它还不存在,会被拒绝,返回 404 secret_not_found。

      • used_by数组,元素为stringrequired
    • left_out数组,元素为objectrequired

      属于未启用 profile 的服务,导入不会处理它们。

      • namestringrequired
      • profiles数组,元素为stringrequired
    • absent数组,元素为stringrequired

      项目中有而模型中没有的服务:保持原样。

    • deploystring | nullrequired

      导入触发的部署 (GET /v1/deploys/{id})。null:试运行,或者没有服务需要新版本。

      pattern: ^dpl-
  • accountsoptional数组,元素为object

    随 sole_owner 返回:该用户是唯一所有者的那些账户。

    • idstringrequired
      pattern: ^acct-[0-9a-hjkmnp-tv-z]{16}$
    • namestringrequired

429

too_many_followers:账户所有项目中跟踪应用日志的读取方数量,已达套餐允许同时跟踪的上限(GET /v1/account 的 logs.followers);retryable。不跟踪的读取从不会因此被拒绝。
JSON
  • errorobjectrequired
    • typestringrequired
    • codestringrequired
    • messagestringrequired
    • paramstring | nullrequired
    • retryablebooleanrequired
    • request_idstringrequired
    • docs_urlstring | nullrequired
  • move_idoptionalstring

    随 already_moving 返回:该沙箱正在进行的迁移。

  • upgrade_idoptionalstring

    随 upgrade_in_progress(该键尚未结束的升级)、upgrade_started(已开始的升级)和 rollback_gone(回退被拒绝的那次升级)返回:即那次升级。

    pattern: ^upg-[0-9a-hjkmnp-tv-z]{16}$
  • moveoptionalobject

    随 move_over、move_going_back 和 move_taken_over 返回 (POST /internal/moves/{id}/cancel):迁移的当前状态。

    • objectstringrequired
    • idstringrequired
      pattern: ^mov-[0-9a-hjkmnp-tv-z]{16}$
    • sandbox_idstringrequired
    • project_idstringrequired
    • fromobjectrequired
      • idstringrequired
      • namestring | nullrequired

        节点名称;之后已从记录中消失的节点为 null。

    • toobjectrequired
      • idstringrequired
      • namestring | nullrequired

        节点名称;之后已从记录中消失的节点为 null。

    • epochintegerrequired

      迁移开始时表中记录的沙箱纪元:旧节点在这个纪元释放它,新节点在纪元加一时接管它,旧节点在纪元加二时收回它,从对象存储接管则在纪元加三时。

      minimum: 1
    • stepstringrequired

      迁移的进展:releasing(正在请旧节点释放它;表中记录它在旧节点上)、taking_over(正在请新节点接管它;表中记录它在新节点上)、reclaiming(新节点拒绝了它,正在请旧节点收回)、restoring(旧节点没有保留它的任何东西,正从对象存储接管)、done(已在新节点上)、failed(留在原处,或回到了原处,或停在某个时间无法消除的故障或运营方的取消发生时所在的位置:error 说明原因)。

    • whystringrequired

      发起迁移的原因:运营方的迁移、撤离或恢复。

    • wakebooleanrequired

      新节点是否唤醒它:按调用的指定,或按迁移开始时它的状态(是否在运行)。

    • from_storebooleanrequired

      新节点只从对象存储接管它。

    • releaseobject | nullrequired

      旧节点释放时的响应(sandboxd/openapi/openapi.json,releaseSandbox),不含释放所用的密钥;响应之前为 null。

    • takeoverobject | nullrequired

      结束迁移的那次接管的响应(节点文档中的 takeoverSandbox):磁盘和内存来自哪里 (source)、各用了多长时间 (ms)、memory;之前为 null。

    • errorrequired

      失败的迁移:失败原因(如果被带回旧节点,则为新节点的拒绝原因);已完成的迁移:null;进行中的迁移:如果当前步骤要再次请求,则为该步骤上次得到的答复。

      以下之一:

      • object
      • null
    • attemptsintegerrequired

      当前步骤已请求了多少次,仍没有得到确定的答复。

      minimum: 0
    • next_attempt_atstring | nullrequired

      该步骤何时再次请求;不在等待时为 null。

      format: date-time
    • batchstring | nullrequired

      它所属的撤离 (evc-…) 或恢复 (rcv-…)。

    • created_atstringrequired
      format: date-time
    • updated_atstringrequired
      format: date-time
    • ended_atstring | nullrequired
      format: date-time
  • lease_untiloptionalstring

    随 lease_held 返回:节点最后获得的租约最晚可以持有到何时,再加上让节点察觉租约到期所需的时间(在此之前 recoverNode 会被拒绝)。

    format: date-time
  • activeoptionalobject | null

    随 standby 返回:备用副本最后一次读取租约时的活动副本;没有副本持有租约时为 null。

    • namestringrequired
    • urlstringrequired
    • termintegerrequired
      minimum: 1
  • allowed_hostsoptionalarray | null

    随 secret_host_not_allowed 返回:机密可以发往的主机,即机密上设置的主机;没有设置时为 null(节点的 SecretHosts)。

  • problemsoptional数组,元素为object

    随 invalid_definition 返回:定义中的每个问题,各附其位置和内容。

    • atstringrequired

      在定义中的位置,用点分隔的路径 (services.web.port);针对整个定义时为空。

    • messagestringrequired
  • reportoptionalobject

    随 compose_refused 返回:导入的报告,说明拒绝了什么、为什么以及要改什么。

    • objectcompose_importrequired
    • namestring | nullrequired

      模型的 name:即每个服务的标签 compose.project。null:模型没有名称。

    • dry_runbooleanrequired
    • strictbooleanrequired
    • profiles数组,元素为stringrequired
    • treatmentsobjectrequired

      报告中每种处理方式各有多少项。

      • doneintegerrequired
        minimum: 0
      • adaptedintegerrequired
        minimum: 0
      • ignoredintegerrequired
        minimum: 0
      • refusedintegerrequired
        minimum: 0
    • items数组,元素为objectrequired

      模型的顶层元素:name,以及每个卷、网络、config、secret 和扩展。

      • atstringrequired

        在模型中的位置:对服务而言,是其属性(ports[0]、depends_on.db、environment.KEY),针对整个服务时为空;对顶层而言,是元素 (volumes.db-data)。

      • treatmentdone或adapted或ignored或refusedrequired

        done:在平台上含义相同;adapted:平台用另一种方式实现同样的效果;ignored:只对本地运行有意义(带 strict 时会被拒绝);refused:平台做不到,而忽略它会让程序悄悄出错。

      • whystringrequired
      • changestring | nullrequired

        被拒绝的项:要改什么。其他情况为 null。

    • services数组,元素为objectrequired

      导入所采纳的服务,按模型中的顺序。

      • namestringrequired

        服务的名称,也是其应用的名称。

      • app_idstring | nullrequired

        其应用。null:试运行,且项目中没有该服务。

        pattern: ^app-
      • statuscreated或changed或unchangedrequired

        导入对其应用做了(试运行时为将会做)什么:创建、写入变化的部分,或什么都不做。

      • kindservice或jobrequired

        job:模型中有服务等待它完成,它会在每次需要它的部署中运行到结束。

      • statefulbooleanrequired

        它挂载自己的存储卷:只有一个实例,由该实例持有存储卷。

      • versionbooleanrequired

        导入的部署是否为它创建版本:即解析引用后其版本的构成与当前版本不同。

      • items数组,元素为objectrequired
        • atstringrequired

          在模型中的位置:对服务而言,是其属性(ports[0]、depends_on.db、environment.KEY),针对整个服务时为空;对顶层而言,是元素 (volumes.db-data)。

        • treatmentdone或adapted或ignored或refusedrequired

          done:在平台上含义相同;adapted:平台用另一种方式实现同样的效果;ignored:只对本地运行有意义(带 strict 时会被拒绝);refused:平台做不到,而忽略它会让程序悄悄出错。

        • whystringrequired
        • changestring | nullrequired

          被拒绝的项:要改什么。其他情况为 null。

      • appobjectrequired

        导入写入的服务应用字段:其版本的构成,以及立即生效的设置。

        • imagestring | nullrequired

          应用下一个版本的构成,连同其后的七个字段:即其最新版本的构成,加上此后的修改。null:应用没有镜像,也没有版本。

        • image_pull_secretstring | nullrequired

          保存镜像仓库凭据的机密的名称。任何响应都不包含其值。null:没有。

        • start_commandrequired

          以下之一:

          • StartCommand
          • null
        • start_argsrequired

          放在镜像 ENTRYPOINT 之后、取代其 CMD 的内容。null:使用镜像的 CMD,或者整个 start_command。

          以下之一:

          • array<string>
          • null
        • portinteger | nullrequired
        • readyobjectrequired

          判断实例已启动的方式,版本的模板会在实例启动后保存:三者必须恰好给出一个。前两种从实例外部检查,所以服务必须监听所有地址 (0.0.0.0)。

          • httpoptionalstring

            一个以 / 开头的路径:在应用端口上对它发起 GET,返回 200 到 399 之间的状态码。

          • tcpoptionaltrue

            应用端口接受连接。

          • commandoptional

            在实例中执行成功的一条命令。由实例的 shell 运行:参数列表会被写成一行交给它。

            以下之一:

            • string
            • array<string>
        • env映射,值为stringrequired
        • secrets映射,值为stringrequired

          机密的名称。任何响应都不包含值。

        • sizeobjectrequired

          单个实例最多能使用的资源。按实际用量计费。

          • vcpusintegerrequired
            minimum: 1
          • memory_bytesintegerrequired

            偶数个 MiB(即节点为虚拟机加载内存所用的 2 MiB 页的整数倍),以字节表示。其他任何大小都返回 400 invalid_field(param 为 size.memory_bytes):没有节点会创建这种大小的实例,正如没有节点会创建这种大小的沙箱(节点的 SandboxLimitsCreate.memory_bytes)。

            minimum: 134217728
        • volumes数组,元素为objectrequired
          • volumestringrequired
          • pathstringrequired
          • read_onlybooleanrequired
          • nocopyoptionalunknown

            只有给出为 true 时才会出现。

        • kindstringrequired
        • files数组,元素为objectrequired
          • pathstringrequired
          • modeintegerrequired
          • uidintegerrequired
          • gidintegerrequired
          • contentoptionalstring
          • secretoptionalstring
        • userstring | nullrequired
        • working_dirstring | nullrequired
        • stoprequired

          以下之一:

          • ServiceStop
            • signalstring | nullrequired
            • grace_msinteger | nullrequired
          • null
        • hostnamestring | nullrequired
        • regions数组,元素为stringrequired

          按 na、eu、ap 的顺序。

        • scaleobjectrequired
          • min_instancesintegerrequired

            无论有没有请求,应用在一个区域内保持运行的实例数:即下限。该区域服务该应用的节点按分摊 max_instances 的方式分摊它(两个节点、下限为 2:各一个;下限为 1:一个,在最先尝试的节点上;下限为 5:三个和两个),不在线的节点由其他节点补足。节点在收到通知时就创建自己那部分,而不是等到第一个请求,也不会因为空闲而停止或删除这些实例;它们按运行中的实例计量。0(未设置时的值):没有下限。调低后,超出部分的实例从那一刻起视为空闲,并像空闲实例一样被停止和删除。最多为 max_instances(如果给出),且不超过账户套餐允许应用在一个区域请求的数量(caps.app_instances.limit:5、50 和 500):超出会被拒绝,返回 403 plan_cap_reached。

            minimum: 0
          • max_instancesinteger | nullrequired

            应用在一个区域内最多有多少个实例:由该区域服务该应用的节点分摊。最多为账户套餐允许应用请求的数量(caps.app_instances.limit:免费版 5,付费版 500):超出会被拒绝,返回 403 plan_cap_reached;在允许的套餐上请求的数值会保留,但受当前套餐数值的限制。null:未指定数量的应用使用套餐的数值(caps.app_instances.default:免费版 2,付费版 50),如果 min_instances 更大则用它。告诉节点的数值,不超过账户除其他运行中资源外还能容纳的运行量,也不少于应用当前运行的实例数。

            minimum: 1
          • concurrencyinteger | nullrequired

            单个实例同时处理的上限:边缘节点发给它的请求,加上它在项目网络上打开的连接(经由其服务的地址,节点会按连接把它们分给各个实例;或者直接连到它自己的地址)。达到上限的实例即为已满,更多的请求会创建新实例。null(未设置时的值):没有上限。此时节点会在现有实例的 CPU 或内存接近其规格时增加实例,应用不必猜一个数字;一次只处理一个请求的服务应设为 1。

            maximum: 1000 · minimum: 1
          • sleep_after_msinteger | nullrequired

            实例在没有请求时最多等待多久就停止,单位为毫秒。在这个上限以内,节点根据应用自己的流量选择等待时间:在应用最近一段时间里两次请求之间的间隔上,比较多运行一秒空闲与停止再恢复所花的 CPU 时间,选出成本最低的等待时间;这样,请求间隔比停止成本还短的应用会一直运行,请求间隔很长的应用则在最后一个响应结束后立即停止(0:总是立即停止)。null(未设置时的值):平台的上限,三秒。设置过 100(2026年10月28日之前的默认值)的应用,从那天起视为 null。持续停止的实例会在 delete_after_ms 后被其节点删除,下一个需要实例的请求会得到一个新实例;min_instances 保持运行的实例既不会停止也不会删除。

            maximum: 600000 · minimum: 0
          • sleep_notice_msinteger | nullrequired

            在实例因空闲而停止之前多久,向连接到其客户机 /run/sbx/awake 的程序发送一行 sleep N,单位为毫秒:程序可以借此写出手头的数据、关闭连接,或者发起保持,从而推迟停止。无论它们是否响应,停止都会在这段时间之后到来;没有程序连接时,不会推迟。键控实例也会收到通知。0 或 null:不通知(默认)。

            maximum: 60000 · minimum: 0
          • sleep_hold_max_msintegerrequired

            实例中的程序发起的保持,在空闲时间到期后最多还能让实例运行多久,单位为毫秒:程序连接 /run/sbx/awake,如果某个请求在响应之后还有后续工作,就在响应它之前发送 +,工作完成后发送 -(或关闭连接,或退出);最后一个保持解除 sleep_after_ms 之后,实例停止。超过这个时间,无论有什么保持,实例都会停止;如果 sleep_notice_ms 要求通知,会先向已连接的程序发送 sleep N cap。保持期间实例在运行,并按运行计量。0:不理会保持。null:30000(默认)。

            maximum: 900000 · minimum: 0
          • delete_after_msinteger | nullrequired

            实例空闲多久后被删除,与停止使用同一个起算点:下一个需要实例的请求会得到一个新实例,即版本模板的克隆,不含被删除的实例在内存和磁盘中积累的东西(需要长久保存的数据请放在存储卷或数据库中)。一秒到一小时,一小时是平台的时间,也是上限:超出会被拒绝 (400 invalid_field),需要保持预热的实例应计入 min_instances。null(未设置时的值):节点的一小时 (--app-delete-after-seconds)。修改对应用现有的实例和之后创建的实例同样有效:每个节点至少每秒按应用当前的时间检查一次每个实例。不适用于应用的键控实例,键控实例用 keys.delete_after_idle_ms。

            maximum: 3600000 · minimum: 1000
          • suspend_after_msoptionalinteger | null

            已停止的实例在保存内存并真正休眠之前保持暂停多久,单位为毫秒:暂停时,下一个请求在一两毫秒内得到响应,内存照常计量;休眠时,唤醒要多几毫秒,只计量它保存的数据。节点会把它限制在节点让任何实例保持暂停的最长时间内(十分钟);宿主机内存不足、其他虚拟机需要占用槽位,或者有人请求休眠,都会让它更早休眠。null(默认):节点的最长时间。数据库的 suspend_after_seconds 就是其应用的这一设置。

            maximum: 86400000 · minimum: 1000
          • wake_daily_atoptionalstring | null

            每天的某个 UTC 时刻 (HH:MM),在此时唤醒应用中处于休眠状态的键控实例和有状态服务的实例,让它们完成等待唤醒才能做的工作(比如数据库维护);节点根据应用请求创建和删除的实例只会被请求唤醒。唤醒本身不算活动:唤醒后运行的东西才算,运行完毕后实例会再次休眠。此外,无论这里怎么设置,有状态服务的实例都会为其 PostgreSQL 服务器 pg_cron 任务的下一次运行而被唤醒。null(默认):不唤醒。数据库的 wake_daily_at 就是其应用的这一设置。

            pattern: ^([01][0-9]|2[0-3]):[0-5][0-9]$
        • keysrequired

          以下之一:

          • object
          • null
        • egressobject | nullrequired

          与沙箱相同的出站规则(default、allow、deny、http、inject),没有时为 null;按调用给出的原样保存(PATCH 会像节点那样按键逐个合并)。规则立即生效,不产生新版本:服务该应用的节点会把它们应用到其组内的每个实例上,包括现有的实例(运行中的实例对其已有连接也生效)和之后创建的实例;键控实例不受这些规则约束。控制平面只检查它们是不是由这些键组成、不超过 256 KiB 的对象:规则的内容由节点在应用时检查,节点读不懂其规则的实例,所有出站流量都会被拒绝(节点日志会说明原因)。

          • defaultoptionalallow或deny或null
          • allowoptionalarray | null
          • denyoptionalarray | null
          • httpoptionalarray | null
          • injectoptionalarray | null
          • deny_portsoptionalarray | null

            任何连接都到达不了的端口,TCP 或 UDP,无论连往哪里,也无论规则的其他部分怎么说。浏览器会话的规则总是包含 25、465、587 以及矿池监听的端口(3333、4444、5555、7777、14444、45700):无论其规则如何修改,控制平面都会把它们加上。

        • metadata映射,值为stringrequired
        • logsobjectrequired

          应用日志包含哪些内容,每一项为给出的值或默认值 (AppLogSettings)。

          • outputbooleanrequired
          • keepbooleanrequired
          • requestsobjectrequired
            • sample_ratenumberrequired
              maximum: 1 · minimum: 0
            • keep_errorsbooleanrequired
        • publicbooleanrequired

          是否在其默认域名 (url) 上响应。

        • depends_on数组,元素为objectrequired
          • servicestringrequired
          • conditionstringrequired
        • networkobjectrequired
          • aliases数组,元素为stringrequired
          • endpoint_modestringrequired
        • drivesoptional数组,元素为object

          其实例挂载的云盘 (AppCreate.drives):没有指定时为空列表 []。

          • drivestringrequired
          • pathstringrequired
          • modestringrequired
        • key_drivesoptional数组,元素为object

          每个键的实例自有的云盘 (AppCreate.key_drives):没有给出时为空列表 []。

          • namestringrequired
          • pathstringrequired
          • size_bytesinteger | nullrequired
            format: int64
          • nocopyoptionalunknown

            只有给出为 true 时才会出现。

        • runtimeoptional

          运行时设置 (AppCreate.runtime)。null:没有。

          以下之一:

          • Runtime
            • ulimits映射,值为RuntimeLimitGivenrequired
            • sysctls映射,值为stringrequired
            • tmpfs数组,元素为objectrequired
              • pathstringrequired
              • size_bytesinteger | nullrequired
              • modeintegerrequired
            • dnsobjectrequired
              • servers数组,元素为stringrequired
              • search数组,元素为stringrequired
              • options数组,元素为stringrequired
            • shm_size_bytesinteger | nullrequired
          • null
        • tracesoptionalobject

          应用请求的链路追踪包含哪些内容,每一项为给出的值或默认值 (AppTraceSettings):sample_rate 为 0 时不产生任何 span。

          • sample_ratenumberrequired
            maximum: 1 · minimum: 0
          • trust_incomingbooleanrequired
    • volumes数组,元素为objectrequired

      服务挂载的项目存储卷。

      • modelstring | nullrequired

        它在模型中的名称。null:为有状态服务挂载但未命名卷的路径创建的。

      • namestringrequired

        它在项目中的名称。

      • idstring | nullrequired

        null:尚未创建 (to_make)。

        pattern: ^vol-
      • sharedbooleanrequired

        有多个服务挂载它,或者某个服务有多个实例:每个服务的每个实例同时挂载它。

      • statusto_make或made或there或externalrequired

        to_make:导入会创建它(试运行时对将要创建的存储卷这样说明);made:本次导入创建了它;there:之前的导入创建了它,或者已有同名的存储卷;external:模型把它标为 external,而项目中已有它。

      • used_by数组,元素为stringrequired
    • secrets数组,元素为objectrequired

      模型中授予服务的 secrets。

      • modelstringrequired

        它在模型中的名称。

      • namestringrequired

        保存它的项目机密:即模型中的名称,其中机密名称不允许的每个字符都写成下划线。

      • therebooleanrequired

        项目中是否已有它。导入(非试运行)时如果它还不存在,会被拒绝,返回 404 secret_not_found。

      • used_by数组,元素为stringrequired
    • left_out数组,元素为objectrequired

      属于未启用 profile 的服务,导入不会处理它们。

      • namestringrequired
      • profiles数组,元素为stringrequired
    • absent数组,元素为stringrequired

      项目中有而模型中没有的服务:保持原样。

    • deploystring | nullrequired

      导入触发的部署 (GET /v1/deploys/{id})。null:试运行,或者没有服务需要新版本。

      pattern: ^dpl-
  • accountsoptional数组,元素为object

    随 sole_owner 返回:该用户是唯一所有者的那些账户。

    • idstringrequired
      pattern: ^acct-[0-9a-hjkmnp-tv-z]{16}$
    • namestringrequired

输入以搜索……

↑↓ 切换↵ 选择Esc 关闭