docs: update architecture and API documentation to clarify job processing, in-memory registry usage, and future broker integration plans. Enhance OpenAPI specifications for enrollment responses and refine quickstart instructions for Docker setups.
CI / changes (push) Successful in 4s
CI / openapi (push) Successful in 24s
CI / go (push) Successful in 22s
CI / bird2 (push) Successful in 13s
CI / docker-images (deploy/docker/bird2/Dockerfile, evobgp-bird2) (push) Successful in 38s
CI / docker-images (deploy/docker/evobgp-agent/Dockerfile, evobgp-agent) (push) Successful in 1m8s
CI / docker-images (deploy/docker/evobgp-web/Dockerfile, evobgp-web) (push) Successful in 49s
CI / docker-images (evobgp-all, 1, deploy/docker/gobinary/Dockerfile, evobgp-all) (push) Successful in 1m30s
CI / docker-images (evobgp-api, 1, deploy/docker/gobinary/Dockerfile, evobgp-api) (push) Successful in 1m31s
CI / docker-images (evobgp-ingest, 0, deploy/docker/gobinary/Dockerfile, evobgp-ingest) (push) Has been cancelled
CI / docker-images (evobgp-deploy, 0, deploy/docker/gobinary/Dockerfile, evobgp-deploy) (push) Has been cancelled
CI / docker-images (evobgp-node, 0, deploy/docker/gobinary/Dockerfile, evobgp-node) (push) Has been cancelled
CI / docker-images (evobgp-render, 0, deploy/docker/gobinary/Dockerfile, evobgp-render) (push) Has been cancelled
CI / docker-images (evobgp-scheduler, 0, deploy/docker/gobinary/Dockerfile, evobgp-scheduler) (push) Has been cancelled

This commit is contained in:
Denozordec committed 2026-04-05 18:36:32 +07:00
1 parent c6687b2c91
commit acc0608432
18 files changed
+110 -96

No files matched your search

+4 -4
View File
@@ -3210,15 +3210,15 @@ data-styled.g138[id="sc-iJQrDi"]{content:"gtHWGb,"}/*!sc*/
" class="sc-iKGpAq sc-cCYyou dXXcln dHaogz"><p>Обмен ключами и привязка к <code>speaker_id</code>; детали протокола уточняются отдельно.</p>
</div></div><div class="sc-ftWlEC pzAgN"><div class="sc-cYRmzp kuPPCO"><h5 class="sc-irTswZ sc-jOQpHb fA-dGxt qtYpT">Authorizations:</h5><svg class="sc-fbJfz eiOVYa" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></div><div class="sc-jTsRVM gZngKQ"><span class="sc-dskThK ddMcul"><span class="sc-hNeXkj cLOXvd"><i>bearerAuth</i></span></span></div></div><h5 class="sc-irTswZ fA-dGxt">Request Body schema: <span class="sc-gXSCqT bzXJk">application/json</span><div class="sc-gUrTyB sc-eKYjSU sc-dVCGSo bPAaet boAHLn iuCmqI">required</div></h5><div html="" class="sc-iKGpAq sc-cCYyou dXXcln dHaogz"></div><table class="sc-hIqOWV dybric"><tbody><tr class=""><td kind="field" title="public_key" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">public_key</span></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">string</span></div> <div><div html="" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"></div></div></div></td></tr><tr class=""><td kind="field" title="speaker_id" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">speaker_id</span></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">string</span><span class="sc-gUrTyB sc-jfSnVt bPAaet kEFcTG"> (<!-- -->ResourceId<!-- -->) </span><span class="sc-gUrTyB sc-ejdXBF bPAaet gTwxVV">^[0-9A-Za-z_-]{20,36}$</span></div> <div><div html="&lt;p&gt;UUID v7 или ULID.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>UUID v7 или ULID.</p>
</div></div></div></td></tr><tr class="last "><td kind="additionalProperties" title="property name*" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">property name*</span><div class="sc-gUrTyB sc-eKYjSU sc-oQLfz bPAaet boAHLn llEodL">additional property</div></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">any</span></div> <div><div html="" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"></div></div></div></td></tr></tbody></table><div><h3 class="sc-fJjTez hsJdXF">Responses</h3><div><button class="sc-caslwi brztng"><svg class="sc-fbJfz iZiZiV" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg><strong class="sc-fYaxgW jJkGwY">200<!-- --> </strong><div html="&lt;p&gt;Успешная регистрация (плейсхолдер).&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou sc-cjERFZ dXXcln fTBBlJ dkmSdy"><p>Успешная регистрация (плейсхолдер).</p>
</div></div></div></td></tr><tr class="last "><td kind="additionalProperties" title="property name*" class="sc-hAtEya sc-fGFwA-d kddqHa eIujjv"><span class="sc-ieZDjf bEKmDE"></span><span class="property-name">property name*</span><div class="sc-gUrTyB sc-eKYjSU sc-oQLfz bPAaet boAHLn llEodL">additional property</div></td><td class="sc-blLsxE bmauLr"><div><div><span class="sc-gUrTyB sc-kZGvTq bPAaet UMvzF"></span><span class="sc-gUrTyB sc-iMfspz bPAaet fEQrHJ">any</span></div> <div><div html="" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"></div></div></div></td></tr></tbody></table><div><h3 class="sc-fJjTez hsJdXF">Responses</h3><div><button class="sc-caslwi brztng"><svg class="sc-fbJfz iZiZiV" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg><strong class="sc-fYaxgW jJkGwY">200<!-- --> </strong><div html="&lt;p&gt;Enrollment записан (node_public_key и время в meta спикера при наличии ключа).&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou sc-cjERFZ dXXcln fTBBlJ dkmSdy"><p>Enrollment записан (node_public_key и время в meta спикера при наличии ключа).</p>
</div></button></div><div><button class="sc-caslwi fvWYOy"><svg class="sc-fbJfz kiMFkB" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg><strong class="sc-fYaxgW jJkGwY">422<!-- --> </strong><div html="&lt;p&gt;Семантическая ошибка запроса или валидации полей.&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou sc-cjERFZ dXXcln fTBBlJ dkmSdy"><p>Семантическая ошибка запроса или валидации полей.</p>
</div></button></div><div><button class="sc-caslwi fvWYOy"><svg class="sc-fbJfz kiMFkB" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg><strong class="sc-fYaxgW jJkGwY">default<!-- --> </strong><div html="&lt;p&gt;Ошибка (см. тело Problem).&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou sc-cjERFZ dXXcln fTBBlJ dkmSdy"><p>Ошибка (см. тело Problem).</p>
</div></button></div></div></div><div class="sc-jTrPJt sc-gLDzao dVngAA fYLqku"><div class="sc-fYzRkH dHdMVa"><button class="sc-jYvNnh iWrBta"><span type="post" class="sc-eGFuAY ejslkd http-verb post">post</span><span class="sc-GJyyy dkiPkt">/v1/nodes/enroll</span><svg class="sc-fbJfz ivEQut" style="margin-right:-25px" version="1.1" viewBox="0 0 24 24" x="0" xmlns="http://www.w3.org/2000/svg" y="0" aria-hidden="true"><polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "></polygon></svg></button><div aria-hidden="true" class="sc-fnxdBX dplsyJ"><div class="sc-llcuoK cNCbuV"><div html="&lt;p&gt;Базовый URL инсталляции (замените на свой)&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>Базовый URL инсталляции (замените на свой)</p>
</div><div tabindex="0" role="button"><div class="sc-jnsZEx eobUac"><span>https://api.example.com</span>/v1/nodes/enroll</div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Request samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="react-tabs__tab react-tabs__tab--selected" role="tab" id="tab_R_157la_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_157la_0" tabindex="0" data-rttab="true">Payload</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_157la_0" aria-labelledby="tab_R_157la_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"public_key"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"speaker_id"</span>: <span class="token string">&quot;01JQXYZABCDEFGHIJKLMNOPQRS&quot;</span></div></li></ul><span class="token punctuation">}</span></code></div></div></div></div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Response samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_177la_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_177la_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_177la_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_177la_1" data-rttab="true">422</li><li class="tab-error" role="tab" id="tab_R_177la_2" aria-selected="false" aria-disabled="false" aria-controls="panel_R_177la_2" data-rttab="true">default</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_177la_0" aria-labelledby="tab_R_177la_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><span class="token punctuation">{ }</span></code></div></div></div></div></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_177la_1" aria-labelledby="tab_R_177la_1"></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_177la_2" aria-labelledby="tab_R_177la_2"></div></div></div></div></div></div><div id="tag/Settings" data-section-id="tag/Settings" class="sc-eDDNvO eTiIZG"><div class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG"><h2 class="sc-qRumy bcNKdh"><a class="sc-csCMJq jSIqAu" href="#tag/Settings" aria-label="tag/Settings"></a>Settings</h2></div></div><div class="sc-hLseeT eiTXyS"><div class="sc-iKGpAq sc-cCYyou dXXcln dHaogz redoc-markdown " html="&lt;p&gt;Глобальные настройки и feature flags; изменение - только operator.&lt;/p&gt;
</div><div tabindex="0" role="button"><div class="sc-jnsZEx eobUac"><span>https://api.example.com</span>/v1/nodes/enroll</div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Request samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="react-tabs__tab react-tabs__tab--selected" role="tab" id="tab_R_157la_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_157la_0" tabindex="0" data-rttab="true">Payload</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_157la_0" aria-labelledby="tab_R_157la_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"public_key"</span>: <span class="token string">&quot;string&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"speaker_id"</span>: <span class="token string">&quot;01JQXYZABCDEFGHIJKLMNOPQRS&quot;</span></div></li></ul><span class="token punctuation">}</span></code></div></div></div></div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Response samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_177la_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_177la_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_177la_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_177la_1" data-rttab="true">422</li><li class="tab-error" role="tab" id="tab_R_177la_2" aria-selected="false" aria-disabled="false" aria-controls="panel_R_177la_2" data-rttab="true">default</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_177la_0" aria-labelledby="tab_R_177la_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><button class="collapser" aria-label="collapse"></button><span class="token punctuation">{</span><span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable "><span class="property token string">"status"</span>: <span class="token string">&quot;enrolled&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"speaker_id"</span>: <span class="token string">&quot;01JQXYZABCDEFGHIJKLMNOPQRS&quot;</span><span class="token punctuation">,</span></div></li><li><div class="hoverable "><span class="property token string">"tenant_id"</span>: <span class="token string">&quot;01JQXYZABCDEFGHIJKLMNOPQRS&quot;</span></div></li></ul><span class="token punctuation">}</span></code></div></div></div></div></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_177la_1" aria-labelledby="tab_R_177la_1"></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_177la_2" aria-labelledby="tab_R_177la_2"></div></div></div></div></div></div><div id="tag/Settings" data-section-id="tag/Settings" class="sc-eDDNvO eTiIZG"><div class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG"><h2 class="sc-qRumy bcNKdh"><a class="sc-csCMJq jSIqAu" href="#tag/Settings" aria-label="tag/Settings"></a>Settings</h2></div></div><div class="sc-hLseeT eiTXyS"><div class="sc-iKGpAq sc-cCYyou dXXcln dHaogz redoc-markdown " html="&lt;p&gt;Глобальные настройки и feature flags; изменение - только operator.&lt;/p&gt;
"><p>Глобальные настройки и feature flags; изменение - только operator.</p>
</div></div></div><div id="tag/Settings/operation/getSettings" data-section-id="tag/Settings/operation/getSettings" class="sc-eDDNvO iUTsUN"><div data-section-id="operation/getSettings" id="operation/getSettings" class="sc-iAEyYj cmAaWK"><div class="sc-hLseeT hoYmkG"><h2 class="sc-qRumy bcNKdh"><a class="sc-csCMJq jSIqAu" href="#tag/Settings/operation/getSettings" aria-label="tag/Settings/operation/getSettings"></a>Получить настройки<!-- --> </h2><div class="sc-iERabE dUdgLx"><div html="&lt;p&gt;KV (лимиты CDN, feature flags и т.д.).&lt;/p&gt;
" class="sc-iKGpAq sc-cCYyou dXXcln dHaogz"><p>KV (лимиты CDN, feature flags и т.д.).</p>
@@ -3246,7 +3246,7 @@ data-styled.g138[id="sc-iJQrDi"]{content:"gtHWGb,"}/*!sc*/
" class="sc-iKGpAq sc-cCYyou dXXcln cFvDiF"><p>Базовый URL инсталляции (замените на свой)</p>
</div><div tabindex="0" role="button"><div class="sc-jnsZEx eobUac"><span>https://api.example.com</span>/v1/settings</div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Request samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="react-tabs__tab react-tabs__tab--selected" role="tab" id="tab_R_156lq_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_156lq_0" tabindex="0" data-rttab="true">Payload</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_156lq_0" aria-labelledby="tab_R_156lq_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><span class="token punctuation">{ }</span></code></div></div></div></div></div></div></div></div><div><h3 class="sc-kFuwaQ dEbuTz"> <!-- -->Response samples<!-- --> </h3><div class="sc-cyRfQY lbIFgo" data-rttabs="true"><ul class="react-tabs__tab-list" role="tablist"><li class="tab-success react-tabs__tab--selected" role="tab" id="tab_R_176lq_0" aria-selected="true" aria-disabled="false" aria-controls="panel_R_176lq_0" tabindex="0" data-rttab="true">200</li><li class="tab-error" role="tab" id="tab_R_176lq_1" aria-selected="false" aria-disabled="false" aria-controls="panel_R_176lq_1" data-rttab="true">403</li><li class="tab-error" role="tab" id="tab_R_176lq_2" aria-selected="false" aria-disabled="false" aria-controls="panel_R_176lq_2" data-rttab="true">default</li></ul><div class="react-tabs__tab-panel react-tabs__tab-panel--selected" role="tabpanel" id="panel_R_176lq_0" aria-labelledby="tab_R_176lq_0"><div><div class="sc-cPlDXk gpxHhK"><span class="sc-bCDidX ccmcKc">Content type</span><div class="sc-dQelHO eMpCUl">application/json</div></div><div class="sc-hVkBjf ksuOBo"><div class="sc-cRZddz iLjyyA"><div class="sc-gjTGSz btblAa"><button><div class="sc-jegxcw fJsoyS">Copy</div></button></div><div tabindex="0" class="sc-iKGpAq dXXcln sc-jMAIzW jKIGwd"><div class="redoc-json"><code><span class="token punctuation">{ }</span></code></div></div></div></div></div></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_176lq_1" aria-labelledby="tab_R_176lq_1"></div><div class="react-tabs__tab-panel" role="tabpanel" id="panel_R_176lq_2" aria-labelledby="tab_R_176lq_2"></div></div></div></div></div></div></div><div class="sc-emEvRt jYOHCb"></div></div></div>
<script>
const __redoc_state = {"menu":{"activeItemIdx":-1},"spec":{"data":{"openapi":"3.1.0","info":{"title":"EvoBGP Control Plane API","version":"0.1.0","description":"REST API управления префиксами, модулями ingest, ревизиями конфигурации BIRD и задачами (async jobs).\n\n**Соглашения:** префикс `/v1`; идентификаторы - UUID v7 или ULID (строки); время - ISO 8601 UTC.\nОшибки - `application/problem+json` ([RFC 9457](https://www.rfc-editor.org/rfc/rfc9457)).\nПагинация списков - `cursor` + `limit`; ответ содержит `items`, `next_cursor`, `has_more`.\n\n**Роли** (матрица доступа): `viewer`, `editor`, `operator`, `node`. Нода использует отдельные пути и ключ с ролью `node`.\n\nЗаголовок `X-Tenant-Id` допускается только для супер-ролей (явный tenant); иначе tenant берётся из API-ключа.\n","license":{"name":"Proprietary","identifier":"LicenseRef-Proprietary"}},"servers":[{"url":"https://api.example.com","description":"Базовый URL инсталляции (замените на свой)"}],"tags":[{"name":"System","description":"Liveness, readiness и метаданные сборки. Обычно без чувствительных данных; доступ может быть шире."},{"name":"Modules","description":"Экземпляры модулей префиксов (AS, CDN, домены, статические IP-диапазоны) и вложенные записи. Чтение - viewer+; изменение - editor+."},{"name":"DoH profiles","description":"Профили DNS-over-HTTPS для модулей типа домены. Секрет в ответах не возвращается."},{"name":"Communities","description":"Справочник BGP community в скоупе tenant."},{"name":"Peers","description":"BGP-пиры и политики; привязка к спикеру или ко всем спикерам."},{"name":"Speakers","description":"Регистрация и метаданные экземпляров BIRD (master/replica/canary)."},{"name":"Revisions","description":"История ревизий конфигурации, снимки префиксов, превью и откат (часто асинхронно)."},{"name":"Deploy","description":"Применение ревизий на спикерах и опциональный reload BIRD. Требуется роль operator."},{"name":"Jobs","description":"Асинхронные задачи; статус и отмена (best-effort)."},{"name":"Node","description":"API для evobgp-node (бандлы ревизий и enrollment). Отдельный ключ или mTLS, роль node."},{"name":"Settings","description":"Глобальные настройки и feature flags; изменение - только operator."}],"security":[{"bearerAuth":[]}],"externalDocs":{"description":"Черновик и контекст API","url":"./evobgp-api-sketches.md"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API-ключ в формате `Bearer <token>`. На edge может заменяться или дополняться mTLS."}},"parameters":{"TenantId":{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"$ref":"#/components/schemas/ResourceId"},"description":"Явный tenant (только супер-роли). Без заголовка tenant определяется по ключу."},"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":256},"description":"Идемпотентность мутаций. Для `POST` apply и части refresh рекомендуется или обязателен по политике продукта."},"Cursor":{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Непрозрачный курсор из предыдущего ответа."},"Limit":{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500,"default":50},"description":"Размер страницы (по умолчанию 50)."},"ModuleId":{"name":"module_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"SpeakerId":{"name":"speaker_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"RevisionId":{"name":"revision_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"JobId":{"name":"job_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"PeerId":{"name":"id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"DohProfileId":{"name":"id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"CommLine truncated
const __redoc_state = {"menu":{"activeItemIdx":-1},"spec":{"data":{"openapi":"3.1.0","info":{"title":"EvoBGP Control Plane API","version":"0.1.0","description":"REST API управления префиксами, модулями ingest, ревизиями конфигурации BIRD и задачами (async jobs).\n\n**Соглашения:** префикс `/v1`; идентификаторы - UUID v7 или ULID (строки); время - ISO 8601 UTC.\nОшибки - `application/problem+json` ([RFC 9457](https://www.rfc-editor.org/rfc/rfc9457)).\nПагинация списков - `cursor` + `limit`; ответ содержит `items`, `next_cursor`, `has_more`.\n\n**Роли** (матрица доступа): `viewer`, `editor`, `operator`, `node`. Нода использует отдельные пути и ключ с ролью `node`.\n\nЗаголовок `X-Tenant-Id` допускается только для супер-ролей (явный tenant); иначе tenant берётся из API-ключа.\n","license":{"name":"Proprietary","identifier":"LicenseRef-Proprietary"}},"servers":[{"url":"https://api.example.com","description":"Базовый URL инсталляции (замените на свой)"}],"tags":[{"name":"System","description":"Liveness, readiness и метаданные сборки. Обычно без чувствительных данных; доступ может быть шире."},{"name":"Modules","description":"Экземпляры модулей префиксов (AS, CDN, домены, статические IP-диапазоны) и вложенные записи. Чтение - viewer+; изменение - editor+."},{"name":"DoH profiles","description":"Профили DNS-over-HTTPS для модулей типа домены. Секрет в ответах не возвращается."},{"name":"Communities","description":"Справочник BGP community в скоупе tenant."},{"name":"Peers","description":"BGP-пиры и политики; привязка к спикеру или ко всем спикерам."},{"name":"Speakers","description":"Регистрация и метаданные экземпляров BIRD (master/replica/canary)."},{"name":"Revisions","description":"История ревизий конфигурации, снимки префиксов, превью и откат (часто асинхронно)."},{"name":"Deploy","description":"Применение ревизий на спикерах и опциональный reload BIRD. Требуется роль operator."},{"name":"Jobs","description":"Асинхронные задачи; статус и отмена (best-effort)."},{"name":"Node","description":"API для evobgp-node (бандлы ревизий и enrollment). Отдельный ключ или mTLS, роль node."},{"name":"Settings","description":"Глобальные настройки и feature flags; изменение - только operator."}],"security":[{"bearerAuth":[]}],"externalDocs":{"description":"Черновик и контекст API","url":"./evobgp-api-sketches.md"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API-ключ в формате `Bearer <token>`. На edge может заменяться или дополняться mTLS."}},"parameters":{"TenantId":{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"$ref":"#/components/schemas/ResourceId"},"description":"Явный tenant (только супер-роли). Без заголовка tenant определяется по ключу."},"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":256},"description":"Идемпотентность мутаций. Для `POST` apply и части refresh рекомендуется или обязателен по политике продукта."},"Cursor":{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Непрозрачный курсор из предыдущего ответа."},"Limit":{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500,"default":50},"description":"Размер страницы (по умолчанию 50)."},"ModuleId":{"name":"module_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"SpeakerId":{"name":"speaker_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"RevisionId":{"name":"revision_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"JobId":{"name":"job_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"PeerId":{"name":"id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"DohProfileId":{"name":"id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ResourceId"}},"CommLine truncated
var container = document.getElementById('redoc');
Redoc.hydrate(__redoc_state, container);