外观
Registry Server API
源码:apps/registry-server/registryserver/api/routes.py。前缀 /registry/v1。
不对公网发布——本服务是容器网内的姊妹服务,消费方(control-server、auth-server)经共享包 dn42_registry.RegistryClient 调用。全部端点挂 service token 鉴权(Authorization: Bearer <service_token>),未配置 token 时整体 fail-closed 403(/healthz 除外)。
前缀与姊妹服务同构(/{auth,control,registry}/v1),即便当前只在容器网内可达:三面命名一致,排障时路径本身就说明请求打在哪个服务上;将来若经 api.natlan.io 发布,前置只需按路径转发、无需 rewrite。
发布前置:
POST /registry/v1/sync是一次全量重写(上限 300s),全部端点只有 service token 一道闸。要对公网发布得先补限速与来源收窄——不要顺手在 nginx 加一个location /registry/了事。
设计与同步机制见 registry-server 内部,运维见 registry 副本。
端点
| 方法 | 路径 | 说明 |
|---|---|---|
GET | /status | 同步状态:commit、各对象计数、同步时刻 |
POST | /sync?force= | 手动触发一轮同步(与周期循环经锁互斥)。force=1 跳过 sha 门控强制重拉 |
POST | /names | 批量 ASN → as-name |
GET | /asns/{asn} | 单 ASN 记录 |
GET | /asns/{asn}/mntners | 该 ASN 的维护者列表 |
GET | /asns/{asn}/verification-options | 该 ASN 可用的归属验证方式(email / pgp / ssh,带来源 mntner) |
GET | /asns/{asn}/routes | 该 ASN 起源的全部前缀 |
GET | /asns/{asn}/identity | OAuth claims 富化物料 |
GET | /mntners/{name} | 单维护者记录 |
GET | /key-certs/{fingerprint} | 按指纹取 PGP 公钥(key-cert 对象) |
GET | /healthz | 存活 + DB 连通性(根上,无鉴权) |
语义约定
「未收录」统一 404,客户端映射回 None,与消费方内部的可空语义对齐。两个例外刻意不 404:
GET /asns/{asn}/routes——未收录 ASN 就是空列表{ "asn": …, "route": [], "route6": [] }。调用方要判断的是「这个地址在不在该 AS 名下」,空集是正确答案而非缺失。GET /asns/{asn}/identity——数据不全时逐字段回落None或空,OAuth claims 富化不该因为 person 对象缺失就整体失败。
POST /names 请求 { "asns": [<int>, …] },服务端上限 1000;超限按 422 拒绝,不静默截断——调用方是程序,静默截断会让它以为拿全了。响应 { "names": { "<asn>": "<as-name>" } },未收录或无名的 ASN 不出现在结果里。
POST /sync 的错误:未配置上游 token 409;上游拉取失败 502,既有数据保留不被清空。sha 未变时返回 synced=false,这是正常结果不是错误。