Для AI-агентов: markdown этой страницы — /docs-content/source-storage.md индекс документации — /llms.txt
Хранилище исходного кода
Хранилище исходного кода автоматически сохраняет снимки кода вашего приложения при каждом деплое. Если над приложением начинает работать другой человек или новая AI-сессия, последнюю версию можно скачать и продолжить с того же места — код не потеряется.
Разделы документации
- Автоматическое сохранение при деплое — что попадает в снапшот само, блок
sourceв ответе деплоя, деплой из сохранённой версии - Снапшот перед публикацией — что проверяется перед публикацией, отказ
409 SNAPSHOT_REQUIRED, публикация исходников с сервера - Сохранить снапшот —
POST /v1/apps/:id/sources, заголовки метаданных, дедупликация - Список версий — история версий приложения и связанные серверные версии
- Получить метаданные версии — одна версия по идентификатору
- Скачать архив — подписанная ссылка на архив версии
- Теги и комментарии версии —
PATCHметаданных и постановка тега - Удалить версию — удаление по идентификатору
- Очистить старые версии — массовая очистка истории
- Срок жизни версий и очистка — политика хранения, версии удалённого сервера, объекты в хранилище
- Серверные эндпоинты исходников — то же семейство с ключом сервера
- Реестр исходников и состояние портала —
GET /v1/me/sources, страница кабинета,capabilities.apps.sourceStorage
Зачем это нужно
Когда вы дорабатываете приложение, важно не потерять рабочую версию кода. Хранилище делает это автоматически: при каждом успешном деплое платформа сохраняет снимок исходников. Если позже над приложением начнёт работать другой человек или новая AI-сессия — он скачает последнюю версию и продолжит с того же места, без ручной пересылки архивов.
Снимок привязан к приложению, а не к конкретному разработчику: код остаётся у приложения, даже если меняется команда.
Чем это отличается от Git и GitHub
Это не система контроля версий и не замена Git. Хранилище решает более узкую задачу — страховка и передача проекта.
| Хранилище исходного кода | Git / GitHub | |
|---|---|---|
| Что хранит | целые снимки архива кода | историю изменений построчно |
| Когда сохраняет | автоматически при каждом деплое | вручную, по команде разработчика |
| Нужны ли навыки Git | нет | да |
| Ветки, слияния, сравнение версий | нет | да |
Нужна командная разработка с ветками и историей — используйте Git. Нужно просто не терять рабочий код и уметь вернуться к прошлой версии — достаточно хранилища.
Как это работает
- Вы дорабатываете приложение и запускаете деплой.
- Платформа сама сохраняет снимок исходников — очередную версию:
v1,v2,v3, … - В любой момент смотрите список версий и скачиваете нужную.
- Перед публикацией приложения платформа проверяет, что снимок сохранён.
правка кода → деплой → снимок vN сохранён автоматически
↓
список версий → скачать любую → продолжить работу
Основные понятия
- Снимок (снапшот) — заархивированная копия исходного кода приложения на момент сохранения.
- Версия
vN— порядковый номер снимка (v1,v2, …). Самый свежий считается текущим. - Тег — метка
manualилиpublished: помечает версию как важную, чтобы её не удалила автоматическая очистка. - Дедупликация — если код не изменился, новый снимок не создаётся, возвращается уже существующая версия. Действует в пределах одного владельца — сервера или приложения.
Доступ
Базовый URL: https://vibecode.bitrix24.tech/v1
Авторизация: заголовок X-Api-Key. Управлять снапшотами могут ключ авторизации приложения (vibe_app_*), личный ключ автора приложения (vibe_api_*) или администратор портала.
Допустимые форматы архива: application/gzip, application/x-tar, application/zip, application/octet-stream.
Лимит тела: 500 МБ на один запрос.
Контракт сохранения
Тело POST …/sources — сырые байты архива, не multipart/form-data. Метаданные передаются заголовками, а не полями формы и не query-параметрами.
| Заголовок | Обязательный | Описание |
|---|---|---|
Content-Type |
да | Формат архива из списка выше. Другое значение → 400 INVALID_CONTENT_TYPE |
Content-Length |
да | Размер тела в байтах. Без него (Transfer-Encoding: chunked) → 411 MISSING_CONTENT_LENGTH |
X-Filename |
нет | Имя файла для отображения. Если не указан — имя выводится из Content-Type. Символы вне набора a-zA-Z0-9._- → 400 INVALID_FILENAME |
X-Tags |
нет | Теги через запятую. Распознаются manual и published — они защищают версию от автоматической очистки |
X-Note |
нет | Комментарий, который сохраняется в записи о версии |
X-AI-Session-Id |
нет | Идентификатор AI-сессии, группирует снапшоты в манифесте |
curl -X POST https://vibecode.bitrix24.tech/v1/apps/<APP_ID>/sources \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Content-Type: application/gzip" \
-H "X-Tags: manual" \
-H "X-Note: Добавил OAuth-флоу" \
--data-binary @app-sources.tar.gz
Источник кода при развёртывании — поле source в POST /v1/infra/servers/:id/deploy принимает три взаимоисключающие формы:
| Форма | Что это |
|---|---|
source.content |
Встроенный архив в base64 — работает всегда, в том числе на galaxy-приложении |
source.url |
Подписанная ссылка из хранилища Вайбкод. На galaxy-приложении — за отдельным включением |
source.versionId |
Уже сохранённая версия вида vN. На galaxy-приложении — за отдельным включением |
Полный разбор сохранения — Сохранить снапшот, автосохранение и деплой из версии — Автоматическое сохранение при деплое.
Быстрый старт
Передать проект другому разработчику или новой AI-сессии — три вызова:
# 1. Что вообще сохранено под этим приложением
curl -H "X-Api-Key: YOUR_API_KEY" \
https://vibecode.bitrix24.tech/v1/apps/<APP_ID>/sources
# 2. Ссылка на архив нужной версии (действует 30 минут)
curl -H "X-Api-Key: YOUR_API_KEY" \
https://vibecode.bitrix24.tech/v1/apps/<APP_ID>/sources/v1/download
# 3. Скачать архив по полученной ссылке — без дополнительных заголовков
curl -o source-v1.tar.gz "<url из ответа выше>"
Полный пример
Непрерывный сценарий: сохранить снапшот, посмотреть список версий, скачать архив по ссылке и сверить контрольную сумму, удалить версию. Код выполняется в Node.js 18 и новее: сохраните его в файл с расширением .mjs, положите рядом архив app-sources.tar.gz, подставьте идентификатор приложения вместо <APP_ID> и передайте ключ в переменной окружения VIBE_KEY.
import { readFile } from 'node:fs/promises'
import { createHash } from 'node:crypto'
const VIBE_KEY = process.env.VIBE_KEY
const SOURCES = 'https://vibecode.bitrix24.tech/v1/apps/<APP_ID>/sources'
async function api(method, path = '', init = {}) {
const res = await fetch(`${SOURCES}${path}`, {
...init,
method,
headers: { 'X-Api-Key': VIBE_KEY, ...init.headers },
})
const json = await res.json()
if (!json.success) {
throw new Error(`${method} ${path} → ${res.status} ${json.error.code}`)
}
return json.data
}
// 1. Сохранить снапшот: тело — сырые байты архива,
// длину тела fetch указывает сам
const archive = await readFile(
new URL('./app-sources.tar.gz', import.meta.url),
)
const saved = await api('POST', '', {
headers: { 'Content-Type': 'application/gzip' },
body: archive,
})
if (saved.skipped) {
throw new Error(`Хранилище выключено: ${saved.reason}`)
}
console.log(
'Версия:', saved.versionId,
'| deduplicated:', saved.deduplicated,
)
// 2. Посмотреть список версий приложения
const list = await api('GET')
console.log(
'Всего версий:', list.totalVersions,
'| текущая:', list.currentVersionId,
)
// 3. Получить ссылку на архив и скачать его —
// ссылка действует 30 минут, ключ ей не нужен
const { url } = await api('GET', `/${saved.versionId}/download`)
const bytes = Buffer.from(await (await fetch(url)).arrayBuffer())
const sha256 = createHash('sha256').update(bytes).digest('hex')
console.log('Архив совпадает с сохранённым:', sha256 === saved.sha256)
// 4. Удалить версию, если её создал этот запуск. При deduplicated: true
// сохранение вернуло уже существующую версию с теми же байтами —
// её пример не трогает
if (!saved.deduplicated) {
const deleted = await api('DELETE', `/${saved.versionId}`)
console.log('Удалена версия:', deleted.versionId)
}
Справочник эндпоинтов
Снапшоты приложения:
| Метод | Путь | Действие |
|---|---|---|
POST |
/v1/apps/:id/sources |
Сохранить снапшот |
GET |
/v1/apps/:id/sources |
Список версий |
GET |
/v1/apps/:id/sources/:versionId |
Получить метаданные версии |
GET |
/v1/apps/:id/sources/:versionId/download |
Скачать архив |
PATCH |
/v1/apps/:id/sources/:versionId |
Обновить метаданные версии |
POST |
/v1/apps/:id/sources/:versionId/tag |
Поставить или снять тег |
DELETE |
/v1/apps/:id/sources/:versionId |
Удалить версию |
POST |
/v1/apps/:id/sources/cleanup |
Очистить старые версии |
Снапшоты сервера — то же семейство с ключом сервера, отличия и полный список путей на странице Серверные эндпоинты исходников.
Сводный реестр: GET /v1/me/sources — все владельцы снапшотов, доступные ключу, Реестр исходников.
Коды ошибок
Отказы, специфичные для хранилища исходников:
| HTTP | Код | Когда возвращается |
|---|---|---|
| 400 | INVALID_CONTENT_TYPE |
Content-Type не входит в список допустимых форматов архива |
| 400 | INVALID_SHA256 |
Параметр sha256 не равен 64 шестнадцатеричным символам |
| 400 | INVALID_VERSION_ID |
Формат versionId не соответствует v<целое неотрицательное число> |
| 400 | INVALID_KEEP_LATEST |
Значение keepLatest не является целым неотрицательным числом |
| 400 | SOURCE_VERSION_REQUIRES_APP |
Деплой по versionId ключом, которому сервер не принадлежит, а владелец сервера не привязан к приложению |
| 403 | NOT_AUTHORIZED |
Ключ не является ключом приложения, личным ключом автора или ключом администратора портала |
| 403 | PORTAL_KEY_REQUIRED |
Ключ не привязан к порталу — сводный реестр такому ключу недоступен |
| 403 | SOURCE_APP_ID_MISMATCH |
Ключ авторизации vibe_app_… обращается к снапшотам другого приложения |
| 403 | INFRA_FORBIDDEN_FOR_COWORK_KEY |
Сохранение, правка метаданных или удаление вызваны ключом Cowork/Code — Проектный ключ для деплоя |
| 403 | EXTERNAL_COLLABORATOR_KEY_SERVER_MISMATCH |
Вызов сделан ключом внешнего участника разработки, а в адресе указан не тот сервер, для которого ключ выпущен. Такой ключ действует ровно на одном сервере, и ответ не сообщает, существует ли запрошенный сервер. Для работы с другим сервером нужен ключ того внешнего членства |
| 403 | EXTERNAL_COLLABORATOR_NOT_A_MEMBER |
Ключ внешнего участника обращается к своему серверу, но доступа сейчас нет: членство снято, истёк его срок либо для аккаунта Битрикс24, которому принадлежит сервер, отключены внешние участники разработки. Код эти причины не различает и сведений о сервере не раскрывает. Членство перечитывается на каждом запросе, поэтому снятый доступ перестаёт работать сразу |
| 404 | APP_NOT_FOUND |
Приложение не существует, удалено или принадлежит другому порталу |
| 404 | VERSION_NOT_FOUND |
Версии с таким versionId нет или она удалена |
| 404 | SOURCE_VERSION_NOT_FOUND |
Версия не найдена ни в контексте сервера, ни в контексте приложения |
| 409 | SNAPSHOT_REQUIRED |
Публикация без сохранённого снапшота либо деплой с внешним URL |
| 409 | PROTECTED_BY_TAG |
Версия защищена тегом manual или published |
| 410 | SOURCE_VERSION_BYTES_PURGED |
Запись о версии жива, но байты уже вычищены из хранилища |
| 411 | MISSING_CONTENT_LENGTH |
Запрос на сохранение пришёл без Content-Length |
| 415 | UNSUPPORTED_ARCHIVE_FORMAT |
Первые байты архива противоречат заявленному Content-Type |
| 502 | SOURCE_DOWNLOAD_URL_FAILED |
Хранилище временно недоступно — повторите запрос |
Полный справочник кодов API — Коды ошибок.