Для 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 — личный ключ
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-приложение
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 — личный ключ
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-приложение
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 |
Пример ответа
{
"success": true,
"data": {
"restoreId": "cm2r7x4k10003qv8n5d2b6w1z",
"backupId": "9e4d2c1b-6a3f-4b8e-a7d5-0c1f2e3d4b5a",
"targetAppId": "5c0e8f2a-3d1b-4a7e-9f60-2b8c4d1e7a93",
"status": "QUEUED"
}
}
Пример ответа при ошибке
404 — копии с таким backupId нет:
{
"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 приложение уже работает с восстановленной базой. Такое восстановление ждёт службы поддержки, а база приложения до её вмешательства остаётся занятой.
Условия доступа к базе и правила хранения копий — Когда база доступна и Копии и их хранение.