← Sandbox SDK / sandbox / api
Резервные копии
Создавайте моментальные снимки каталогов песочницы на определённый момент времени и восстанавливайте их с помощью оверлеев copy-on-write.
Методы
createBackup()
Создаёт моментальный снимок каталога на определённый момент времени и загружает его в хранилище R2.
await sandbox.createBackup(options: BackupOptions): Promise<DirectoryBackup>Параметры:
options- Конфигурация резервного копирования (см.BackupOptions):dir(обязательно) - Абсолютный путь к каталогу для резервного копирования (например,"/workspace")name(необязательно) - Понятное человеку имя резервной копии. Не более 256 символов, без управляющих символов.ttl(необязательно) - Время жизни в секундах до истечения срока действия резервной копии. По умолчанию:259200(3 дня). Значение должно быть положительным числом.useGitignore(необязательно) - Еслиtrue, исключает файлы, соответствующие.gitignoreправила из резервной копии. По умолчанию:false. Если каталог не находится внутри репозитория git, исключения не применяются. Требуетсяgitдолжен быть доступен в контейнере.localBucket(необязательно) - Еслиtrue, используетBACKUP_BUCKETпривязку R2 напрямую вместо presigned URL. Предназначено для использования сwrangler dev. По умолчанию:false.
Возвращает: Promise<DirectoryBackup> содержащий:
id- Уникальный идентификатор резервной копии (UUID)dir- Каталог, для которого была создана резервная копия
import { getSandbox } from "@cloudflare/sandbox";
const sandbox = getSandbox(env.Sandbox, "my-sandbox");
// Create a backup of /workspace
const backup = await sandbox.createBackup({ dir: "/workspace" });
// Later, restore the backup
await sandbox.restoreBackup(backup);import { getSandbox } from "@cloudflare/sandbox";
const sandbox = getSandbox(env.Sandbox, "my-sandbox");
// Create a backup of /workspace
const backup = await sandbox.createBackup({ dir: "/workspace" });
// Later, restore the backup
await sandbox.restoreBackup(backup);Как это работает:
В продакшене:
- Контейнер создаёт из каталога сжатый архив squashfs.
- Контейнер загружает архив напрямую в R2 по предварительно подписанному URL.
- Метаданные хранятся вместе с архивом в R2.
- Локальный архив удаляется.
С localBucket: true (локальная разработка):
- Контейнер создаёт из каталога сжатый архив squashfs.
- Архив загружается напрямую в
BACKUP_BUCKETпривязка R2. - Метаданные хранятся вместе с архивом в R2.
- Локальный архив удаляется.
Исключения:
InvalidBackupConfigError- Еслиdirне является абсолютным, содержит..,BACKUP_BUCKETпривязка отсутствует либо (в продакшене) не настроены учётные данные presigned URL для R2BackupCreateError- Если контейнеру не удаётся создать архив, загрузка в R2 завершается ошибкой, илиuseGitignoreэтоtrueноgitнедоступен в контейнере
restoreBackup()
Восстанавливает ранее созданную резервную копию в указанный каталог.
await sandbox.restoreBackup(backup: DirectoryBackup): Promise<RestoreBackupResult>Параметры:
backup- Дескриптор резервной копии, возвращаемыйcreateBackup(). Содержитidиdir. (см.DirectoryBackup)
Возвращает: Promise<RestoreBackupResult> содержащий:
success- Успешно ли выполнено восстановлениеdir- Каталог, который был восстановленid- ID восстановленной резервной копии
// Create a named backup with 24-hour TTL
const backup = await sandbox.createBackup({
dir: "/workspace",
name: "before-refactor",
ttl: 86400,
});
// Store the handle for later use
await env.KV.put(`backup:${userId}`, JSON.stringify(backup));// Create a named backup with 24-hour TTL
const backup = await sandbox.createBackup({
dir: "/workspace",
name: "before-refactor",
ttl: 86400,
});
// Store the handle for later use
await env.KV.put(`backup:${userId}`, JSON.stringify(backup));Как это работает:
В продакшене:
- Метаданные загружаются из R2, после чего проверяется TTL. Если срок истёк, выбрасывается ошибка (с запасом в 60 секунд).
- Контейнер загружает архив напрямую из R2 по предварительно подписанному URL.
- Контейнер монтирует архив squashfs с помощью FUSE overlayfs.
С localBucket: true (локальная разработка):
- Метаданные загружаются из
BACKUP_BUCKETпривязка R2, и проверяется TTL. - Архив загружается из привязки R2.
- Архив распаковывается в целевой каталог с помощью
unsquashfs.
Исключения:
InvalidBackupConfigError- Еслиbackup.idотсутствует или не является допустимым UUID, либоbackup.dirнедействителенBackupNotFoundError- Если метаданные или архив резервной копии не найдены в R2BackupExpiredError- Если истёк TTL резервной копииBackupRestoreError- Если контейнеру не удаётся восстановить данные
Сценарии использования
Исключение файлов из .gitignore
Используйте useGitignore чтобы исключить файлы, соответствующие .gitignore правила (например, node_modules/ или dist/) из резервной копии. Это уменьшает размер резервной копии для git-репозиториев.
const sandbox = getSandbox(env.Sandbox, "my-sandbox");
// Exclude gitignored files from the backup
const backup = await sandbox.createBackup({
dir: "/workspace",
useGitignore: true,
});
// Without useGitignore (default), all files are included
const fullBackup = await sandbox.createBackup({
dir: "/workspace",
});const sandbox = getSandbox(env.Sandbox, "my-sandbox");
// Exclude gitignored files from the backup
const backup = await sandbox.createBackup({
dir: "/workspace",
useGitignore: true,
});
// Without useGitignore (default), all files are included
const fullBackup = await sandbox.createBackup({
dir: "/workspace",
});Если каталог находится не внутри git-репозитория, useGitignore не действует, и включаются все файлы. Если useGitignore это true но git не установлен в контейнере, BackupCreateError выбрасывается.
Контрольные точки и восстановление
Используйте резервные копии в качестве контрольных точек перед рискованными операциями.
// Save checkpoint before risky operation
const checkpoint = await sandbox.createBackup({ dir: "/workspace" });
try {
await sandbox.exec("npm install some-experimental-package");
await sandbox.exec("npm run build");
} catch (error) {
// Restore to the checkpoint if something goes wrong
await sandbox.restoreBackup(checkpoint);
}// Save checkpoint before risky operation
const checkpoint = await sandbox.createBackup({ dir: "/workspace" });
try {
await sandbox.exec("npm install some-experimental-package");
await sandbox.exec("npm run build");
} catch (error) {
// Restore to the checkpoint if something goes wrong
await sandbox.restoreBackup(checkpoint);
}Обработка ошибок
import { getSandbox } from "@cloudflare/sandbox";
const sandbox = getSandbox(env.Sandbox, "my-sandbox");
try {
const backup = await sandbox.createBackup({ dir: "/workspace" });
console.log(`Backup created: ${backup.id}`);
} catch (error) {
if (error.code === "INVALID_BACKUP_CONFIG") {
console.error("Configuration error:", error.message);
} else if (error.code === "BACKUP_CREATE_FAILED") {
console.error("Backup failed:", error.message);
}
}import { getSandbox } from "@cloudflare/sandbox";
const sandbox = getSandbox(env.Sandbox, "my-sandbox");
try {
const backup = await sandbox.createBackup({ dir: "/workspace" });
console.log(`Backup created: ${backup.id}`);
} catch (error) {
if (error.code === "INVALID_BACKUP_CONFIG") {
console.error("Configuration error:", error.message);
} else if (error.code === "BACKUP_CREATE_FAILED") {
console.error("Backup failed:", error.message);
}
}Поведение
- Параллельные операции резервного копирования и восстановления для одной и той же песочницы автоматически выполняются последовательно.
- Возвращённый
DirectoryBackupхендл сериализуем: сохраните его в KV, D1 или хранилище Durable Object. - Перекрывающиеся резервные копии независимы друг от друга. Восстановление родительского каталога перезаписывает точки монтирования вложенных каталогов.
Применение TTL
ttl значение управляет тем, когда резервная копия считается устаревшей. SDK применяет это правило на только время восстановления : при вызове restoreBackup(), SDK считывает метаданные резервной копии из R2 и проверяет, истек ли TTL. Если истек, восстановление отклоняется с ошибкой BACKUP_EXPIRED ошибка.
TTL не автоматически не удаляет объекты из R2. Архивы резервных копий с истёкшим сроком и метаданные остаются в вашем R2 bucket, пока вы их не удалите. Чтобы автоматически очищать объекты с истёкшим сроком, настройте Правило жизненного цикла объекта R2 для вашего бакета резервных копий. Без правила жизненного цикла истёкшие резервные копии продолжают занимать место в хранилище R2.
Типы
BackupOptions
interface BackupOptions {
dir: string;
name?: string;
ttl?: number;
useGitignore?: boolean;
localBucket?: boolean;
}Поля:
dir(обязательно) - Абсолютный путь к каталогу для резервного копированияname(необязательно) - Понятное человеку имя резервной копии. Не более 256 символов, без управляющих символов.ttl(необязательно) - Время жизни в секундах. По умолчанию:259200(3 дня). Значение должно быть положительным числом.useGitignore(необязательно) - Еслиtrue, исключает файлы, соответствующие.gitignoreправила, если каталог находится внутри репозитория git. По умолчанию:false. Если каталог не находится внутри репозитория git, исключения на основе git не применяются.localBucket(необязательно) - Еслиtrue, используетBACKUP_BUCKETпривязку R2 напрямую вместо presigned URL. Предназначено для использования сwrangler dev. По умолчанию:false.
DirectoryBackup
interface DirectoryBackup {
readonly id: string;
readonly dir: string;
}Поля:
id- Уникальный идентификатор резервной копии (UUID)dir- Каталог, для которого была создана резервная копия
RestoreBackupResult
interface RestoreBackupResult {
success: boolean;
dir: string;
id: string;
}Поля:
success- Успешно ли выполнено восстановлениеdir- Каталог, который был восстановленid- ID восстановленной резервной копии
Дополнительные материалы
- Storage API - Монтируйте бакеты, совместимые с S3
- Files API - Чтение и запись файлов
- Конфигурация Wrangler - Настройте привязки