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

Хранилище исходного кода

Хранилище исходного кода автоматически сохраняет снимки кода вашего приложения при каждом деплое. Если над приложением начинает работать другой человек или новая AI-сессия, последнюю версию можно скачать и продолжить с того же места — код не потеряется.

Разделы документации

Зачем это нужно

Когда вы дорабатываете приложение, важно не потерять рабочую версию кода. Хранилище делает это автоматически: при каждом успешном деплое платформа сохраняет снимок исходников. Если позже над приложением начнёт работать другой человек или новая AI-сессия — он скачает последнюю версию и продолжит с того же места, без ручной пересылки архивов.

Снимок привязан к приложению, а не к конкретному разработчику: код остаётся у приложения, даже если меняется команда.

Чем это отличается от Git и GitHub

Это не система контроля версий и не замена Git. Хранилище решает более узкую задачу — страховка и передача проекта.

Хранилище исходного кода Git / GitHub
Что хранит целые снимки архива кода историю изменений построчно
Когда сохраняет автоматически при каждом деплое вручную, по команде разработчика
Нужны ли навыки Git нет да
Ветки, слияния, сравнение версий нет да

Нужна командная разработка с ветками и историей — используйте Git. Нужно просто не терять рабочий код и уметь вернуться к прошлой версии — достаточно хранилища.

Как это работает

  1. Вы дорабатываете приложение и запускаете деплой.
  2. Платформа сама сохраняет снимок исходников — очередную версию: v1, v2, v3, …
  3. В любой момент смотрите список версий и скачиваете нужную.
  4. Перед публикацией приложения платформа проверяет, что снимок сохранён.
правка кода  →  деплой  →  снимок 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-сессии, группирует снапшоты в манифесте
Terminal
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-сессии — три вызова:

Terminal
# 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.

javascript
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 — Коды ошибок.

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