데이토나샌드박스
격리된 상태에서 명령을 실행합니다.Daytona클라우드 샌드박스. 다중 런타임, 리소스 구성, 볼륨, 스냅샷, 스트리밍 출력, 샌드박스 재연결, 파일 시스템 마운트(S3, GCS) 및 네트워크 격리를 지원합니다. 인터페이스에 대한 자세한 내용은 다음을 참조하세요.WorkspaceSandbox 인터페이스.
설치설치에 대한 직접 링크
- npm
- pnpm
- Yarn
- Bun
npm install @mastra/daytona
pnpm add @mastra/daytona
yarn add @mastra/daytona
bun add @mastra/daytona
세 가지 방법 중 하나로 Daytona API 키를 설정하세요.
- Shell export
- .env file
- Constructor
export DAYTONA_API_KEY=your-api-key
DAYTONA_API_KEY=your-api-key
new DaytonaSandbox({ apiKey: 'your-api-key' })
용법용법에 대한 직접 링크
Workspace에 DaytonaSandbox를 추가하고 Agent에 할당합니다:
import { Agent } from '@mastra/core/agent'
import { Workspace } from '@mastra/core/workspace'
import { DaytonaSandbox } from '@mastra/daytona'
const workspace = new Workspace({
sandbox: new DaytonaSandbox({
language: 'typescript',
timeout: 120_000,
}),
})
const agent = new Agent({
id: 'code-agent',
name: 'Code Agent',
instructions: 'You are a coding assistant working in this workspace.',
model: 'anthropic/claude-sonnet-4-6',
workspace,
})
const response = await agent.generate(
'Print "Hello, world!" and show the current working directory.',
)
console.log(response.text)
// I'll run both commands simultaneously!
//
// Here are the results:
//
// 1. **Hello, world!** — Successfully printed the message.
// 2. **Current Working Directory** — `/home/daytona`
//
// Both commands ran in parallel and completed successfully!
스냅샷 포함스냅샷 포함에 대한 직접 링크
사전 빌드된 스냅샷을 사용하여 환경 설정 시간을 건너뜁니다.
const workspace = new Workspace({
sandbox: new DaytonaSandbox({
snapshot: 'my-snapshot-id',
timeout: 60_000,
}),
})
리소스가 포함된 커스텀 이미지리소스가 포함된 커스텀 이미지에 대한 직접 링크
특정 리소스 할당이 포함된 사용자 지정 Docker 이미지를 사용합니다.
const workspace = new Workspace({
sandbox: new DaytonaSandbox({
image: 'node:20-slim',
resources: { cpu: 2, memory: 4, disk: 6 },
language: 'typescript',
}),
})
임시 샌드박스임시 샌드박스에 대한 직접 링크
일회성 작업의 경우: 중지 시 샌드박스가 즉시 삭제됩니다.
const workspace = new Workspace({
sandbox: new DaytonaSandbox({
ephemeral: true,
language: 'python',
}),
})
스트리밍 출력스트리밍 출력에 대한 직접 링크
onStdout 및 onStderr 콜백을 통해 명령 출력을 실시간으로 스트리밍합니다:
await sandbox.executeCommand('bash', ['-c', 'for i in 1 2 3; do echo "line $i"; sleep 1; done'], {
onStdout: chunk => process.stdout.write(chunk),
onStderr: chunk => process.stderr.write(chunk),
})
두 콜백 모두 선택 사항이며 독립적으로 사용할 수 있습니다.
재연결재연결에 대한 직접 링크
동일한 id를 제공하여 기존 Sandbox에 다시 연결합니다. Sandbox는 파일과 상태가 그대로 유지된 채 재개됩니다:
const sandbox = new DaytonaSandbox({ id: 'my-persistent-sandbox' })
// First session
await sandbox._start()
await sandbox.executeCommand('sh', ['-c', 'echo "session 1" > /tmp/state.txt'])
await sandbox._stop()
// Later — reconnects to the same sandbox
const sandbox2 = new DaytonaSandbox({ id: 'my-persistent-sandbox' })
await sandbox2._start()
const result = await sandbox2.executeCommand('cat', ['/tmp/state.txt'])
console.log(result.stdout) // "session 1"
샌드박스가 중지되거나 보관된 상태인 경우 자동으로 다시 시작됩니다. 작동 불능 상태(파괴, 오류 발생)인 경우 대신 새로운 샌드박스가 생성됩니다.
파일 시스템 마운트파일 시스템 마운트에 대한 직접 링크
S3 또는 GCS 버킷을 샌드박스 내부의 로컬 디렉터리로 마운트합니다.
작업 공간 마운트 구성을 통해작업 공간 마운트 구성을 통해에 대한 직접 링크
가장 간단한 방법: 샌드박스가 시작될 때 파일 시스템이 자동으로 마운트됩니다.
import { Workspace } from '@mastra/core/workspace'
import { DaytonaSandbox } from '@mastra/daytona'
import { GCSFilesystem } from '@mastra/gcs'
import { S3Filesystem } from '@mastra/s3'
const workspace = new Workspace({
mounts: {
'/s3-data': new S3Filesystem({
bucket: process.env.S3_BUCKET!,
region: 'auto',
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
endpoint: process.env.S3_ENDPOINT, // e.g. https://<account-id>.r2.cloudflarestorage.com
}),
'/gcs-data': new GCSFilesystem({
bucket: process.env.GCS_BUCKET!,
projectId: 'my-project-id',
credentials: JSON.parse(process.env.GCS_SERVICE_ACCOUNT_KEY!),
}),
},
sandbox: new DaytonaSandbox({ language: 'python' }),
})
Workspace가 시작되면 파일 시스템이 지정된 경로에 자동으로 마운트됩니다. Sandbox에서 실행되는 코드는 /s3-data 및 /gcs-data의 파일에 로컬 디렉터리처럼 액세스할 수 있습니다.
을 통해sandbox.mount()via-sandboxmount에 대한 직접 링크
샌드박스가 시작된 후 언제든지 수동으로 마운트합니다.
S3S3에 대한 직접 링크
import { S3Filesystem } from '@mastra/s3'
await sandbox.mount(
new S3Filesystem({
bucket: process.env.S3_BUCKET!,
region: 'us-east-1',
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
}),
'/data',
)
S3 호환(Cloudflare R2, MinIO)S3 호환(Cloudflare R2, MinIO)에 대한 직접 링크
import { S3Filesystem } from '@mastra/s3'
await sandbox.mount(
new S3Filesystem({
bucket: process.env.S3_BUCKET!,
region: 'auto',
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
endpoint: process.env.S3_ENDPOINT, // e.g. https://<account-id>.r2.cloudflarestorage.com
}),
'/data',
)
GCSGCS에 대한 직접 링크
import { GCSFilesystem } from '@mastra/gcs'
await sandbox.mount(
new GCSFilesystem({
bucket: process.env.GCS_BUCKET!,
projectId: 'my-project-id',
credentials: JSON.parse(process.env.GCS_SERVICE_ACCOUNT_KEY!),
}),
'/data',
)
네트워크 격리네트워크 격리에 대한 직접 링크
아웃바운드 네트워크 액세스를 제한합니다.
const workspace = new Workspace({
sandbox: new DaytonaSandbox({
networkBlockAll: true,
networkAllowList: '10.0.0.0/8,192.168.0.0/16',
}),
})
패키지 레지스트리 및 호스팅 API처럼 IP 주소가 변경되는 서비스에는 domainAllowList를 사용합니다:
const workspace = new Workspace({
sandbox: new DaytonaSandbox({
networkBlockAll: true,
domainAllowList: 'registry.npmjs.org,*.githubusercontent.com',
}),
})
두 허용 목록은 모두 Sandbox 생성 시 적용되며 clone()에서도 유지됩니다. Sandbox가 시작된 후 정책을 변경하려면 기본 Daytona Sandbox를 사용합니다:
await sandbox.instance.updateNetworkSettings({
domainAllowList: 'api.example.com',
})
생성자 매개변수생성자 매개변수에 대한 직접 링크
id?:
apiKey?:
apiUrl?:
target?:
timeout?:
language?:
snapshot?:
image?:
resources?:
env?:
labels?:
name?:
user?:
public?:
ephemeral?:
autoStopInterval?:
autoArchiveInterval?:
autoDeleteInterval?:
volumes?:
networkBlockAll?:
networkAllowList?:
domainAllowList?:
*.githubusercontent.com과 같은 와일드카드를 지원합니다. IP 주소가 변경되는 서비스에는 networkAllowList 대신 이 옵션을 사용합니다.속성속성에 대한 직접 링크
id:
name:
provider:
status:
instance:
processes:
백그라운드 프로세스백그라운드 프로세스에 대한 직접 링크
DaytonaSandbox백그라운드 프로세스 생성 및 관리를 위한 내장 프로세스 관리자가 포함되어 있습니다. 프로세스는 세션 기반 명령 실행을 사용하여 Daytona 클라우드 샌드박스에서 실행됩니다.
const sandbox = new DaytonaSandbox({ language: 'typescript' })
await sandbox.start()
// Spawn a background process
const handle = await sandbox.processes.spawn('node server.js', {
env: { PORT: '3000' },
onStdout: data => console.log(data),
})
// Interact with the process
console.log(handle.stdout)
await handle.sendStdin('input\n')
await handle.kill()
전체 API는 SandboxProcessManager 레퍼런스를 참조하세요.
클라우드 스토리지 마운트클라우드 스토리지 마운트에 대한 직접 링크
Daytona 샌드박스는 S3 또는 GCS 버킷을 마운트할 수 있으므로 샌드박스 내부의 로컬 디렉터리로 클라우드 스토리지에 액세스할 수 있습니다. 이는 다음과 같은 경우에 유용합니다.
- 클라우드 버킷에 저장된 대규모 데이터 세트 처리
- 출력 파일을 클라우드 스토리지에 직접 쓰기
- 샌드박스 세션 간 데이터 공유
사용 예는 다음을 참조하세요.Filesystem mounting.
Daytona 샌드박스는 FUSE(사용자 공간의 파일 시스템)를 사용하여 클라우드 스토리지를 탑재합니다.
필수 FUSE Tool은 샌드박스 이미지에 아직 없는 경우 마운트 시 자동으로 설치됩니다.
S3 환경 변수S3 환경 변수에 대한 직접 링크
| 변수 | 설명 |
|---|---|
S3_BUCKET | 버킷 이름 |
S3_REGION | AWS 리전 또는 R2/MinIO용 auto |
S3_ACCESS_KEY_ID | 액세스 키 ID |
S3_SECRET_ACCESS_KEY | 비밀 액세스 키 |
S3_ENDPOINT | 엔드포인트 URL(S3 호환 스토리지만 해당) |
GCS 환경 변수GCS 환경 변수에 대한 직접 링크
| 변수 | 설명 |
|---|---|
GCS_BUCKET | 버킷 이름 |
GCS_SERVICE_ACCOUNT_KEY | 서비스 계정 키 JSON(경로가 아닌 전체 JSON 문자열) |
스냅샷으로 콜드 스타트 대기 시간 줄이기스냅샷으로 콜드 스타트 대기 시간 줄이기에 대한 직접 링크
기본적으로 s3fs와 gcsfuse는 처음 마운트할 때 apt를 통해 설치되므로 시작 시간이 늘어납니다. 이를 방지하려면 Daytona 스냅샷에 미리 포함하고 snapshot 옵션을 통해 스냅샷 이름을 전달하세요.
옵션 1: 선언적 이미지 빌드
import { Daytona, Image } from '@daytonaio/sdk'
const template = Image.base('daytonaio/sandbox')
.runCommands('sudo apt-get update -qq')
.runCommands('sudo apt-get install -y s3fs')
// gcsfuse requires the Google Cloud apt repository
.runCommands(
'sudo mkdir -p /etc/apt/keyrings && ' +
'curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg -o /tmp/gcsfuse-key.gpg && ' +
'sudo gpg --batch --yes --dearmor -o /etc/apt/keyrings/gcsfuse.gpg /tmp/gcsfuse-key.gpg && ' +
// Use gcsfuse-jammy for Ubuntu, gcsfuse-bookworm for Debian
'echo "deb [signed-by=/etc/apt/keyrings/gcsfuse.gpg] https://packages.cloud.google.com/apt gcsfuse-jammy main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list',
)
.runCommands('sudo apt-get update -qq && sudo apt-get install -y gcsfuse')
const daytona = new Daytona()
await daytona.snapshot.create(
{
name: 'cloud-fs-mounting',
image: template,
},
{ onLogs: console.log },
)
옵션 2: Dockerfile:사용Image.fromDockerfile()
FROM daytonaio/sandbox
RUN sudo apt-get update -qq
RUN sudo apt-get install -y s3fs
# Use gcsfuse-jammy for Ubuntu, gcsfuse-bookworm for Debian
RUN sudo mkdir -p /etc/apt/keyrings && curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg -o /tmp/gcsfuse-key.gpg && sudo gpg --batch --yes --dearmor -o /etc/apt/keyrings/gcsfuse.gpg /tmp/gcsfuse-key.gpg && echo "deb [signed-by=/etc/apt/keyrings/gcsfuse.gpg] https://packages.cloud.google.com/apt gcsfuse-jammy main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list
RUN sudo apt-get update -qq && sudo apt-get install -y gcsfuse
import { Daytona, Image } from '@daytonaio/sdk'
const daytona = new Daytona()
await daytona.snapshot.create(
{
name: 'cloud-fs-mounting',
image: Image.fromDockerfile('./Dockerfile'),
},
{ onLogs: console.log },
)
그런 다음 샌드박스 구성에서 스냅샷 이름을 사용합니다.
const workspace = new Workspace({
mounts: {
'/s3-data': new S3Filesystem({/* ... */}),
'/gcs-data': new GCSFilesystem({/* ... */}),
},
sandbox: new DaytonaSandbox({ snapshot: 'cloud-fs-mounting' }),
})
직접 SDK 액세스직접 SDK 액세스에 대한 직접 링크
파일 시스템, git 및 WorkspaceSandbox 인터페이스를 통해 노출되지 않는 기타 작업을 위해 기본 Daytona Sandbox 인스턴스에 액세스합니다:
const daytonaSandbox = sandbox.instance
// Upload a file
await daytonaSandbox.fs.uploadFile(Buffer.from('hello'), '/tmp/hello.txt')
// Run git operations
await daytonaSandbox.git.clone('https://github.com/org/repo', '/workspace/repo')
Sandbox가 아직 시작되지 않았으면 instance getter가 SandboxNotReadyError를 발생시킵니다.
샌드박스 생성 모드샌드박스 생성 모드에 대한 직접 링크
DaytonaSandbox제공된 옵션에 따라 생성 모드를 선택합니다.
| 옵션 | 생성 모드 |
|---|---|
snapshot 설정 | 스냅샷 기반(snapshot이 image보다 우선) |
image 설정(snapshot 없음) | 이미지 기반(선택적으로 resources와 함께 사용) |
| 둘 다 설정하지 않음 | 기본 스냅샷 기반 |
리소스는 image가 설정된 경우에만 적용됩니다. image 없이 resources를 전달하면 아무 효과가 없습니다. |