← Sandbox SDK / sandbox / configuration
Переменные окружения
Передавайте конфигурацию, секреты и настройки времени выполнения в свои песочницы с помощью переменных окружения.
Переменные конфигурации SDK
Эти переменные окружения определяют поведение Sandbox SDK. Задайте их как Worker vars в вашем wrangler.jsonc файл. SDK считывает их из привязок окружения Worker.
SANDBOX_TRANSPORT
| Тип | "http" | "websocket" | "rpc" |
| По умолчанию | "http" |
Определяет протокол передачи данных для взаимодействия SDK с контейнером. Транспорт RPC мультиплексирует все операции через одно постоянное соединение, что позволяет избежать ограничения на подзапросы при выполнении множества операций SDK в рамках одного запроса.
{
"vars": {
"SANDBOX_TRANSPORT": "rpc"
}
}[vars]
SANDBOX_TRANSPORT = "rpc"Полное руководство с допустимыми режимами транспорта, вопросами производительности и инструкциями по миграции см. в Режимы транспорта.
COMMAND_TIMEOUT_MS
| Тип | number (миллисекунды) |
| По умолчанию | Нет (без тайм-аута) |
Задаёт глобальный тайм-аут по умолчанию для каждой exec() вызов. Если это значение задано, любая команда, превышающая эту длительность, вызывает ошибку на стороне вызывающего кода и закрывает соединение.
Для каждой команды timeout на exec() и уровня сессии commandTimeoutMs на createSession() оба переопределяют это значение. Подробнее о приоритете тайм-аутов см. Выполнение команд: тайм-ауты.
{
"vars": {
"COMMAND_TIMEOUT_MS": "30000"
}
}[vars]
COMMAND_TIMEOUT_MS = "30000"Три способа задать переменные окружения
Sandbox SDK предлагает три способа задания переменных окружения, каждый из которых подходит для своих задач:
1. На уровне Sandbox с помощью setEnvVars()
Задайте переменные окружения глобально для всех команд в sandbox:
const sandbox = getSandbox(env.Sandbox, "my-sandbox");
// Set once, available for all subsequent commands
await sandbox.setEnvVars({
DATABASE_URL: env.DATABASE_URL,
API_KEY: env.API_KEY,
});
await sandbox.exec("python migrate.py"); // Has DATABASE_URL and API_KEY
await sandbox.exec("python seed.py"); // Has DATABASE_URL and API_KEY
// Unset variables by passing undefined
await sandbox.setEnvVars({
API_KEY: "new-key", // Updates API_KEY
OLD_SECRET: undefined, // Unsets OLD_SECRET
});Когда использовать: Вам нужны одни и те же переменные окружения для нескольких команд.
Удаление переменных: Передайте undefined или null чтобы сбросить переменные окружения:
await sandbox.setEnvVars({
API_KEY: 'new-key', // Sets API_KEY
OLD_SECRET: undefined, // Unsets OLD_SECRET
DEBUG_MODE: null // Unsets DEBUG_MODE
});2. Для отдельной команды через параметры exec()
Передайте переменные окружения для конкретной команды:
await sandbox.exec("node app.js", {
env: {
NODE_ENV: "production",
PORT: "3000",
},
});
// Also works with startProcess()
await sandbox.startProcess("python server.py", {
env: {
DATABASE_URL: env.DATABASE_URL,
},
});Когда использовать: Вам нужны разные переменные окружения для разных команд, или вы хотите переопределить переменные уровня sandbox.
3. На уровне сессии с помощью createSession()
Создайте изолированный сеанс с собственными переменными окружения:
const session = await sandbox.createSession({
env: {
DATABASE_URL: env.DATABASE_URL,
SECRET_KEY: env.SECRET_KEY,
},
});
// All commands in this session have these vars
await session.exec("python migrate.py");
await session.exec("python seed.py");Когда использовать: Вам нужны изолированные контексты выполнения с разными переменными окружения, работающие одновременно.
Удаление переменных окружения
Sandbox SDK поддерживает удаление переменных окружения, если передать undefined или null значения. Это позволяет использовать идиоматичные шаблоны JavaScript для управления конфигурацией:
await sandbox.setEnvVars({
// Set new values
API_KEY: 'new-key',
DATABASE_URL: env.DATABASE_URL,
// Unset variables (removes them from the environment)
OLD_API_KEY: undefined,
TEMP_TOKEN: null
});До этого изменения: Передача undefined значения приведут к ошибке во время выполнения.
После этого изменения: undefined и null значения запускают unset VARIABLE_NAME в оболочке.
Варианты использования удаления переменных
Удаляйте конфиденциальные данные после использования:
// Use a temporary token
await sandbox.setEnvVars({ TEMP_TOKEN: 'abc123' });
await sandbox.exec('curl -H "Authorization: $TEMP_TOKEN" api.example.com');
// Clean up the token
await sandbox.setEnvVars({ TEMP_TOKEN: undefined });Условная настройка окружения:
await sandbox.setEnvVars({
API_KEY: env.API_KEY,
DEBUG_MODE: env.NODE_ENV === 'development' ? 'true' : undefined,
PROFILING: env.ENABLE_PROFILING ? 'true' : undefined
});Сбросьте настройки до системных значений по умолчанию:
// Unset to fall back to container's default NODE_ENV
await sandbox.setEnvVars({ NODE_ENV: undefined });Типичные паттерны
Передача секретов Worker в песочницу
Безопасно передавайте секреты из своего Worker в песочницу. Сначала задайте секреты с помощью Wrangler:
wrangler secret put OPENAI_API_KEY
wrangler secret put DATABASE_URLЗатем передайте их в свою песочницу:
import { getSandbox } from "@cloudflare/sandbox";
export { Sandbox } from "@cloudflare/sandbox";
interface Env {
Sandbox: DurableObjectNamespace<Sandbox>;
OPENAI_API_KEY: string;
DATABASE_URL: string;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const sandbox = getSandbox(env.Sandbox, "user-sandbox");
// Option 1: Set globally for all commands
await sandbox.setEnvVars({
OPENAI_API_KEY: env.OPENAI_API_KEY,
DATABASE_URL: env.DATABASE_URL,
});
await sandbox.exec("python analyze.py");
// Option 2: Pass per-command
await sandbox.exec("python analyze.py", {
env: {
OPENAI_API_KEY: env.OPENAI_API_KEY,
},
});
return Response.json({ success: true });
},
};Объединение переменных по умолчанию и специфичных переменных
const defaults = { NODE_ENV: "production", LOG_LEVEL: "info" };
await sandbox.exec("npm start", {
env: { ...defaults, PORT: "3000", API_KEY: env.API_KEY },
});Несколько изолированных сессий
Одновременный запуск разных задач с разными переменными окружения:
// Production database session
const prodSession = await sandbox.createSession({
env: { DATABASE_URL: env.PROD_DATABASE_URL },
});
// Staging database session
const stagingSession = await sandbox.createSession({
env: { DATABASE_URL: env.STAGING_DATABASE_URL },
});
// Run migrations on both concurrently
await Promise.all([
prodSession.exec("python migrate.py"),
stagingSession.exec("python migrate.py"),
]);Настройте режим транспорта
Задайте SANDBOX_TRANSPORT в вашем Worker vars для переключения между транспортами HTTP, WebSocket и RPC. Подробнее о том, когда и как настраивать каждый транспорт, см. Режимы транспорта.
Учётные данные для монтирования бакета
При монтировании S3-совместимого объектного хранилища SDK использует s3fs-fuse под капотом, что требует учётных данных в стиле AWS. Для R2 создайте API-токены в панели управления Cloudflare и передайте их, используя имена переменных окружения AWS:
Получите API-токены R2:
- Перейдите в R2 > Обзор ↗ в панели управления Cloudflare
- Выберите Управление API-токенами R2
- Создайте токен с Object Read & Write разрешения
- Скопируйте Access Key ID и Secret Access Key
Задайте учётные данные как секреты Worker:
wrangler secret put AWS_ACCESS_KEY_ID
# Paste your R2 Access Key ID
wrangler secret put AWS_SECRET_ACCESS_KEY
# Paste your R2 Secret Access KeyПодключайте бакеты с автоматическим определением учетных данных:
import { getSandbox } from "@cloudflare/sandbox";
export { Sandbox } from "@cloudflare/sandbox";
interface Env {
Sandbox: DurableObjectNamespace<Sandbox>;
AWS_ACCESS_KEY_ID: string;
AWS_SECRET_ACCESS_KEY: string;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const sandbox = getSandbox(env.Sandbox, "data-processor");
// Credentials automatically detected from environment
await sandbox.mountBucket("my-r2-bucket", "/data", {
endpoint: "https://YOUR_ACCOUNT_ID.r2.cloudflarestorage.com",
});
// Access mounted bucket using standard file operations
await sandbox.exec("python", { args: ["process.py", "/data/input.csv"] });
return Response.json({ success: true });
},
};SDK автоматически определяет AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY из окружения вашего Worker при вызове mountBucket() без явных учётных данных.
Явная передача учётных данных (если используются пользовательские имена секретов):
await sandbox.mountBucket("my-r2-bucket", "/data", {
endpoint: "https://YOUR_ACCOUNT_ID.r2.cloudflarestorage.com",
credentials: {
accessKeyId: env.R2_ACCESS_KEY_ID,
secretAccessKey: env.R2_SECRET_ACCESS_KEY,
},
});См. Руководство по подключению бакетов для получения полной документации по монтированию бакетов.
Приоритет переменных окружения
Если одна и та же переменная задана на нескольких уровнях, приоритет имеет наиболее конкретный уровень:
- На уровне команды (наивысший) - Передаётся в
exec()илиstartProcess()параметры - Уровень песочницы или сессии - Задаётся с помощью
setEnvVars() - Контейнер по умолчанию - Встроено в образ Docker с помощью
ENV - Значение по умолчанию системы (низший) - Значения по умолчанию операционной системы
Пример:
// In Dockerfile: ENV NODE_ENV=development
// Sandbox-level
await sandbox.setEnvVars({ NODE_ENV: "staging" });
// Command-level overrides all
await sandbox.exec("node app.js", {
env: { NODE_ENV: "production" }, // This wins
});Дополнительные материалы
- Режимы транспорта - Настройте транспорт HTTP, WebSocket и RPC
- Конфигурация Wrangler - Настройка окружения на уровне Worker
- Секреты - Управление конфиденциальными данными
- Sessions API - Переменные окружения на уровне сессии
- Модель безопасности - Изучение изоляции данных
- Обработка исходящего трафика - Держите учётные данные полностью за пределами песочницы, используя обработчики исходящих запросов