# TerrariumDaytona
[](https://hex.pm/packages/terrarium_daytona)
[](https://hexdocs.pm/terrarium_daytona)
[](https://github.com/pepicrft/terrarium_daytona/actions/workflows/terrarium_daytona.yml)
A [Daytona](https://daytona.io) provider for [Terrarium](https://github.com/pepicrft/terrarium) sandbox environments.
## Installation
Add `terrarium_daytona` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:terrarium, "~> 0.1.0"},
{:terrarium_daytona, "~> 0.1.0"}
]
end
```
## Configuration
```elixir
# config/runtime.exs
config :terrarium,
default: :daytona,
providers: [
daytona: {Terrarium.Providers.Daytona,
api_key: System.fetch_env!("DAYTONA_API_KEY")
}
]
```
### Options
- `:api_key` - (required) Daytona API key
- `:api_url` - base URL for the Daytona API (default: `"https://app.daytona.io/api"`)
- `:toolbox_url` - base URL for the toolbox proxy (default: `"https://proxy.app.daytona.io/toolbox"`)
- `:organization_id` - Daytona organization ID (optional)
- `:target` - target region (optional)
- `:snapshot` - base image or snapshot (optional)
- `:class` - sandbox class (optional)
- `:cpu` - number of vCPUs (optional)
- `:memory` - memory in GB (optional)
- `:disk` - disk in GB (optional)
- `:user` - sandbox user (default: `"daytona"`)
- `:env` - environment variables map (optional)
- `:auto_stop_interval` - minutes before auto-stop (optional)
## Usage
```elixir
# Create a sandbox using the configured default
{:ok, sandbox} = Terrarium.create(image: "debian:12")
# Or specify the provider explicitly
{:ok, sandbox} = Terrarium.create(:daytona, snapshot: "ubuntu-4vcpu-8ram-100gb")
# Execute commands
{:ok, result} = Terrarium.exec(sandbox, "echo hello")
IO.puts(result.stdout)
# File operations
:ok = Terrarium.write_file(sandbox, "/home/daytona/hello.txt", "Hello from Terrarium!")
{:ok, content} = Terrarium.read_file(sandbox, "/home/daytona/hello.txt")
# Clean up
:ok = Terrarium.destroy(sandbox)
```
## Telemetry
This provider emits the following [`:telemetry`](https://hex.pm/packages/telemetry) events, in addition to the generic events from `Terrarium.Telemetry`:
| Event | Measurements | Metadata |
|---|---|---|
| `[:terrarium, :daytona, :api_request, :start]` | `%{system_time: integer}` | `%{method: atom, url: String.t()}` |
| `[:terrarium, :daytona, :api_request, :stop]` | `%{duration: integer}` | `%{method: atom, url: String.t(), status: integer}` (success) or `%{method: atom, url: String.t(), error: term()}` (failure) |
| `[:terrarium, :daytona, :api_request, :exception]` | `%{duration: integer}` | `%{method: atom, url: String.t()}` |
| `[:terrarium, :daytona, :poll]` | `%{remaining_timeout: integer}` | `%{sandbox_id: String.t(), poll_interval: integer}` |
### Example
```elixir
:telemetry.attach_many(
"daytona-logger",
[
[:terrarium, :daytona, :api_request, :stop],
[:terrarium, :daytona, :poll]
],
fn event, measurements, metadata, _config ->
Logger.info("#{inspect(event)}: #{inspect(measurements)} #{inspect(metadata)}")
end,
nil
)
```
## License
This project is licensed under the [MIT License](LICENSE).