Для AI-агентов: markdown этой страницы — /docs-content/infra/database/restore.md индекс документации — /llms.txt

Восстановить базу из копии

POST /v1/infra/servers/:id/db/restore

Заменяет SQLite-файл приложения содержимым завершённой копии базы. Восстановление выполняется в фоновом режиме, а перед заменой платформа сохраняет защитную копию текущего файла.

Параметры

Параметр Тип Обяз. Описание
Параметрid (path) Типstring (UUID) Обяз.да ОписаниеID приложения с kind равным GALAXY_APP, базу которого нужно заменить. Список: GET /v1/infra/servers

Поля запроса (body)

Поле Тип Обяз. Описание
ПолеbackupId Типstring Обяз.да ОписаниеID копии в статусе COMPLETED с неистёкшим expiresAt. Список: GET /db/backups, поле data.items[].id. Копия может принадлежать другому приложению того же портала, в том числе удалённому, если у ключа есть доступ к данным этого приложения. Копии другого приложения: GET /db/backups?sourceAppId=...
Полеfile Типstring Обяз.нет ОписаниеПуть к заменяемому файлу относительно тома /data, до 1024 байт в UTF-8. Без поля заменяется файл из переменной VIBE_DB_PATH контейнера приложения, а если она не задана — app.db. Абсолютный путь, сегменты . и .., пустые сегменты и управляющие символы отклоняются

Других полей тело не принимает, размер тела — до 4 КиБ.

Примеры

curl — личный ключ

Terminal
curl -X POST "https://vibecode.bitrix24.tech/v1/infra/servers/APP_ID/db/restore" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"backupId":"BACKUP_ID"}'

curl — OAuth-приложение

Terminal
curl -X POST "https://vibecode.bitrix24.tech/v1/infra/servers/APP_ID/db/restore" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"backupId":"BACKUP_ID"}'

JavaScript — личный ключ

javascript
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/infra/servers/${appId}/db/restore`,
  {
    method: 'POST',
    headers: { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json' },
    body: JSON.stringify({ backupId }),
  }
)
const { success, data, error } = await res.json()
if (!success) throw new Error(`${error.code}: ${error.message}`)
// Ход восстановления — в data.restore ответа GET /db/backups с тем же restoreId
console.log('Восстановление принято:', data.restoreId)

JavaScript — OAuth-приложение

javascript
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/infra/servers/${appId}/db/restore`,
  {
    method: 'POST',
    headers: {
      'X-Api-Key': 'YOUR_APP_KEY',
      'Authorization': 'Bearer USER_SESSION_TOKEN',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ backupId }),
  }
)
const { success, data, error } = await res.json()
if (!success) throw new Error(`${error.code}: ${error.message}`)

Поля ответа

HTTP-статус успешного ответа — 202 Accepted: восстановление принято в очередь, база ещё не заменена.

Поле Тип Описание
Полеsuccess Типboolean Описаниеtrue, когда восстановление поставлено в очередь
Полеdata.restoreId Типstring ОписаниеID восстановления. По нему восстановление находится в поле data.restore ответа GET /db/backups
Полеdata.backupId Типstring ОписаниеID копии из запроса
Полеdata.targetAppId Типstring (UUID) ОписаниеID приложения, базу которого заменяют, — значение id из пути
Полеdata.status Типstring ОписаниеВсегда QUEUED

Пример ответа

JSON
{
  "success": true,
  "data": {
    "restoreId": "cm2r7x4k10003qv8n5d2b6w1z",
    "backupId": "9e4d2c1b-6a3f-4b8e-a7d5-0c1f2e3d4b5a",
    "targetAppId": "5c0e8f2a-3d1b-4a7e-9f60-2b8c4d1e7a93",
    "status": "QUEUED"
  }
}

Пример ответа при ошибке

404 — копии с таким backupId нет:

JSON
{
  "success": false,
  "error": {
    "code": "NOT_FOUND",
    "message": "Server not found"
  }
}

Ошибки

HTTP Код Описание
HTTP400 КодVALIDATION_ERROR ОписаниеНет backupId, в теле неизвестное поле, недопустимые символы в backupId или file нарушает правила пути
HTTP400 КодAPP_DB_INVALID_FILE ОписаниеПоле file не передано, а значение VIBE_DB_PATH контейнера не указывает на допустимый путь внутри /data
HTTP400 КодAPP_DB_UNSUPPORTED_PLACEMENT ОписаниеПриложение размещено не в Галактике
HTTP401 КодMISSING_API_KEY ОписаниеНе передан заголовок X-Api-Key
HTTP401 КодINVALID_API_KEY ОписаниеКлюч не опознан
HTTP403 КодINFRA_SCOPE_REQUIRED ОписаниеУ ключа нет скоупа vibe:infra
HTTP403 КодAPP_DB_READONLY_KEY ОписаниеКлюч выпущен только для чтения
HTTP403 КодAPP_DB_DISABLED ОписаниеРабота с базой приложения не включена для портала
HTTP404 КодNOT_FOUND ОписаниеПриложения с таким id нет на портале, оно удалено или у ключа нет к нему доступа
HTTP404 КодNOT_FOUND ОписаниеКопии с таким backupId нет на портале, она ещё не в статусе COMPLETED, её срок хранения истёк или у ключа нет доступа к данным приложения, с которого она снята. Текст message одинаков для обоих случаев с NOT_FOUND
HTTP404 КодAPP_DB_NOT_FOUND ОписаниеУ приложения нет тома с данными
HTTP409 КодAPP_DB_BUSY ОписаниеВосстановление не принято: у приложения идёт копирование, другое восстановление, запись в базу, деплой или переезд, для приложения или хоста запрещено пробуждение либо баланс портала заморожен. Повторите через details.retryAfterSeconds секунд
HTTP413 КодPAYLOAD_TOO_LARGE ОписаниеТело больше 4 КиБ
HTTP422 КодAPP_DB_BACKUP_INVALID ОписаниеКопия завершена, но в ней нет данных, нужных для восстановления
HTTP429 КодRATE_LIMITED ОписаниеПревышен лимит запросов на запись для портала — Лимиты. Пауза — в заголовке Retry-After
HTTP503 КодAPP_DB_TOOL_UNAVAILABLE ОписаниеХост не подготовлен к работе с базой или платформа временно не может к нему обратиться. Готовность хоста — GET /app-db/prepare
HTTP503 Кодuser_self_deletion_pending ОписаниеВладелец ключа запросил удаление своего аккаунта на портале. Доступ вернётся после отмены удаления

Полный список общих ошибок API — Ошибки.

Известные особенности

Ход восстановления. Ответ 202 означает только приём запроса. Состояние читайте в data.restore ответа GET /db/backups, сверяя restoreId. На тестовом приложении восстановление заняло 12 минут и прошло фазы по порядку: VALIDATE, PREPARE, PRE_CHANGE, STAGE, STOPPING, SWAPPING, VERIFY, STARTING, CLEANUP. После завершения данные базы совпали с копией. Восстановление остаётся в статусе QUEUED, пока на платформе выполняется другое восстановление или на том же хосте идёт копирование либо запись в базу.

База занята до конца восстановления. Пока восстановление не завершено, запись в базу этого приложения и новые копии отвечают 409 APP_DB_BUSY. Чтение тоже получает 409 APP_DB_BUSY: так ответило чтение сразу после запуска восстановления на живом вызове, а с фазы STOPPING чтение закрыто до конца восстановления.

Перезапуск приложения. Работающее приложение на фазе STOPPING останавливается и на фазе STARTING запускается снова. Приложение, которое было остановлено до восстановления, остаётся остановленным.

Защитная копия перед заменой. На фазе PRE_CHANGE платформа сохраняет текущий файл копией с triggerType равным PRE_CHANGE — она видна в списке копий. Чтобы отменить восстановление, восстановите базу из этой копии. Если защитную копию создать не удалось, восстановление завершается со статусом FAILED, файл не заменяется. Если файла file у приложения ещё нет, защитная копия не создаётся.

Сбой во время замены. Сбой на фазах VALIDATE, PREPARE и PRE_CHANGE файл не трогает. Сбой на фазах от STAGE до VERIFY возвращает исходный файл через фазу ROLLBACK. В обоих случаях восстановление завершается со статусом FAILED и errorCode равным APP_DB_RESTORE_FAILED. Сбой на фазе STARTING и три неудачные попытки ROLLBACK переводят восстановление в фазу RECOVERY_REQUIRED со статусом RUNNING без автоматического отката: с фазы STARTING приложение уже работает с восстановленной базой. Такое восстановление ждёт службы поддержки, а база приложения до её вмешательства остаётся занятой.

Условия доступа к базе и правила хранения копий — Когда база доступна и Копии и их хранение.

Смотрите также