Сборка
API ставит страницы в очередь пересборки и сообщает о ее ходе. Когда обновлять страницы — в гайде «Сборка».
API — https://onpress.pro/api/v2, SITE — id сайта, OP_TOKEN — токен API. Адреса запросов и общие параметры — в общих правилах API, права — в авторизации.
| Метод | Путь | Действие |
|---|---|---|
| POST | /frames/rebake | Пересобрать страницы |
| GET | /frames/rebake | Получить состояние сборки |
Пересобрать страницы
POST /frames/rebake
Ставит страницы в приоритетную очередь пересборки и отвечает до завершения сборки. Например, обновите страницы с фреймом site__header:
curl -s -X POST "$API/site/$SITE/frames/rebake" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"frames": ["site__header"]}'
Тело запроса
Передайте хотя бы один признак изменения или непустой список страниц.
| Поле | Тип | Обязательно | По умолчанию | Что пересобрать |
|---|---|---|---|---|
pages | array или boolean | нет | не задан | список — эти страницы: id или адреса от корня ("/pricing/"), не больше 1000 за вызов; true — страницы, которые выводят заголовки, адреса или порядок других страниц: меню, крошки, соседи, списки |
frames | array | нет | не задан | страницы, в которых стоят эти фреймы, в том числе вложенными (слаги или id) |
datasets | array | нет | не задан | страницы, которые читают эти пользовательские данные |
menus | boolean | нет | false | страницы с меню |
languages | boolean | нет | false | страницы многоязычного сайта |
settings | boolean | нет | false | все страницы: от настроек сайта зависит каждая |
all | boolean | нет | false | все опубликованные страницы сайта, в том числе те, у которых копии еще нет |
Ответ
{
"success": true,
"queued": 38,
"remaining": 38,
"pages": 39,
"rebaked": { "status": "ok", "total": 3, "baked": 1, "not_needed": 2, "frames": ["…"], "stale": { "status": "ok", "marked": 38, "remaining": 38 } }
}
| Поле ответа | Что это |
|---|---|
queued | сколько страниц встало в приоритетную очередь этим вызовом |
remaining | сколько страниц сайта еще ждут сборки: в приоритете, устаревшие и собираемые сейчас |
pages | сколько страниц сайта ведет очередь |
not_found | адреса из pages, которым не нашлась страница |
rebaked | пересборка общих копий фреймов, ниже; есть, если в теле был повод кроме pages |
Ошибки
| Код | HTTP | Когда | Что делать |
|---|---|---|---|
nothing_to_rebake | 400 | тело пустое | назовите страницы, фреймы, данные или пришлите {"all": true} |
too_many_pages | 400 | в pages больше 1000 элементов | пришлите {"all": true} или разбейте список |
rebuild_unavailable | 502 | очередь сайта не ответила | повторите через минуту |
dry_run_not_supported | 400 | передан dry_run | прочитайте состояние через GET /frames/rebake; этот метод запускает сборку без пробного прогона |
Получить состояние сборки
GET /frames/rebake
Возвращает число готовых страниц и задач в очереди. Параметров пути, строки запроса и тела нет. Например, проверьте очередь после запуска сборки:
curl -s -H "Authorization: Bearer $OP_TOKEN" "$API/site/$SITE/frames/rebake"
Ответ
{ "success": true, "pages": 39, "fresh": 21, "queued": 17, "stale": 0, "building": 1, "remaining": 18 }
| Поле | Что это |
|---|---|
pages | страниц с готовым файлом или в очереди на первый |
fresh | файл соответствует данным |
queued | ждут сборки в приоритете: изменены сами, изменен их фрейм или вызвана пересборка |
stale | устарели из-за правки того, от чего зависят; посетитель получает прежний файл |
building | собираются сейчас |
remaining | queued + stale + building |
Ошибки
| Код | HTTP | Когда | Что делать |
|---|---|---|---|
rebuild_unavailable | 502 | очередь сайта не ответила | повторите запрос позже |
Отчет сборки
Поле bake в ответе записи фрейма (POST /frames, PUT /frames/{ref}) — сборка фрейма сразу после записи.
| Поле | Что это |
|---|---|
status | ok — фрейм собран; skipped — сборку выключил "bake": false; failed — сборка не ответила или ответила ошибкой, причина в reason; unavailable — сборки на сайте нет, разметка сохранена |
response.baked, response.frame_id | собран ли фрейм и его id |
response.bytes, response.source_bytes | размер собранной разметки и исходника |
response.renders_on_request, response.static_per_page, response.live_reason | фрейм зависит от страницы, общей копии у него нет |
response.lang, response.default_lang | язык сборки и язык сайта по умолчанию |
response.empty | повторитель с "empty":"frame" получил пустой список, фрейм вывел пустую строку |
response.blocks, response.inserts, response.unknown_inserts | сколько вызовов и блоков выполнено; имена onpress/…, которых платформа не знает |
response.binds, response.bind_tags | сколько значений подставили поля данных и сколько тегов с data-op-bind |
response.unresolved | поля данных без значения |
response.repeats | что вывел каждый повторитель: source, origin, items, binds, unresolved, window, поля описаны на странице «Повторитель» |
response.frames | вызванные фреймы: ref, frame_id, slug, printed, depth, bytes, binds, unresolved, warnings; невыведенный — с printed: false и reason: recursion, max_depth, max_inserts, empty, source_missing, item_name_empty |
response.warnings | предупреждения сборки |
response.pages, response.published | статические копии страниц этого фрейма: по странице id, url, published, bytes, reason |
Неудачная сборка не отменяет запись: разметка уже сохранена, фрейм пересоберет повтор записи или POST /frames/rebake.
Обновление копий
Каждая публичная страница сайта лежит готовым файлом, и сервер отдает его без сборки. После правки страницы или ее фрейма API собирает две первые страницы в том же запросе, остальные ставит в приоритетную очередь, и сервер собирает их подряд, по одной, за секунды. Страницы, которые только зависят от правки (меню, заголовок страницы в меню, данные, соседи, родитель, переводы), API помечает устаревшими: такая страница отдается прежним файлом, а пересобирает ее первый заход посетителя или фоновая очередь. Первый посетитель устаревшей страницы получает прежний файл сразу, сборка идет после ответа, и следующий посетитель получает новый. Сборка одной страницы идет один раз, сколько бы запросов ни пришло одновременно. Фоновая очередь берет устаревшие страницы по одной и только когда сервер не загружен; повторные пометки одной страницы до ее сборки склеиваются. Новый файл заменяет прежний одной операцией, поэтому у адреса не бывает момента без файла. Страница ленты с разбивкой собирается файлами по адресам /…/page/2/, /…/page/3/ и дальше, адрес вида ?blog_page=2 отвечает 301 на /…/page/2/. На запросе собирается только то, что зависит от посетителя: закрытые страницы, закрытый сайт, вход, API. Фрейм с разметкой, которую нельзя собрать заранее, API не записывает и отвечает 422 frame_not_prebuildable с причиной в request_reasons.
Поле rebaked
Тем же полем rebaked отвечают записи фреймов, меню, наборов данных и страниц.
| Поле | Что это |
|---|---|
status | ok — все нужное собрано; partial — часть; failed — ничего; nothing — от изменения не зависит ни один фрейм, причина в reason |
total | сколько зависимых фреймов найдено |
baked, not_needed | сколько общих копий фреймов собрано (фрейм, зависящий от языка, собирается по разу на язык) и скольким фреймам общая копия не нужна: их страницы собираются каждая своим файлом |
frames | по записи на фрейм: id, slug, lang, because — почему фрейм попал в пересборку, bake — ok, not_needed или статус ошибки, detail, pages — страницы фрейма |
pages | страницы, в тексте которых стоит зависимый вызов или блок: id и because; поле есть, только если такие страницы нашлись |
stale | пометка зависимых страниц устаревшими: status, marked — сколько страниц помечено, remaining — сколько страниц сайта ждут сборки |
cache | служебный сброс страничного кэша, на сайтах с файлами страниц ничего не меняет |
skipped, cap | сколько фреймов не вошло в вызов и предел вызова, 25 |