README
¶
Terraform Provider for Daytona
This repository contains a Terraform Plugin Framework provider for Daytona. It lets teams manage Daytona sandboxes and supporting Daytona infrastructure with the same Terraform workflows they use for AWS, Azure, GCP, and other enterprise platform dependencies.
Features
- Provider configuration through
DAYTONA_API_KEY,DAYTONA_ACCESS_TOKEN,DAYTONA_API_URL, andDAYTONA_ORGANIZATION_ID - Daytona managed-service default API URL:
https://app.daytona.io/api - Resources:
daytona_admin_runnerdaytona_admin_organization_region_quotadaytona_api_keydaytona_docker_registrydaytona_organizationdaytona_organization_invitationdaytona_organization_member_accessdaytona_organization_otel_configdaytona_organization_region_quotadaytona_organization_roledaytona_regiondaytona_runnerdaytona_sandboxdaytona_snapshotdaytona_volume
- Actions:
daytona_accept_organization_invitationdaytona_activate_snapshotdaytona_admin_create_userdaytona_admin_initialize_webhooksdaytona_admin_regenerate_user_key_pairdaytona_admin_recover_sandboxdaytona_admin_send_webhookdaytona_admin_set_default_docker_registrydaytona_admin_set_snapshot_general_statusdaytona_archive_sandboxdaytona_create_sandbox_backupdaytona_create_sandbox_snapshotdaytona_deactivate_snapshotdaytona_decline_organization_invitationdaytona_enroll_sms_mfadaytona_expire_sandbox_signed_port_preview_urldaytona_fork_sandboxdaytona_initialize_webhooksdaytona_leave_organizationdaytona_link_accountdaytona_recover_sandboxdaytona_refresh_webhook_endpointsdaytona_revoke_api_key_for_userdaytona_revoke_sandbox_ssh_accessdaytona_start_sandboxdaytona_stop_sandboxdaytona_suspend_organizationdaytona_unlink_accountdaytona_unsuspend_organizationdaytona_update_sandbox_last_activity
- Data sources:
daytona_account_providersdaytona_admin_audit_logsdaytona_admin_runnerdaytona_admin_runnersdaytona_admin_snapshot_image_cleanup_statusdaytona_admin_userdaytona_admin_usersdaytona_admin_webhook_message_attemptsdaytona_admin_webhook_statusdaytona_api_keydaytona_api_keysdaytona_authenticated_runner_sandboxesdaytona_configdaytona_current_api_keydaytona_current_userdaytona_current_user_organization_invitationsdaytona_docker_registriesdaytona_docker_registrydaytona_docker_registry_push_accessdaytona_healthdaytona_jobdaytona_jobsdaytona_object_storage_push_accessdaytona_organization_audit_logsdaytona_organization_invitationdaytona_organization_invitationsdaytona_organization_memberdaytona_organization_membersdaytona_organization_otel_configdaytona_organization_otel_config_by_sandbox_auth_tokendaytona_organization_roledaytona_organization_rolesdaytona_organization_usagedaytona_organizationdaytona_organizationsdaytona_regiondaytona_regionsdaytona_runnerdaytona_runner_for_sandboxdaytona_runner_fulldaytona_runnersdaytona_runners_by_snapshot_refdaytona_sandbox_accessdaytona_sandbox_ancestorsdaytona_sandbox_auth_token_validationdaytona_sandbox_build_logs_urldaytona_sandbox_forksdaytona_sandbox_id_from_signed_preview_tokendaytona_sandbox_logsdaytona_sandbox_metricsdaytona_sandbox_organizationdaytona_sandbox_parentdaytona_sandbox_port_preview_urldaytona_sandbox_public_statusdaytona_sandbox_querydaytona_sandbox_region_quotadaytona_sandbox_signed_port_preview_urldaytona_sandbox_ssh_accessdaytona_sandbox_ssh_access_validationdaytona_sandboxdaytona_sandboxesdaytona_sandbox_trace_spansdaytona_sandbox_tracesdaytona_sandbox_toolbox_proxy_urldaytona_shared_regionsdaytona_snapshot_build_logs_urldaytona_snapshotdaytona_snapshotsdaytona_volumedaytona_volume_by_namedaytona_volumesdaytona_webhook_app_portal_accessdaytona_webhook_initialization_status
The provider is backed by Daytona's generated Go OpenAPI client: github.com/daytonaio/daytona/libs/api-client-go.
See docs/api-coverage.md for the current Daytona API coverage matrix and intentionally excluded endpoints.
Example
terraform {
required_providers {
daytona = {
source = "jwmoss/daytona"
}
}
}
provider "daytona" {}
resource "daytona_volume" "workspace" {
name = "workspace-cache"
}
resource "daytona_sandbox" "agent" {
name = "agent-runtime"
snapshot = "daytonaio/sandbox:0.6.0"
desired_state = "started"
labels = {
managed-by = "terraform"
}
}
data "daytona_current_api_key" "current" {}
data "daytona_organizations" "available" {}
Set credentials with environment variables:
export DAYTONA_API_KEY="dtn_..."
export DAYTONA_ACCESS_TOKEN="eyJ..."
export DAYTONA_API_URL="https://app.daytona.io/api"
Daytona API keys work for API-key-enabled routes such as current API-key lookup and volume management. Daytona org/user provisioning and discovery routes are JWT-only in the current Daytona API; set DAYTONA_ACCESS_TOKEN and DAYTONA_ORGANIZATION_ID for those routes. When both token types are set, DAYTONA_ACCESS_TOKEN takes precedence.
Use From GitHub Source
Terraform provider installation uses provider addresses rather than module-style GitHub sources. Until this provider is published to Terraform Registry, install the provider binary from GitHub and point Terraform at the local build:
go install github.com/jwmoss/terraform-provider-daytona@v0.2.0
cat > ~/.terraformrc <<EOF
provider_installation {
dev_overrides {
"jwmoss/daytona" = "$HOME/go/bin"
}
direct {}
}
EOF
Terraform configurations and modules can then use the same provider address shown above:
terraform {
required_providers {
daytona = {
source = "jwmoss/daytona"
}
}
}
This repository also includes a reusable module example that can be consumed directly from GitHub:
module "daytona_sandbox" {
source = "github.com/jwmoss/terraform-provider-daytona//examples/modules/daytona-sandbox?ref=v0.2.0"
name = "agent-runtime"
snapshot = "daytonaio/sandbox:0.6.0"
desired_state = "started"
}
Development
Requirements:
- Go 1.25 or newer
- Terraform 1.0 or newer; provider-defined actions require Terraform 1.14 or newer
Run the local test suite:
go test ./...
Install and run local hooks:
prek install
prek run --all-files
Run API-key live acceptance tests:
TF_ACC=1 DAYTONA_API_KEY="dtn_..." \
go test ./internal/provider -run 'TestAcc(CurrentAPIKeyDataSource|VolumeResource)_basic' -v
Run JWT-only org/user acceptance tests:
TF_ACC=1 DAYTONA_ACCESS_TOKEN="eyJ..." DAYTONA_ORGANIZATION_ID="org-..." \
go test ./internal/provider -run 'TestAcc(CollectionDataSources|LookupDataSources|OperationalDataSources)_basic' -v
Run the Daytona readiness acceptance test with a health-check API key:
TF_ACC=1 DAYTONA_HEALTH_CHECK_API_KEY="dtn_..." \
go test ./internal/provider -run TestAccHealthDataSource_basic -v
Acceptance tests create real Daytona resources. Volume create/delete was verified live after adding lifecycle polling for Daytona's asynchronous volume states. The full org/user suite requires an OAuth access token because the current Daytona API rejects normal API keys on JWT-only routes; Daytona CLI API-key login has the same organization-command limitation and is not a substitute for browser/OAuth authentication.
Generate provider documentation:
make generate
Validate release packaging:
make release-check
make release-snapshot
Repository Status
This provider was scaffolded from hashicorp/terraform-provider-scaffolding-framework and then converted to a Daytona-specific provider module at github.com/jwmoss/terraform-provider-daytona.
Documentation
¶
There is no documentation for this package.