TerrariumDaytona
A Daytona provider for Terrarium sandbox environments.
Installation
Add terrarium_daytona to your list of dependencies in mix.exs:
def deps do
[
{:terrarium, "~> 0.1.0"},
{:terrarium_daytona, "~> 0.1.0"}
]
endConfiguration
# 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
# 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 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
: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.