terraform { required_version = ">= 1.0" required_providers { coder = { source = "coder/coder" version = "~> 2.0" } docker = { source = "kreuzwerker/docker" version = "~> 2.25" } envbuilder = { source = "coder/envbuilder" version = "~> 1.0" } } } provider "coder" {} provider "docker" { host = var.docker_socket != "" ? var.docker_socket : null } provider "envbuilder" {} # Data Sources data "coder_provisioner" "me" {} data "coder_workspace" "me" {} data "coder_workspace_owner" "me" {} # Parameters data "coder_parameter" "repo" { name = "repo" display_name = "Repository" description = "Select a repository to clone" mutable = true order = 1 option { name = "Custom Development Environment" description = "Full-stack development with all services" value = "custom" } option { name = "vercel/next.js" description = "The React Framework" value = "https://github.com/vercel/next.js" } option { name = "Custom URL" description = "Specify a custom repo URL below" value = "custom-url" } } data "coder_parameter" "custom_repo_url" { name = "custom_repo_url" display_name = "Custom Repository URL" description = "Enter a custom repository URL" default = "" mutable = true order = 2 } data "coder_parameter" "enable_services" { name = "enable_services" display_name = "Enable Database Services" description = "Enable PostgreSQL, Redis, Qdrant, and Docker Registry" type = "bool" default = "true" mutable = true order = 3 } data "coder_parameter" "enable_ai_tools" { name = "enable_ai_tools" display_name = "Enable AI Assistant Tools" description = "Install Claude Code and AI development tools" type = "bool" default = "true" mutable = true order = 4 } # Local Variables locals { # Container and workspace naming container_name = "coder-${data.coder_workspace_owner.me.name}-${lower(data.coder_workspace.me.name)}" workspace_id = data.coder_workspace.me.id # Git configuration git_author_name = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name) git_author_email = data.coder_workspace_owner.me.email # Repository URL logic repo_url = ( data.coder_parameter.repo.value == "custom" ? "https://github.com/coder/envbuilder" : data.coder_parameter.repo.value == "custom-url" ? data.coder_parameter.custom_repo_url.value : data.coder_parameter.repo.value ) # Development container image with all required tools devcontainer_image = var.devcontainer_image # Environment variables for the development container dev_environment = { # Git configuration "GIT_AUTHOR_NAME" = local.git_author_name "GIT_AUTHOR_EMAIL" = local.git_author_email "GIT_COMMITTER_NAME" = local.git_author_name "GIT_COMMITTER_EMAIL" = local.git_author_email # Development tools "NODE_VERSION" = var.node_version "PYTHON_VERSION" = var.python_version "RUST_VERSION" = "stable" # Service URLs (when services are enabled) "POSTGRES_URL" = data.coder_parameter.enable_services.value ? "postgresql://postgres:${var.postgres_password}@postgres-${local.workspace_id}:5432/postgres" : "" "REDIS_URL" = data.coder_parameter.enable_services.value ? "redis://:${var.redis_password}@redis-${local.workspace_id}:6379" : "" "QDRANT_URL" = data.coder_parameter.enable_services.value ? "http://qdrant-${local.workspace_id}:6333" : "" # Development configuration "EDITOR" = "code" "PYTHONPATH" = "/workspaces" "CARGO_HOME" = "/home/coder/.cargo" "RUSTUP_HOME" = "/home/coder/.rustup" } # Legacy service URLs for backward compatibility postgres_url = "postgresql://postgres:${var.postgres_password}@postgres-${local.workspace_id}:5432/postgres" redis_url = "redis://:${var.redis_password}@redis-${local.workspace_id}:6379" qdrant_url = "http://qdrant-${local.workspace_id}:6333" } # Docker Network resource "docker_network" "workspace" { name = "coder-${local.workspace_id}" driver = "bridge" labels { label = "coder.workspace_id" value = local.workspace_id } labels { label = "coder.owner" value = data.coder_workspace_owner.me.name } labels { label = "coder.project" value = var.project_name } } # Workspace Volume resource "docker_volume" "workspaces" { name = "workspaces-${local.workspace_id}" labels { label = "coder.workspace_id" value = local.workspace_id } labels { label = "coder.owner" value = data.coder_workspace_owner.me.name } labels { label = "coder.type" value = "workspace-data" } } # Development Container Image resource "docker_image" "devcontainer" { name = local.devcontainer_image keep_locally = true }