terraform { required_providers { coder = { source = "coder/coder" } docker = { source = "kreuzwerker/docker" } } } provider "docker" {} data "coder_workspace" "me" {} data "coder_workspace_owner" "me" {} locals { username = data.coder_workspace_owner.me.name } resource "coder_agent" "main" { arch = "amd64" os = "linux" startup_script = <<-EOT set -e mkdir -p ~/sandbox ~/plots echo "ready: $(python --version) | sci stack pre-baked" EOT metadata { display_name = "CPU" key = "cpu" script = "coder stat cpu" interval = 10 timeout = 1 } metadata { display_name = "RAM" key = "ram" script = "coder stat mem" interval = 10 timeout = 1 } } resource "docker_container" "workspace" { count = data.coder_workspace.me.start_count image = "coder-mcp-sandbox:latest" # built locally; do not pull name = "coder-${local.username}-${lower(data.coder_workspace.me.name)}-sbx" hostname = data.coder_workspace.me.name entrypoint = ["sh", "-c", coder_agent.main.init_script] env = [ "CODER_AGENT_TOKEN=${coder_agent.main.token}", "OPENAI_API_KEY=sk-tapirnase", "OPENAI_BASE_URL=http://192.168.1.40:14000/v1", "OPENAI_MODEL=qwen3-coder-30b-a3b-instruct", "AIDER_MODEL=qwen3-coder-30b-a3b-instruct", "AIDER_WEAK_MODEL=mistral-small-latest", "EMBEDDING_MODEL=text-embedding-3-large", "MPLBACKEND=Agg", ] # ephemeral home — fresh state every spin # (drop the `volumes` block entirely to keep tmpfs-like behavior) devices { host_path = "/dev/dri/renderD128" } memory = 4096 cpu_shares = 512 host { host = "host.docker.internal" ip = "host-gateway" } }