Files
code-tools/tf/terraform.tfstate
2025-09-06 01:43:47 +00:00

2322 lines
96 KiB
JSON

{
"version": 4,
"terraform_version": "1.10.1",
"serial": 98,
"lineage": "76e6bf9d-c37d-36d2-2618-078691776348",
"outputs": {
"container_name": {
"value": "coder-default-default",
"type": "string"
},
"development_tools": {
"value": {
"container_image": "mcr.microsoft.com/devcontainers/universal:2-linux",
"node_version": "20",
"python_version": "3.12"
},
"type": [
"object",
{
"container_image": "string",
"node_version": "string",
"python_version": "string"
}
]
},
"docker_network_name": {
"value": "coder-e7696a82-d8b2-42e6-920b-49e5aa5776c9",
"type": "string"
},
"external_ports": {
"value": {
"pgadmin": 5050
},
"type": [
"map",
"number"
]
},
"git_author_email": {
"value": "default@example.com",
"type": "string",
"sensitive": true
},
"git_author_name": {
"value": "default",
"type": "string"
},
"postgres_connection_url": {
"value": "postgresql://postgres:devpassword@postgres-e7696a82-d8b2-42e6-920b-49e5aa5776c9:5432/postgres",
"type": "string",
"sensitive": true
},
"qdrant_api_url": {
"value": "http://qdrant-e7696a82-d8b2-42e6-920b-49e5aa5776c9:6333",
"type": "string"
},
"redis_connection_url": {
"value": "redis://:devpassword@redis-e7696a82-d8b2-42e6-920b-49e5aa5776c9:6379",
"type": "string",
"sensitive": true
},
"repository_url": {
"value": "",
"type": "string"
},
"service_status": {
"value": {
"ai_tools_enabled": "true",
"jupyter_enabled": false,
"pgadmin_enabled": true,
"services_enabled": "true"
},
"type": [
"object",
{
"ai_tools_enabled": "string",
"jupyter_enabled": "bool",
"pgadmin_enabled": "bool",
"services_enabled": "string"
}
]
},
"workspace_id": {
"value": "e7696a82-d8b2-42e6-920b-49e5aa5776c9",
"type": "string"
},
"workspace_name": {
"value": "default",
"type": "string"
},
"workspace_owner": {
"value": "default",
"type": "string"
},
"workspace_volume_name": {
"value": "workspaces-e7696a82-d8b2-42e6-920b-49e5aa5776c9",
"type": "string"
}
},
"resources": [
{
"mode": "data",
"type": "coder_parameter",
"name": "custom_repo_url",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"default": null,
"description": "Enter a custom repository URL",
"display_name": "Custom Repository URL",
"ephemeral": false,
"form_type": "input",
"icon": null,
"id": "0c79aa03-120d-4859-a412-d87ccfbc6759",
"mutable": true,
"name": "custom_repo_url",
"option": null,
"optional": true,
"order": 2,
"styling": "{}",
"type": "string",
"validation": [],
"value": ""
},
"sensitive_attributes": []
}
]
},
{
"mode": "data",
"type": "coder_parameter",
"name": "enable_ai_tools",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"default": "true",
"description": "Install Claude Code and AI development tools",
"display_name": "Enable AI Assistant Tools",
"ephemeral": false,
"form_type": "checkbox",
"icon": null,
"id": "707ef28d-3fcd-439d-a5fc-d084c9f87efe",
"mutable": true,
"name": "enable_ai_tools",
"option": null,
"optional": true,
"order": 4,
"styling": "{}",
"type": "bool",
"validation": [],
"value": "true"
},
"sensitive_attributes": []
}
]
},
{
"mode": "data",
"type": "coder_parameter",
"name": "enable_services",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"default": "true",
"description": "Enable PostgreSQL, Redis, Qdrant, and Docker Registry",
"display_name": "Enable Database Services",
"ephemeral": false,
"form_type": "checkbox",
"icon": null,
"id": "a3a02995-d8c3-460c-a060-cc4c632f7d27",
"mutable": true,
"name": "enable_services",
"option": null,
"optional": true,
"order": 3,
"styling": "{}",
"type": "bool",
"validation": [],
"value": "true"
},
"sensitive_attributes": []
}
]
},
{
"mode": "data",
"type": "coder_parameter",
"name": "repo",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"default": null,
"description": "Select a repository to clone",
"display_name": "Repository",
"ephemeral": false,
"form_type": "radio",
"icon": null,
"id": "21a8c43f-634a-432b-821d-2e51b37520ff",
"mutable": true,
"name": "repo",
"option": [
{
"description": "Full-stack development with all services",
"icon": "",
"name": "Custom Development Environment",
"value": "custom"
},
{
"description": "The React Framework",
"icon": "",
"name": "vercel/next.js",
"value": "https://github.com/vercel/next.js"
},
{
"description": "Specify a custom repo URL below",
"icon": "",
"name": "Custom URL",
"value": "custom-url"
}
],
"optional": false,
"order": 1,
"styling": "{}",
"type": "string",
"validation": [],
"value": ""
},
"sensitive_attributes": []
}
]
},
{
"mode": "data",
"type": "coder_provisioner",
"name": "me",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"arch": "amd64",
"id": "13b80639-e3f8-485d-a4e7-fb15cd923ee4",
"os": "linux"
},
"sensitive_attributes": []
}
]
},
{
"mode": "data",
"type": "coder_workspace",
"name": "me",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"access_port": 443,
"access_url": "https://mydeployment.coder.com",
"id": "e7696a82-d8b2-42e6-920b-49e5aa5776c9",
"is_prebuild": false,
"is_prebuild_claim": false,
"name": "default",
"prebuild_count": 0,
"start_count": 1,
"template_id": "",
"template_name": "",
"template_version": "",
"transition": "start"
},
"sensitive_attributes": []
}
]
},
{
"mode": "data",
"type": "coder_workspace_owner",
"name": "me",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"email": "default@example.com",
"full_name": "default",
"groups": [],
"id": "f6fd72c5-b0c9-4444-b7d2-ec4e2e32c28c",
"login_type": null,
"name": "default",
"oidc_access_token": "",
"rbac_roles": [],
"session_token": "",
"ssh_private_key": "",
"ssh_public_key": ""
},
"sensitive_attributes": [
[
{
"type": "get_attr",
"value": "ssh_private_key"
}
],
[
{
"type": "get_attr",
"value": "session_token"
}
],
[
{
"type": "get_attr",
"value": "oidc_access_token"
}
]
]
}
]
},
{
"mode": "managed",
"type": "coder_agent",
"name": "main",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"api_key_scope": "all",
"arch": "amd64",
"auth": "token",
"connection_timeout": 120,
"dir": "/workspaces",
"display_apps": [
{
"port_forwarding_helper": true,
"ssh_helper": true,
"vscode": true,
"vscode_insiders": false,
"web_terminal": true
}
],
"env": {
"ENABLE_SERVICES": "true",
"GIT_AUTHOR_EMAIL": "default@example.com",
"GIT_AUTHOR_NAME": "default",
"GIT_COMMITTER_EMAIL": "default@example.com",
"GIT_COMMITTER_NAME": "default",
"HOME": "/home/coder",
"NODE_VERSION": "20",
"PATH": "$PATH:/home/coder/.cargo/bin:/home/coder/.local/bin:/usr/local/bin",
"POSTGRES_URL": "postgresql://postgres:devpassword@postgres-e7696a82-d8b2-42e6-920b-49e5aa5776c9:5432/postgres",
"PYTHON_VERSION": "3.12",
"QDRANT_URL": "http://qdrant-e7696a82-d8b2-42e6-920b-49e5aa5776c9:6333",
"REDIS_URL": "redis://:devpassword@redis-e7696a82-d8b2-42e6-920b-49e5aa5776c9:6379",
"USER": "coder"
},
"id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"init_script": "",
"metadata": [
{
"display_name": "CPU Usage",
"interval": 60,
"key": "cpu_usage",
"order": 0,
"script": "coder stat cpu",
"timeout": 10
},
{
"display_name": "RAM Usage",
"interval": 60,
"key": "ram_usage",
"order": 0,
"script": "coder stat mem",
"timeout": 10
},
{
"display_name": "Disk Usage",
"interval": 300,
"key": "disk_usage",
"order": 0,
"script": "coder stat disk --path /workspaces",
"timeout": 10
},
{
"display_name": "Git Branch",
"interval": 300,
"key": "git_branch",
"order": 0,
"script": "cd /workspaces \u0026\u0026 git branch --show-current 2\u003e/dev/null || echo 'no-repo'",
"timeout": 5
}
],
"motd_file": null,
"order": null,
"os": "linux",
"resources_monitoring": [],
"shutdown_script": null,
"startup_script": "#!/bin/bash\nset -e\necho \"🚀 Initializing development environment as user: $(whoami)\"\n\n# =============================================================================\n# Create coder user if it doesn't exist\n# =============================================================================\nif ! id -u coder \u003e/dev/null 2\u003e\u00261; then\n echo \"👤 Creating coder user...\"\n useradd -m -s /bin/bash -u 1000 coder\n usermod -aG sudo coder\n echo \"coder ALL=(ALL) NOPASSWD:ALL\" \u003e\u003e /etc/sudoers\nfi\n\n# =============================================================================\n# Create necessary directories\n# =============================================================================\necho \"📁 Creating user directories...\"\nmkdir -p /home/coder/bin\nmkdir -p /home/coder/.local/bin\nmkdir -p /home/coder/.config\nmkdir -p /tmp/git-metadata\nmkdir -p /workspaces\n\n# Ensure proper ownership\nchown -R coder:coder /home/coder /workspaces\n\n# =============================================================================\n# Switch to coder user for remaining operations\n# =============================================================================\necho \"🔄 Switching to coder user context...\"\nexport HOME=/home/coder\nexport USER=coder\n\n# =============================================================================\n# Git Configuration\n# =============================================================================\necho \"⚙️ Configuring Git...\"\ngit config --global user.name \"${GIT_AUTHOR_NAME}\"\ngit config --global user.email \"${GIT_AUTHOR_EMAIL}\"\ngit config --global commit.gpgsign false\ngit config --global tag.gpgsign false\ngit config --global init.defaultBranch main\ngit config --global pull.rebase false\n\n# Capture and log git information\necho \"📝 Capturing Git metadata...\"\ncd /workspaces\nif [ -d \".git\" ]; then\n git branch --show-current \u003e /tmp/git-metadata/current-branch 2\u003e/dev/null || echo \"main\" \u003e /tmp/git-metadata/current-branch\n git rev-parse HEAD \u003e /tmp/git-metadata/commit-hash 2\u003e/dev/null || echo \"no-commits\" \u003e /tmp/git-metadata/commit-hash\n git remote get-url origin \u003e /tmp/git-metadata/remote-url 2\u003e/dev/null || echo \"no-remote\" \u003e /tmp/git-metadata/remote-url\nelse\n echo \"no-repo\" \u003e /tmp/git-metadata/current-branch\n echo \"no-repo\" \u003e /tmp/git-metadata/commit-hash\n echo \"no-repo\" \u003e /tmp/git-metadata/remote-url\nfi\n\n# =============================================================================\n# System Package Updates and Installation\n# =============================================================================\necho \"📦 Installing system packages...\"\nexport DEBIAN_FRONTEND=noninteractive\napt-get update -qq\napt-get install -y make tree jq curl wget unzip build-essential postgresql-client redis-tools\n\n# =============================================================================\n# Node.js and npm Setup (as coder user)\n# =============================================================================\necho \"🟢 Setting up Node.js and npm...\"\n\n# Create Node.js setup script\ncat \u003e /tmp/node_setup.sh \u003c\u003c 'NODE_SCRIPT_END'\n#!/bin/bash\nif ! command -v nvm \u0026\u003e /dev/null; then\n curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash\n export NVM_DIR=\"/home/coder/.nvm\"\n [ -s \"$NVM_DIR/nvm.sh\" ] \u0026\u0026 . \"$NVM_DIR/nvm.sh\"\nfi\n\nexport NVM_DIR=\"/home/coder/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\" ] \u0026\u0026 . \"$NVM_DIR/nvm.sh\"\nnvm install ${NODE_VERSION}\nnvm use ${NODE_VERSION}\nnvm alias default ${NODE_VERSION}\n\necho \"📦 Installing npm packages...\"\nnpm install -g repomix create-next-app nodemon concurrently @types/node typescript eslint prettier\nnpm install -g create-next-app@latest\nNODE_SCRIPT_END\n\nchmod +x /tmp/node_setup.sh\nsu - coder -c \"/tmp/node_setup.sh\"\nrm /tmp/node_setup.sh\n\n# =============================================================================\n# Python Setup with uv (as coder user)\n# =============================================================================\necho \"🐍 Setting up Python and uv...\"\n\n# Install Python version\napt-get install -y python${PYTHON_VERSION} python${PYTHON_VERSION}-dev python${PYTHON_VERSION}-venv\n\n# Create Python setup script\ncat \u003e /tmp/python_setup.sh \u003c\u003c 'PYTHON_SCRIPT_END'\n#!/bin/bash\ncurl -LsSf https://astral.sh/uv/install.sh | sh\nexport PATH=\"/home/coder/.cargo/bin:$PATH\"\n\necho \"📦 Installing Python packages with uv...\"\nfor package in fastapi uvicorn requests pandas numpy psycopg2-binary redis qdrant-client python-dotenv; do\n uv tool install $package || echo \"Failed to install $package\"\ndone\n\nuv venv /home/coder/.venv --python=${PYTHON_VERSION}\necho 'source /home/coder/.venv/bin/activate' \u003e\u003e /home/coder/.bashrc\nPYTHON_SCRIPT_END\n\nchmod +x /tmp/python_setup.sh\nsu - coder -c \"/tmp/python_setup.sh\"\nrm /tmp/python_setup.sh\n\n# =============================================================================\n# Rust and Cargo Setup (as coder user)\n# =============================================================================\necho \"🦀 Installing Rust and Cargo...\"\n\n# Create Rust setup script\ncat \u003e /tmp/rust_setup.sh \u003c\u003c 'RUST_SCRIPT_END'\n#!/bin/bash\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable\nsource \"/home/coder/.cargo/env\"\necho 'export PATH=\"/home/coder/.cargo/bin:$PATH\"' \u003e\u003e /home/coder/.bashrc\ncargo install cargo-watch cargo-edit cargo-audit\nRUST_SCRIPT_END\n\nchmod +x /tmp/rust_setup.sh\nsu - coder -c \"/tmp/rust_setup.sh\"\nrm /tmp/rust_setup.sh\n\n# =============================================================================\n# repomix Installation (as coder user)\n# =============================================================================\necho \"📁 Installing repomix...\"\nsu - coder -c \"npm install -g repomix\"\n\n# =============================================================================\n# Shell Configuration (as coder user)\n# =============================================================================\necho \"🐚 Setting up shell environment...\"\n\n# Create devinfo script\ncat \u003e /tmp/devinfo_script.sh \u003c\u003c 'DEVINFO_SCRIPT_END'\n#!/bin/bash\nmkdir -p /home/coder/bin\ncat \u003e /home/coder/bin/devinfo \u003c\u003c 'DEVINFO_END'\n#!/bin/bash\necho '🚀 Development Environment Info'\necho '==============================='\necho ''\necho '🔧 Installed Tools:'\necho ' Node.js: '$(node --version 2\u003e/dev/null || echo 'Not found')\necho ' npm: '$(npm --version 2\u003e/dev/null || echo 'Not found')\necho ' Python: '$(python${PYTHON_VERSION} --version 2\u003e/dev/null || echo 'Not found')\necho ' uv: '$(uv --version 2\u003e/dev/null || echo 'Not found')\necho ' Rust: '$(rustc --version 2\u003e/dev/null || echo 'Not found')\necho ' Cargo: '$(cargo --version 2\u003e/dev/null || echo 'Not found')\necho ' repomix: '$(repomix --version 2\u003e/dev/null || echo 'Not found')\necho ''\necho '🗄️ Database Services:'\nif [ \"${ENABLE_SERVICES}\" = \"true\" ]; then\n echo ' PostgreSQL: '${POSTGRES_URL}\n echo ' Redis: '${REDIS_URL}\n echo ' Qdrant: '${QDRANT_URL}\nelse\n echo ' Services disabled'\nfi\necho ''\necho '📝 Git Metadata:'\nif [ -f /tmp/git-metadata/current-branch ]; then\n echo ' Branch: '$(cat /tmp/git-metadata/current-branch)\n echo ' Commit: '$(cat /tmp/git-metadata/commit-hash)\n echo ' Remote: '$(cat /tmp/git-metadata/remote-url)\nfi\nDEVINFO_END\nchmod +x /home/coder/bin/devinfo\nDEVINFO_SCRIPT_END\n\nchmod +x /tmp/devinfo_script.sh\nsu - coder -c \"/tmp/devinfo_script.sh\"\nrm /tmp/devinfo_script.sh\n\n# Create bashrc aliases script\ncat \u003e /tmp/bashrc_setup.sh \u003c\u003c 'BASHRC_SCRIPT_END'\n#!/bin/bash\ncat \u003e\u003e /home/coder/.bashrc \u003c\u003c 'BASHRC_END'\n\n# Development Environment Aliases\nalias ll='ls -alF'\nalias la='ls -A'\nalias l='ls -CF'\nalias gs='git status'\nalias gp='git push'\nalias gc='git commit'\nalias gco='git checkout'\nalias gb='git branch'\n\n# Development workflow shortcuts\nalias devinfo='/home/coder/bin/devinfo'\n\n# Package managers\nalias pip='uv pip'\nalias python='python${PYTHON_VERSION}'\n\n# Docker shortcuts\nalias dps='docker ps'\nalias dimg='docker images'\nalias dlog='docker logs'\n\nBASHRC_END\nBASHRC_SCRIPT_END\n\nchmod +x /tmp/bashrc_setup.sh\nsu - coder -c \"/tmp/bashrc_setup.sh\"\nrm /tmp/bashrc_setup.sh\n\n# =============================================================================\n# Final Environment Setup\n# =============================================================================\necho \"✅ Development environment initialization complete!\"\necho \"\"\necho \"🎉 Available tools:\"\necho \" - Node.js ${NODE_VERSION} with npm packages\"\necho \" - Python ${PYTHON_VERSION} with uv package manager\"\necho \" - Rust with Cargo\"\necho \" - repomix for repository packaging\"\necho \" - make, tree, and other build tools\"\nif [ \"${ENABLE_SERVICES}\" = \"true\" ]; then\n echo \" - PostgreSQL, Redis, Qdrant databases\"\nfi\necho \"\"\necho \"🔧 Run 'devinfo' for detailed environment information\"\necho \"🚀 Ready for development!\"",
"startup_script_behavior": "non-blocking",
"token": "199aafd2-55c5-43bd-8104-d1d469a14082",
"troubleshooting_url": null
},
"sensitive_attributes": [
[
{
"type": "get_attr",
"value": "env"
},
{
"type": "index",
"value": {
"value": "POSTGRES_URL",
"type": "string"
}
}
],
[
{
"type": "get_attr",
"value": "env"
},
{
"type": "index",
"value": {
"value": "REDIS_URL",
"type": "string"
}
}
],
[
{
"type": "get_attr",
"value": "token"
}
]
],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_app",
"name": "api_server_8000",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"command": null,
"display_name": "API Server (8000)",
"external": false,
"group": null,
"healthcheck": [
{
"interval": 10,
"threshold": 10,
"url": "http://localhost:8000/health"
}
],
"hidden": false,
"icon": "/icon/api.svg",
"id": "c20e77ec-2285-483c-ac43-464f383e581e",
"open_in": "slim-window",
"order": null,
"share": "owner",
"slug": "api-8000",
"subdomain": true,
"url": "http://localhost:8000"
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_app",
"name": "claude_code",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"index_key": 0,
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"command": "claude",
"display_name": "Claude Code",
"external": false,
"group": null,
"healthcheck": [],
"hidden": false,
"icon": "/icon/claude.svg",
"id": "42a33ff9-4fe4-45df-86ca-2d3e0303145e",
"open_in": "slim-window",
"order": null,
"share": "owner",
"slug": "claude-code",
"subdomain": null,
"url": null
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_ai_tools",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_app",
"name": "code_server",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"command": null,
"display_name": "VS Code",
"external": false,
"group": null,
"healthcheck": [
{
"interval": 10,
"threshold": 5,
"url": "http://localhost:8080/healthz"
}
],
"hidden": false,
"icon": "/icon/code.svg",
"id": "31faf6de-0434-4646-b552-041de627d8d4",
"open_in": "slim-window",
"order": null,
"share": "owner",
"slug": "code-server",
"subdomain": true,
"url": "http://localhost:8080"
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_app",
"name": "db_tester",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"index_key": 0,
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"command": "bash",
"display_name": "Database Tester",
"external": false,
"group": null,
"healthcheck": [],
"hidden": false,
"icon": "/icon/terminal.svg",
"id": "b9dfd90c-034d-4d31-87b3-230b08133a8b",
"open_in": "slim-window",
"order": null,
"share": "owner",
"slug": "db-tester",
"subdomain": null,
"url": null
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_app",
"name": "dev_logs",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"command": "bash",
"display_name": "Development Logs",
"external": false,
"group": null,
"healthcheck": [],
"hidden": false,
"icon": "/icon/terminal.svg",
"id": "86f339e3-674b-4aa3-980c-3037ad171eca",
"open_in": "slim-window",
"order": null,
"share": "owner",
"slug": "dev-logs",
"subdomain": null,
"url": null
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_app",
"name": "dev_server_3000",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"command": null,
"display_name": "Dev Server (3000)",
"external": false,
"group": null,
"healthcheck": [
{
"interval": 10,
"threshold": 10,
"url": "http://localhost:3000"
}
],
"hidden": false,
"icon": "/icon/web.svg",
"id": "efd5e551-697f-4b00-a9d3-2e0e995163bf",
"open_in": "slim-window",
"order": null,
"share": "owner",
"slug": "dev-3000",
"subdomain": true,
"url": "http://localhost:3000"
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_app",
"name": "env_info",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"command": "devinfo",
"display_name": "Environment Info",
"external": false,
"group": null,
"healthcheck": [],
"hidden": false,
"icon": "/icon/info.svg",
"id": "65bccb26-1c9d-4567-961d-e7f391b9d268",
"open_in": "slim-window",
"order": null,
"share": "owner",
"slug": "env-info",
"subdomain": null,
"url": null
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_app",
"name": "file_manager",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"command": "bash",
"display_name": "File Manager",
"external": false,
"group": null,
"healthcheck": [],
"hidden": false,
"icon": "/icon/folder.svg",
"id": "efcc7719-3bf7-4e26-b969-93a74dd142d6",
"open_in": "slim-window",
"order": null,
"share": "owner",
"slug": "files",
"subdomain": null,
"url": null
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_app",
"name": "git_manager",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"command": "bash",
"display_name": "Git Repository",
"external": false,
"group": null,
"healthcheck": [],
"hidden": false,
"icon": "/icon/git.svg",
"id": "4a384ae8-950a-4e96-b46a-641addbcb104",
"open_in": "slim-window",
"order": null,
"share": "owner",
"slug": "git",
"subdomain": null,
"url": null
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_app",
"name": "jupyter",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": []
},
{
"mode": "managed",
"type": "coder_app",
"name": "nextjs_dev",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"command": null,
"display_name": "Next.js Dev Server",
"external": false,
"group": null,
"healthcheck": [
{
"interval": 10,
"threshold": 10,
"url": "http://localhost:3000"
}
],
"hidden": false,
"icon": "/icon/nextjs.svg",
"id": "62e16780-522e-49a9-91c0-ba5a9d4ee4cc",
"open_in": "slim-window",
"order": null,
"share": "owner",
"slug": "nextjs-3000",
"subdomain": true,
"url": "http://localhost:3000"
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_app",
"name": "pgadmin",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"index_key": 0,
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"command": null,
"display_name": "pgAdmin",
"external": false,
"group": null,
"healthcheck": [
{
"interval": 15,
"threshold": 5,
"url": "http://localhost:5050/misc/ping"
}
],
"hidden": false,
"icon": "/icon/postgresql.svg",
"id": "33ce817d-125b-4785-be9c-2df143bad4fd",
"open_in": "slim-window",
"order": null,
"share": "owner",
"slug": "pgadmin",
"subdomain": true,
"url": "http://localhost:5050"
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_app",
"name": "qdrant",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"index_key": 0,
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"command": null,
"display_name": "Qdrant Dashboard",
"external": false,
"group": null,
"healthcheck": [
{
"interval": 20,
"threshold": 5,
"url": "http://localhost:6333/health"
}
],
"hidden": false,
"icon": "/icon/database.svg",
"id": "1059be9f-6e2c-4c18-b2b2-f52473921d94",
"open_in": "slim-window",
"order": null,
"share": "owner",
"slug": "qdrant-dashboard",
"subdomain": true,
"url": "http://localhost:6333/dashboard"
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_app",
"name": "rust_server",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"command": null,
"display_name": "Rust Server (8080)",
"external": false,
"group": null,
"healthcheck": [
{
"interval": 10,
"threshold": 10,
"url": "http://localhost:8080/health"
}
],
"hidden": false,
"icon": "/icon/rust.svg",
"id": "433b05db-da96-4724-967b-b1c8f8e7eb30",
"open_in": "slim-window",
"order": null,
"share": "owner",
"slug": "rust-8080",
"subdomain": true,
"url": "http://localhost:8080"
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_app",
"name": "terminal",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"command": "bash",
"display_name": "Terminal",
"external": false,
"group": null,
"healthcheck": [],
"hidden": false,
"icon": "/icon/terminal.svg",
"id": "d223ef33-2aa5-48a0-887f-496a1ff65b45",
"open_in": "slim-window",
"order": null,
"share": "owner",
"slug": "terminal",
"subdomain": null,
"url": null
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_app",
"name": "vite_dev",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"command": null,
"display_name": "Vite Dev Server",
"external": false,
"group": null,
"healthcheck": [
{
"interval": 10,
"threshold": 10,
"url": "http://localhost:5173"
}
],
"hidden": false,
"icon": "/icon/web.svg",
"id": "60b697a9-f61e-4d97-87c2-3db1b4922586",
"open_in": "slim-window",
"order": null,
"share": "owner",
"slug": "vite-5173",
"subdomain": true,
"url": "http://localhost:5173"
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_script",
"name": "claude_code_setup",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"index_key": 0,
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"cron": null,
"display_name": "Install Claude Code CLI",
"icon": "/icon/claude.svg",
"id": "4c2df8bb-ac8f-49b6-911f-e83b4e846947",
"log_path": null,
"run_on_start": true,
"run_on_stop": false,
"script": "#!/bin/bash\nset -e\necho \"🤖 Installing Claude Code CLI...\"\n\n# Check if already installed\nif command -v claude \u003e/dev/null 2\u003e\u00261; then\n echo \"✅ Claude Code already installed\"\n claude --version || echo \"Claude Code version check failed\"\n exit 0\nfi\n\n# Ensure npm is available\nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\" ] \u0026\u0026 . \"$NVM_DIR/nvm.sh\"\n\nif ! command -v npm \u003e/dev/null 2\u003e\u00261; then\n echo \"❌ npm not found - Node.js installation required\"\n exit 1\nfi\n\necho \"📥 Installing Claude Code globally via npm...\"\nnpm install -g @anthropic-ai/claude\n\n# Verify installation\nif command -v claude \u003e/dev/null 2\u003e\u00261; then\n echo \"✅ Claude Code installed successfully!\"\n echo \"🔧 Run 'claude auth login' to authenticate\"\n echo \"💡 Use 'claude chat' for interactive assistance\"\n echo \"💡 Use 'claude edit \u003cfile\u003e' to edit files with AI\"\n \n # Create helper script\n mkdir -p /home/coder/bin\n cat \u003e /home/coder/bin/claude-help \u003c\u003c 'CLAUDE_HELP_END'\n#!/bin/bash\necho \"🤖 Claude Code AI Assistant\"\necho \"==========================\"\necho \"\"\necho \"Authentication:\"\necho \" claude auth login # Authenticate with Anthropic\"\necho \" claude auth logout # Sign out\"\necho \" claude auth whoami # Check current user\"\necho \"\"\necho \"Interactive Chat:\"\necho \" claude chat # Start interactive session\"\necho \" claude chat 'question' # Single question\"\necho \"\"\necho \"File Editing:\"\necho \" claude edit file.py # AI-powered file editing\"\necho \" claude edit --help # Edit command options\"\necho \"\"\necho \"Code Analysis:\"\necho \" claude analyze . # Analyze current directory\"\necho \" claude review file.py # Code review\"\necho \"\"\necho \"Project Operations:\"\necho \" claude init # Initialize Claude in project\"\necho \" claude status # Show project status\"\necho \"\"\necho \"💡 For full documentation: https://docs.anthropic.com/claude/docs\"\nCLAUDE_HELP_END\n chmod +x /home/coder/bin/claude-help\n \n echo \"💡 Run 'claude-help' for quick reference\"\nelse\n echo \"❌ Claude Code installation failed\"\n exit 1\nfi",
"start_blocks_login": false,
"timeout": 0
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_ai_tools",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_script",
"name": "cursor_setup",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"index_key": 0,
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"cron": null,
"display_name": "Configure Cursor IDE Support",
"icon": "/icon/cursor.svg",
"id": "62324125-e780-4a10-a79f-e369af07b1ec",
"log_path": null,
"run_on_start": true,
"run_on_stop": false,
"script": "#!/bin/bash\nset -e\necho \"🎯 Setting up Cursor IDE support...\"\n\n# Create Cursor configuration directories\nmkdir -p /home/coder/.cursor-server/data/User\nmkdir -p /home/coder/.cursor-server/extensions\n\n# Create optimized Cursor settings\ncat \u003e /home/coder/.cursor-server/data/User/settings.json \u003c\u003c 'CURSOR_SETTINGS_END'\n{\n \"workbench.colorTheme\": \"Dark+ (default dark)\",\n \"editor.fontSize\": 14,\n \"editor.tabSize\": 2,\n \"editor.insertSpaces\": true,\n \"editor.formatOnSave\": true,\n \"editor.codeActionsOnSave\": {\n \"source.fixAll\": true,\n \"source.organizeImports\": true\n },\n \"files.autoSave\": \"afterDelay\",\n \"files.autoSaveDelay\": 1000,\n \"terminal.integrated.fontSize\": 13,\n \"git.enableSmartCommit\": true,\n \"git.confirmSync\": false,\n \"python.defaultInterpreterPath\": \"/home/coder/.venv/bin/python\",\n \"python.linting.enabled\": true,\n \"python.linting.pylintEnabled\": false,\n \"python.linting.flake8Enabled\": true,\n \"typescript.preferences.includePackageJsonAutoImports\": \"auto\",\n \"javascript.preferences.includePackageJsonAutoImports\": \"auto\",\n \"cursor.chat.showInEditorContextMenu\": true,\n \"cursor.chat.alwaysShowInEditorContextMenu\": true,\n \"cursor.general.enableWindowAIFeatures\": true\n}\nCURSOR_SETTINGS_END\n\n# Create development tasks configuration\nmkdir -p /home/coder/.cursor-server/data/User\ncat \u003e /home/coder/.cursor-server/data/User/tasks.json \u003c\u003c 'CURSOR_TASKS_END'\n{\n \"version\": \"2.0.0\",\n \"tasks\": [\n {\n \"label\": \"Dev Server\",\n \"type\": \"shell\",\n \"command\": \"npm run dev\",\n \"group\": \"build\",\n \"presentation\": {\n \"echo\": true,\n \"reveal\": \"always\",\n \"focus\": false,\n \"panel\": \"new\"\n },\n \"problemMatcher\": []\n },\n {\n \"label\": \"Python Dev Server\",\n \"type\": \"shell\",\n \"command\": \"uvicorn main:app --reload --host 0.0.0.0 --port 8000\",\n \"group\": \"build\",\n \"presentation\": {\n \"echo\": true,\n \"reveal\": \"always\",\n \"focus\": false,\n \"panel\": \"new\"\n },\n \"problemMatcher\": []\n },\n {\n \"label\": \"Install Dependencies\",\n \"type\": \"shell\",\n \"command\": \"npm install\",\n \"group\": \"build\",\n \"presentation\": {\n \"echo\": true,\n \"reveal\": \"always\",\n \"focus\": false,\n \"panel\": \"new\"\n }\n },\n {\n \"label\": \"Python Install\",\n \"type\": \"shell\",\n \"command\": \"uv pip install -r requirements.txt\",\n \"group\": \"build\",\n \"presentation\": {\n \"echo\": true,\n \"reveal\": \"always\",\n \"focus\": false,\n \"panel\": \"new\"\n }\n }\n ]\n}\nCURSOR_TASKS_END\n\n# Create useful code snippets\nmkdir -p /home/coder/.cursor-server/data/User/snippets\ncat \u003e /home/coder/.cursor-server/data/User/snippets/global.code-snippets \u003c\u003c 'CURSOR_SNIPPETS_END'\n{\n \"FastAPI Basic App\": {\n \"prefix\": \"fastapi-app\",\n \"body\": [\n \"from fastapi import FastAPI\",\n \"from fastapi.middleware.cors import CORSMiddleware\",\n \"\",\n \"app = FastAPI(title=\\\"${1:My API}\\\", version=\\\"0.1.0\\\")\",\n \"\",\n \"app.add_middleware(\",\n \" CORSMiddleware,\",\n \" allow_origins=[\\\"*\\\"],\",\n \" allow_credentials=True,\",\n \" allow_methods=[\\\"*\\\"],\",\n \" allow_headers=[\\\"*\\\"],\",\n \")\",\n \"\",\n \"@app.get(\\\"/\\\")\",\n \"async def root():\",\n \" return {\\\"message\\\": \\\"${2:Hello World}\\\"}\",\n \"\",\n \"@app.get(\\\"/health\\\")\",\n \"async def health():\",\n \" return {\\\"status\\\": \\\"healthy\\\"}\",\n \"\",\n \"if __name__ == \\\"__main__\\\":\",\n \" import uvicorn\",\n \" uvicorn.run(app, host=\\\"0.0.0.0\\\", port=8000)\"\n ],\n \"description\": \"FastAPI basic application template\"\n },\n \"Next.js API Route\": {\n \"prefix\": \"nextapi\",\n \"body\": [\n \"import { NextRequest, NextResponse } from 'next/server';\",\n \"\",\n \"export async function ${1:GET}(request: NextRequest) {\",\n \" try {\",\n \" // Your API logic here\",\n \" return NextResponse.json({ message: '${2:Success}' });\",\n \" } catch (error) {\",\n \" return NextResponse.json(\",\n \" { error: 'Internal Server Error' },\",\n \" { status: 500 }\",\n \" );\",\n \" }\",\n \"}\"\n ],\n \"description\": \"Next.js API route template\"\n },\n \"Database Connection\": {\n \"prefix\": \"db-connect\",\n \"body\": [\n \"import os\",\n \"from sqlalchemy import create_engine\",\n \"from sqlalchemy.orm import sessionmaker\",\n \"\",\n \"DATABASE_URL = os.getenv(\",\n \" \\\"POSTGRES_URL\\\",\",\n \" \\\"postgresql://postgres:password@localhost:5432/postgres\\\"\",\n \")\",\n \"\",\n \"engine = create_engine(DATABASE_URL)\",\n \"SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)\",\n \"\",\n \"def get_db():\",\n \" db = SessionLocal()\",\n \" try:\",\n \" yield db\",\n \" finally:\",\n \" db.close()\"\n ],\n \"description\": \"Database connection setup\"\n }\n}\nCURSOR_SNIPPETS_END\n\n# Set proper ownership\nchown -R coder:coder /home/coder/.cursor-server\n\necho \"✅ Cursor IDE support configured\"\necho \"🎯 Cursor will use optimized settings for this development environment\"",
"start_blocks_login": false,
"timeout": 0
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_ai_tools",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_script",
"name": "dev_extensions",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"cron": null,
"display_name": "Install Development Tools",
"icon": "/icon/tools.svg",
"id": "70c9cde3-4e54-4387-ac27-1659f680ae9c",
"log_path": null,
"run_on_start": true,
"run_on_stop": false,
"script": "#!/bin/bash\nset -e\necho \"🔧 Installing development extensions and tools...\"\n\n# Ensure we're running as root for system packages\nif [ \"$EUID\" -ne 0 ]; then\n echo \"This script needs to run as root for system package installation\"\n exit 1\nfi\n\necho \"📦 Installing additional CLI tools...\"\n\n# Ensure curl is available first\ntype -p curl \u003e/dev/null || (apt-get update \u0026\u0026 apt-get install curl -y)\n\n# Function to install various development tools\ninstall_development_tools() {\n echo \"🛠️ Installing development utilities...\"\n \n # GitHub CLI\n if ! command -v gh \u0026\u003e /dev/null; then\n echo \"📥 Installing GitHub CLI...\"\n curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg\n chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg\n echo \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main\" | tee /etc/apt/sources.list.d/github-cli.list \u003e /dev/null\n apt-get update\n apt-get install gh -y\n fi\n \n # Docker Compose (if not already installed)\n if ! command -v docker-compose \u0026\u003e /dev/null; then\n echo \"🐳 Installing Docker Compose...\"\n curl -L \"https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose\n chmod +x /usr/local/bin/docker-compose\n fi\n \n # Lazygit for better git UI\n if ! command -v lazygit \u0026\u003e /dev/null; then\n echo \"🌿 Installing lazygit...\"\n LAZYGIT_VERSION=$(curl -s \"https://api.github.com/repos/jesseduffield/lazygit/releases/latest\" | grep '\"tag_name\":' | sed -E 's/.*\"v*([^\"]+)\".*/\\1/')\n curl -Lo lazygit.tar.gz \"https://github.com/jesseduffield/lazygit/releases/latest/download/lazygit_${LAZYGIT_VERSION}_Linux_x86_64.tar.gz\"\n tar xf lazygit.tar.gz lazygit\n install lazygit /usr/local/bin\n rm lazygit.tar.gz lazygit\n fi\n \n # btop for system monitoring\n if ! command -v btop \u0026\u003e /dev/null; then\n echo \"📊 Installing btop...\"\n apt-get install btop -y\n fi\n \n # fd-find for better file searching\n if ! command -v fd \u0026\u003e /dev/null; then\n echo \"🔍 Installing fd-find...\"\n apt-get install fd-find -y\n # Create symlink for easier usage\n ln -sf /usr/bin/fdfind /usr/local/bin/fd\n fi\n \n # ripgrep for better text searching\n if ! command -v rg \u0026\u003e /dev/null; then\n echo \"🔎 Installing ripgrep...\"\n apt-get install ripgrep -y\n fi\n \n # bat for better cat with syntax highlighting\n if ! command -v bat \u0026\u003e /dev/null; then\n echo \"🦇 Installing bat...\"\n apt-get install bat -y\n # Create symlink for easier usage\n ln -sf /usr/bin/batcat /usr/local/bin/bat\n fi\n \n # eza for better ls (modern replacement for exa)\n if ! command -v eza \u0026\u003e /dev/null; then\n echo \"📁 Installing eza...\"\n curl -L \"https://github.com/eza-community/eza/releases/latest/download/eza_x86_64-unknown-linux-gnu.tar.gz\" | tar xz -C /usr/local/bin\n fi\n}\n\n# Install all development tools\ninstall_development_tools\n\n# Switch to coder user for user-specific installations\necho \"👤 Setting up user-specific tools...\"\nsu - coder \u003c\u003c 'USER_SETUP_END'\n# Add useful aliases to .bashrc if not already present\nif ! grep -q \"# Development tools aliases\" ~/.bashrc; then\n cat \u003e\u003e ~/.bashrc \u003c\u003c 'ALIASES_END'\n\n# Development tools aliases\nalias cat='bat'\nalias ls='eza'\nalias ll='eza -la'\nalias la='eza -la'\nalias find='fd'\nalias grep='rg'\nalias git-ui='lazygit'\nalias top='btop'\n\nALIASES_END\nfi\n\n# Install tldr for better man pages\nif ! command -v tldr \u0026\u003e /dev/null; then\n npm install -g tldr\nfi\n\n# Install fkill for better process management\nif ! command -v fkill \u0026\u003e /dev/null; then\n npm install -g fkill-cli\nfi\n\necho \"✅ Development tools installed and configured!\"\nUSER_SETUP_END\n\necho \"🎉 All development tools installed successfully!\"\necho \"💡 Available tools: gh, docker-compose, lazygit, btop, fd, rg, bat, eza, tldr, fkill\"\necho \"💡 Aliases configured: cat→bat, ls→eza, find→fd, grep→rg, git-ui→lazygit, top→btop\"",
"start_blocks_login": false,
"timeout": 0
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_script",
"name": "git_hooks_setup",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"cron": null,
"display_name": "Setup Git Hooks",
"icon": "/icon/git.svg",
"id": "6516f859-b875-4d3d-bade-9b67fd81005e",
"log_path": null,
"run_on_start": true,
"run_on_stop": false,
"script": "#!/bin/bash\nset -e\necho \"📝 Setting up Git hooks and metadata capture...\"\n\n# Ensure we're in the workspaces directory\ncd /workspaces\n\n# Initialize git repository if it doesn't exist\nif [ ! -d \".git\" ]; then\n echo \"🔧 Initializing git repository...\"\n git init\nfi\n\n# Create .git/hooks directory if it doesn't exist\nmkdir -p .git/hooks\n\n# Create post-commit hook for metadata capture\ncat \u003e .git/hooks/post-commit \u003c\u003c 'POST_COMMIT_END'\n#!/bin/bash\n# Post-commit hook to capture git metadata\necho \"📝 Capturing git metadata after commit...\"\n\n# Ensure metadata directory exists\nmkdir -p /tmp/git-metadata\n\n# Capture current git state\ngit branch --show-current \u003e /tmp/git-metadata/current-branch 2\u003e/dev/null || echo \"main\" \u003e /tmp/git-metadata/current-branch\ngit rev-parse HEAD \u003e /tmp/git-metadata/commit-hash 2\u003e/dev/null || echo \"no-commits\" \u003e /tmp/git-metadata/commit-hash\ngit remote get-url origin \u003e /tmp/git-metadata/remote-url 2\u003e/dev/null || echo \"no-remote\" \u003e /tmp/git-metadata/remote-url\n\n# Log the commit for development tracking\necho \"$(date): Commit $(git rev-parse --short HEAD) on branch $(git branch --show-current)\" \u003e\u003e /tmp/git-metadata/commit-log\n\necho \"✅ Git metadata updated\"\nPOST_COMMIT_END\n\n# Make post-commit hook executable\nchmod +x .git/hooks/post-commit\n\n# Create pre-push hook for quality checks\ncat \u003e .git/hooks/pre-push \u003c\u003c 'PRE_PUSH_END'\n#!/bin/bash\n# Pre-push hook for basic quality checks\necho \"🔍 Running pre-push quality checks...\"\n\n# Check if package.json exists and run tests\nif [ -f \"package.json\" ]; then\n echo \"📦 Found Node.js project, checking scripts...\"\n if npm run --silent test --if-present; then\n echo \"✅ Tests passed\"\n else\n echo \"⚠️ Tests not found or failed - pushing anyway\"\n fi\nfi\n\n# Check if requirements.txt or pyproject.toml exists\nif [ -f \"requirements.txt\" ] || [ -f \"pyproject.toml\" ]; then\n echo \"🐍 Found Python project...\"\n # Could add Python linting here\n echo \"✅ Python project checks passed\"\nfi\n\n# Check for large files\necho \"📁 Checking for large files...\"\nlarge_files=$(find . -type f -size +100M 2\u003e/dev/null | head -5)\nif [ ! -z \"$large_files\" ]; then\n echo \"⚠️ Large files detected:\"\n echo \"$large_files\"\n echo \"Consider using Git LFS for large files\"\nfi\n\necho \"✅ Pre-push checks completed\"\nPRE_PUSH_END\n\n# Make pre-push hook executable\nchmod +x .git/hooks/pre-push\n\n# Set proper ownership for the coder user\nchown -R coder:coder .git/hooks\n\necho \"✅ Git hooks and metadata capture configured\"\necho \"📝 Git metadata will be automatically captured on commits\"\necho \"🔍 Pre-push quality checks will run before each push\"",
"start_blocks_login": false,
"timeout": 0
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "coder_script",
"name": "windsurf_setup",
"provider": "provider[\"registry.terraform.io/coder/coder\"]",
"instances": [
{
"index_key": 0,
"schema_version": 1,
"attributes": {
"agent_id": "c11cf7bd-e3f1-4e3d-9e09-fde1ca5d9fcb",
"cron": null,
"display_name": "Configure Windsurf IDE Support",
"icon": "/icon/windsurf.svg",
"id": "3ab9b1f6-6c88-4b09-8d01-4befaab7987c",
"log_path": null,
"run_on_start": true,
"run_on_stop": false,
"script": "#!/bin/bash\nset -e\necho \"🌊 Setting up Windsurf IDE support...\"\n\n# Create Windsurf configuration directories\nmkdir -p /home/coder/.windsurf/data/User\nmkdir -p /home/coder/.windsurf/extensions\n\n# Create optimized Windsurf settings\ncat \u003e /home/coder/.windsurf/data/User/settings.json \u003c\u003c 'WINDSURF_SETTINGS_END'\n{\n \"workbench.colorTheme\": \"Windsurf Dark\",\n \"editor.fontSize\": 14,\n \"editor.tabSize\": 2,\n \"editor.insertSpaces\": true,\n \"editor.formatOnSave\": true,\n \"editor.codeActionsOnSave\": {\n \"source.fixAll\": true,\n \"source.organizeImports\": true\n },\n \"files.autoSave\": \"afterDelay\",\n \"files.autoSaveDelay\": 1000,\n \"terminal.integrated.fontSize\": 13,\n \"git.enableSmartCommit\": true,\n \"git.confirmSync\": false,\n \"python.defaultInterpreterPath\": \"/home/coder/.venv/bin/python\",\n \"python.linting.enabled\": true,\n \"python.linting.pylintEnabled\": false,\n \"python.linting.flake8Enabled\": true,\n \"typescript.preferences.includePackageJsonAutoImports\": \"auto\",\n \"javascript.preferences.includePackageJsonAutoImports\": \"auto\",\n \"windsurf.ai.enabled\": true,\n \"windsurf.ai.showInEditorContextMenu\": true,\n \"windsurf.chat.enabled\": true,\n \"windsurf.codeCompletion.enabled\": true\n}\nWINDSURF_SETTINGS_END\n\n# Create development keybindings\ncat \u003e /home/coder/.windsurf/data/User/keybindings.json \u003c\u003c 'WINDSURF_KEYS_END'\n[\n {\n \"key\": \"ctrl+shift+a\",\n \"command\": \"windsurf.chat.open\"\n },\n {\n \"key\": \"ctrl+shift+c\",\n \"command\": \"windsurf.ai.generateCode\"\n },\n {\n \"key\": \"ctrl+shift+r\",\n \"command\": \"windsurf.ai.refactorSelection\"\n },\n {\n \"key\": \"ctrl+shift+e\",\n \"command\": \"windsurf.ai.explainCode\"\n }\n]\nWINDSURF_KEYS_END\n\n# Set proper ownership\nchown -R coder:coder /home/coder/.windsurf\n\necho \"✅ Windsurf IDE support configured\"\necho \"🌊 Windsurf AI features enabled with optimized settings\"\necho \"⌨️ Keyboard shortcuts: Ctrl+Shift+A (chat), Ctrl+Shift+C (generate), Ctrl+Shift+R (refactor)\"",
"start_blocks_login": false,
"timeout": 0
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"coder_agent.main",
"data.coder_parameter.enable_ai_tools",
"data.coder_parameter.enable_services",
"data.coder_provisioner.me",
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "docker_container",
"name": "jupyter",
"provider": "provider[\"registry.terraform.io/kreuzwerker/docker\"]",
"instances": []
},
{
"mode": "managed",
"type": "docker_container",
"name": "pgadmin",
"provider": "provider[\"registry.terraform.io/kreuzwerker/docker\"]",
"instances": [
{
"index_key": 0,
"schema_version": 2,
"attributes": {
"attach": false,
"bridge": "",
"capabilities": [],
"cgroupns_mode": null,
"command": [],
"container_logs": null,
"container_read_refresh_timeout_milliseconds": 15000,
"cpu_set": "",
"cpu_shares": 0,
"destroy_grace_seconds": null,
"devices": [],
"dns": null,
"dns_opts": null,
"dns_search": null,
"domainname": "",
"entrypoint": [
"/entrypoint.sh"
],
"env": [
"PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED=False",
"PGADMIN_CONFIG_SERVER_MODE=False",
"PGADMIN_DEFAULT_EMAIL=admin@dev.local",
"PGADMIN_DEFAULT_PASSWORD=adminpassword",
"PGADMIN_LISTEN_PORT=80"
],
"exit_code": null,
"gateway": "",
"gpus": null,
"group_add": null,
"healthcheck": null,
"host": [],
"hostname": "15d5f4c520ee",
"id": "15d5f4c520ee86c576be93b842a23c44409d8a8801176aa81aaca99758177c22",
"image": "sha256:5929bac24d91b5d7219686c8d66a703cd5851a498620bca4f5e4263873b015c0",
"init": false,
"ip_address": "",
"ip_prefix_length": 0,
"ipc_mode": "private",
"labels": [
{
"label": "coder.service",
"value": "pgadmin"
},
{
"label": "coder.workspace_id",
"value": "e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"links": null,
"log_driver": "json-file",
"log_opts": {
"max-file": "3",
"max-size": "10m"
},
"logs": false,
"max_retry_count": 0,
"memory": 0,
"memory_swap": 0,
"mounts": [],
"must_run": true,
"name": "pgadmin-e7696a82-d8b2-42e6-920b-49e5aa5776c9",
"network_alias": null,
"network_data": [
{
"gateway": "",
"global_ipv6_address": "",
"global_ipv6_prefix_length": 0,
"ip_address": "",
"ip_prefix_length": 0,
"ipv6_gateway": "",
"network_name": "coder-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"network_mode": "bridge",
"networks": null,
"networks_advanced": [
{
"aliases": [],
"ipv4_address": "",
"ipv6_address": "",
"name": "coder-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"pid_mode": "",
"ports": [],
"privileged": false,
"publish_all_ports": false,
"read_only": false,
"remove_volumes": true,
"restart": "unless-stopped",
"rm": false,
"runtime": "runc",
"security_opts": [],
"shm_size": 64,
"start": true,
"stdin_open": false,
"stop_signal": "",
"stop_timeout": 0,
"storage_opts": null,
"sysctls": null,
"tmpfs": null,
"tty": false,
"ulimit": [],
"upload": [],
"user": "5050",
"userns_mode": "",
"volumes": [
{
"container_path": "/var/lib/pgadmin",
"from_container": "",
"host_path": "",
"read_only": null,
"volume_name": "pgadmin-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"wait": false,
"wait_timeout": 60,
"working_dir": "/pgadmin4"
},
"sensitive_attributes": [
[
{
"type": "get_attr",
"value": "env"
}
]
],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjIifQ==",
"dependencies": [
"data.coder_parameter.enable_services",
"data.coder_workspace.me",
"data.coder_workspace_owner.me",
"docker_network.workspace",
"docker_volume.pgadmin_data"
]
}
]
},
{
"mode": "managed",
"type": "docker_container",
"name": "postgres",
"provider": "provider[\"registry.terraform.io/kreuzwerker/docker\"]",
"instances": [
{
"index_key": 0,
"schema_version": 2,
"attributes": {
"attach": false,
"bridge": "",
"capabilities": [],
"cgroupns_mode": null,
"command": [
"postgres"
],
"container_logs": null,
"container_read_refresh_timeout_milliseconds": 15000,
"cpu_set": "",
"cpu_shares": 0,
"destroy_grace_seconds": null,
"devices": [],
"dns": null,
"dns_opts": null,
"dns_search": null,
"domainname": "",
"entrypoint": [
"docker-entrypoint.sh"
],
"env": [
"POSTGRES_DB=postgres",
"POSTGRES_INITDB_ARGS=--auth-local=trust --auth-host=md5",
"POSTGRES_MAX_CONNECTIONS=100",
"POSTGRES_PASSWORD=devpassword",
"POSTGRES_SHARED_PRELOAD_LIBRARIES=pg_stat_statements",
"POSTGRES_USER=postgres"
],
"exit_code": null,
"gateway": "172.23.0.1",
"gpus": null,
"group_add": null,
"healthcheck": [
{
"interval": "15s",
"retries": 5,
"start_period": "0s",
"test": [
"CMD-SHELL",
"pg_isready -U postgres"
],
"timeout": "5s"
}
],
"host": [],
"hostname": "a1d440de4e18",
"id": "a1d440de4e184025387eb5c5e584c277b0372a57e8ba48d96e72adccefa9c422",
"image": "sha256:3406990b6e4c7192317b6fdc5680498744f6142f01f0287f4ee0420d8c74063c",
"init": false,
"ip_address": "172.23.0.4",
"ip_prefix_length": 16,
"ipc_mode": "private",
"labels": [
{
"label": "coder.service",
"value": "postgres"
},
{
"label": "coder.workspace_id",
"value": "e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"links": null,
"log_driver": "json-file",
"log_opts": {
"max-file": "3",
"max-size": "10m"
},
"logs": false,
"max_retry_count": 0,
"memory": 0,
"memory_swap": 0,
"mounts": [],
"must_run": true,
"name": "postgres-e7696a82-d8b2-42e6-920b-49e5aa5776c9",
"network_alias": null,
"network_data": [
{
"gateway": "172.23.0.1",
"global_ipv6_address": "",
"global_ipv6_prefix_length": 0,
"ip_address": "172.23.0.4",
"ip_prefix_length": 16,
"ipv6_gateway": "",
"network_name": "coder-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"network_mode": "bridge",
"networks": null,
"networks_advanced": [
{
"aliases": [],
"ipv4_address": "",
"ipv6_address": "",
"name": "coder-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"pid_mode": "",
"ports": [],
"privileged": false,
"publish_all_ports": false,
"read_only": false,
"remove_volumes": true,
"restart": "unless-stopped",
"rm": false,
"runtime": "runc",
"security_opts": [],
"shm_size": 64,
"start": true,
"stdin_open": false,
"stop_signal": "SIGINT",
"stop_timeout": 0,
"storage_opts": null,
"sysctls": null,
"tmpfs": null,
"tty": false,
"ulimit": [],
"upload": [],
"user": "",
"userns_mode": "",
"volumes": [
{
"container_path": "/var/lib/postgresql/data",
"from_container": "",
"host_path": "",
"read_only": null,
"volume_name": "postgres-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"wait": false,
"wait_timeout": 60,
"working_dir": "/"
},
"sensitive_attributes": [
[
{
"type": "get_attr",
"value": "env"
}
]
],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjIifQ==",
"dependencies": [
"data.coder_parameter.enable_services",
"data.coder_workspace.me",
"data.coder_workspace_owner.me",
"docker_network.workspace",
"docker_volume.postgres_data"
]
}
]
},
{
"mode": "managed",
"type": "docker_container",
"name": "qdrant",
"provider": "provider[\"registry.terraform.io/kreuzwerker/docker\"]",
"instances": [
{
"index_key": 0,
"schema_version": 2,
"attributes": {
"attach": false,
"bridge": "",
"capabilities": [],
"cgroupns_mode": null,
"command": [
"./entrypoint.sh"
],
"container_logs": null,
"container_read_refresh_timeout_milliseconds": 15000,
"cpu_set": "",
"cpu_shares": 0,
"destroy_grace_seconds": null,
"devices": [],
"dns": null,
"dns_opts": null,
"dns_search": null,
"domainname": "",
"entrypoint": [],
"env": [
"QDRANT__LOG_LEVEL=INFO",
"QDRANT__SERVICE__GRPC_PORT=6334",
"QDRANT__SERVICE__HTTP_PORT=6333"
],
"exit_code": null,
"gateway": "172.23.0.1",
"gpus": null,
"group_add": null,
"healthcheck": [
{
"interval": "20s",
"retries": 5,
"start_period": "0s",
"test": [
"CMD",
"curl",
"-f",
"http://localhost:6333/health"
],
"timeout": "5s"
}
],
"host": [],
"hostname": "f0b01bfe19f5",
"id": "f0b01bfe19f505c16f68a97eb00ceda08a22a9f0302f3e2f84c3173ae5cce4a0",
"image": "sha256:31407c0e8e32eb771b71718f1a4772e2ad47a07557917b21ac96792f40eb8007",
"init": false,
"ip_address": "172.23.0.6",
"ip_prefix_length": 16,
"ipc_mode": "private",
"labels": [
{
"label": "coder.service",
"value": "qdrant"
},
{
"label": "coder.workspace_id",
"value": "e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"links": null,
"log_driver": "json-file",
"log_opts": {
"max-file": "3",
"max-size": "10m"
},
"logs": false,
"max_retry_count": 0,
"memory": 0,
"memory_swap": 0,
"mounts": [],
"must_run": true,
"name": "qdrant-e7696a82-d8b2-42e6-920b-49e5aa5776c9",
"network_alias": null,
"network_data": [
{
"gateway": "172.23.0.1",
"global_ipv6_address": "",
"global_ipv6_prefix_length": 0,
"ip_address": "172.23.0.6",
"ip_prefix_length": 16,
"ipv6_gateway": "",
"network_name": "coder-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"network_mode": "bridge",
"networks": null,
"networks_advanced": [
{
"aliases": [],
"ipv4_address": "",
"ipv6_address": "",
"name": "coder-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"pid_mode": "",
"ports": [],
"privileged": false,
"publish_all_ports": false,
"read_only": false,
"remove_volumes": true,
"restart": "unless-stopped",
"rm": false,
"runtime": "runc",
"security_opts": [],
"shm_size": 64,
"start": true,
"stdin_open": false,
"stop_signal": "",
"stop_timeout": 0,
"storage_opts": null,
"sysctls": null,
"tmpfs": null,
"tty": false,
"ulimit": [],
"upload": [],
"user": "0:0",
"userns_mode": "",
"volumes": [
{
"container_path": "/qdrant/storage",
"from_container": "",
"host_path": "",
"read_only": null,
"volume_name": "qdrant-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"wait": false,
"wait_timeout": 60,
"working_dir": "/qdrant"
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjIifQ==",
"dependencies": [
"data.coder_parameter.enable_services",
"data.coder_workspace.me",
"data.coder_workspace_owner.me",
"docker_network.workspace",
"docker_volume.qdrant_data"
]
}
]
},
{
"mode": "managed",
"type": "docker_container",
"name": "redis",
"provider": "provider[\"registry.terraform.io/kreuzwerker/docker\"]",
"instances": [
{
"index_key": 0,
"schema_version": 2,
"attributes": {
"attach": false,
"bridge": "",
"capabilities": [],
"cgroupns_mode": null,
"command": [
"redis-server",
"--requirepass",
"devpassword",
"--appendonly",
"yes",
"--appendfsync",
"everysec",
"--maxmemory",
"512mb",
"--maxmemory-policy",
"allkeys-lru"
],
"container_logs": null,
"container_read_refresh_timeout_milliseconds": 15000,
"cpu_set": "",
"cpu_shares": 0,
"destroy_grace_seconds": null,
"devices": [],
"dns": null,
"dns_opts": null,
"dns_search": null,
"domainname": "",
"entrypoint": [
"docker-entrypoint.sh"
],
"env": [],
"exit_code": null,
"gateway": "172.23.0.1",
"gpus": null,
"group_add": null,
"healthcheck": [
{
"interval": "15s",
"retries": 5,
"start_period": "0s",
"test": [
"CMD",
"redis-cli",
"--raw",
"incr",
"ping"
],
"timeout": "3s"
}
],
"host": [],
"hostname": "33086896d289",
"id": "33086896d28946e6fe11eeab0885ff812899afa474c858372d661c3d954f377e",
"image": "sha256:bb186d083732f669da90be8b0f975a37812b15e913465bb14d845db72a4e3e08",
"init": false,
"ip_address": "172.23.0.2",
"ip_prefix_length": 16,
"ipc_mode": "private",
"labels": [
{
"label": "coder.service",
"value": "redis"
},
{
"label": "coder.workspace_id",
"value": "e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"links": null,
"log_driver": "json-file",
"log_opts": {
"max-file": "3",
"max-size": "10m"
},
"logs": false,
"max_retry_count": 0,
"memory": 0,
"memory_swap": 0,
"mounts": [],
"must_run": true,
"name": "redis-e7696a82-d8b2-42e6-920b-49e5aa5776c9",
"network_alias": null,
"network_data": [
{
"gateway": "172.23.0.1",
"global_ipv6_address": "",
"global_ipv6_prefix_length": 0,
"ip_address": "172.23.0.2",
"ip_prefix_length": 16,
"ipv6_gateway": "",
"network_name": "coder-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"network_mode": "bridge",
"networks": null,
"networks_advanced": [
{
"aliases": [],
"ipv4_address": "",
"ipv6_address": "",
"name": "coder-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"pid_mode": "",
"ports": [],
"privileged": false,
"publish_all_ports": false,
"read_only": false,
"remove_volumes": true,
"restart": "unless-stopped",
"rm": false,
"runtime": "runc",
"security_opts": [],
"shm_size": 64,
"start": true,
"stdin_open": false,
"stop_signal": "",
"stop_timeout": 0,
"storage_opts": null,
"sysctls": null,
"tmpfs": null,
"tty": false,
"ulimit": [],
"upload": [],
"user": "",
"userns_mode": "",
"volumes": [
{
"container_path": "/data",
"from_container": "",
"host_path": "",
"read_only": null,
"volume_name": "redis-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"wait": false,
"wait_timeout": 60,
"working_dir": "/data"
},
"sensitive_attributes": [
[
{
"type": "get_attr",
"value": "command"
},
{
"type": "index",
"value": {
"value": 2,
"type": "number"
}
}
]
],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjIifQ==",
"dependencies": [
"data.coder_parameter.enable_services",
"data.coder_workspace.me",
"data.coder_workspace_owner.me",
"docker_network.workspace",
"docker_volume.redis_data"
]
}
]
},
{
"mode": "managed",
"type": "docker_image",
"name": "devcontainer",
"provider": "provider[\"registry.terraform.io/kreuzwerker/docker\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"build": [],
"force_remove": null,
"id": "sha256:dca6a985ffbbc74007a13b6f56ac0fbbc5febae081350b66e865a5549338134bmcr.microsoft.com/devcontainers/universal:2-linux",
"image_id": "sha256:dca6a985ffbbc74007a13b6f56ac0fbbc5febae081350b66e865a5549338134b",
"keep_locally": true,
"latest": "sha256:dca6a985ffbbc74007a13b6f56ac0fbbc5febae081350b66e865a5549338134b",
"name": "mcr.microsoft.com/devcontainers/universal:2-linux",
"output": null,
"platform": null,
"pull_trigger": null,
"pull_triggers": null,
"repo_digest": "mcr.microsoft.com/devcontainers/universal@sha256:dca6a985ffbbc74007a13b6f56ac0fbbc5febae081350b66e865a5549338134b",
"triggers": null
},
"sensitive_attributes": [],
"private": "bnVsbA=="
}
]
},
{
"mode": "managed",
"type": "docker_network",
"name": "workspace",
"provider": "provider[\"registry.terraform.io/kreuzwerker/docker\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"attachable": false,
"check_duplicate": null,
"driver": "bridge",
"id": "812199c95db82755b05b93e728dd43fc87fc47a6f8b0b0ae5d7e391a0aacad17",
"ingress": false,
"internal": false,
"ipam_config": [
{
"aux_address": {},
"gateway": "172.23.0.1",
"ip_range": "",
"subnet": "172.23.0.0/16"
}
],
"ipam_driver": "default",
"ipam_options": null,
"ipv6": false,
"labels": [
{
"label": "coder.owner",
"value": "default"
},
{
"label": "coder.project",
"value": "dev-environment"
},
{
"label": "coder.workspace_id",
"value": "e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"name": "coder-e7696a82-d8b2-42e6-920b-49e5aa5776c9",
"options": {
"com.docker.network.enable_ipv4": "true"
},
"scope": "local"
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
},
{
"mode": "managed",
"type": "docker_volume",
"name": "jupyter_data",
"provider": "provider[\"registry.terraform.io/kreuzwerker/docker\"]",
"instances": []
},
{
"mode": "managed",
"type": "docker_volume",
"name": "pgadmin_data",
"provider": "provider[\"registry.terraform.io/kreuzwerker/docker\"]",
"instances": [
{
"index_key": 0,
"schema_version": 1,
"attributes": {
"driver": "local",
"driver_opts": null,
"id": "pgadmin-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9",
"labels": [
{
"label": "coder.service",
"value": "pgadmin"
},
{
"label": "coder.workspace_id",
"value": "e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"mountpoint": "/var/lib/docker/volumes/pgadmin-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9/_data",
"name": "pgadmin-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"data.coder_parameter.enable_services",
"data.coder_workspace.me"
]
}
]
},
{
"mode": "managed",
"type": "docker_volume",
"name": "postgres_data",
"provider": "provider[\"registry.terraform.io/kreuzwerker/docker\"]",
"instances": [
{
"index_key": 0,
"schema_version": 1,
"attributes": {
"driver": "local",
"driver_opts": null,
"id": "postgres-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9",
"labels": [
{
"label": "coder.service",
"value": "postgres"
},
{
"label": "coder.workspace_id",
"value": "e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"mountpoint": "/var/lib/docker/volumes/postgres-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9/_data",
"name": "postgres-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"data.coder_parameter.enable_services",
"data.coder_workspace.me"
]
}
]
},
{
"mode": "managed",
"type": "docker_volume",
"name": "qdrant_data",
"provider": "provider[\"registry.terraform.io/kreuzwerker/docker\"]",
"instances": [
{
"index_key": 0,
"schema_version": 1,
"attributes": {
"driver": "local",
"driver_opts": null,
"id": "qdrant-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9",
"labels": [
{
"label": "coder.service",
"value": "qdrant"
},
{
"label": "coder.workspace_id",
"value": "e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"mountpoint": "/var/lib/docker/volumes/qdrant-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9/_data",
"name": "qdrant-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"data.coder_parameter.enable_services",
"data.coder_workspace.me"
]
}
]
},
{
"mode": "managed",
"type": "docker_volume",
"name": "redis_data",
"provider": "provider[\"registry.terraform.io/kreuzwerker/docker\"]",
"instances": [
{
"index_key": 0,
"schema_version": 1,
"attributes": {
"driver": "local",
"driver_opts": null,
"id": "redis-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9",
"labels": [
{
"label": "coder.service",
"value": "redis"
},
{
"label": "coder.workspace_id",
"value": "e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"mountpoint": "/var/lib/docker/volumes/redis-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9/_data",
"name": "redis-data-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"data.coder_parameter.enable_services",
"data.coder_workspace.me"
]
}
]
},
{
"mode": "managed",
"type": "docker_volume",
"name": "workspaces",
"provider": "provider[\"registry.terraform.io/kreuzwerker/docker\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"driver": "local",
"driver_opts": null,
"id": "workspaces-e7696a82-d8b2-42e6-920b-49e5aa5776c9",
"labels": [
{
"label": "coder.owner",
"value": "default"
},
{
"label": "coder.type",
"value": "workspace-data"
},
{
"label": "coder.workspace_id",
"value": "e7696a82-d8b2-42e6-920b-49e5aa5776c9"
}
],
"mountpoint": "/var/lib/docker/volumes/workspaces-e7696a82-d8b2-42e6-920b-49e5aa5776c9/_data",
"name": "workspaces-e7696a82-d8b2-42e6-920b-49e5aa5776c9"
},
"sensitive_attributes": [],
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
"dependencies": [
"data.coder_workspace.me",
"data.coder_workspace_owner.me"
]
}
]
}
],
"check_results": [
{
"object_kind": "var",
"config_addr": "var.pgadmin_password",
"status": "pass",
"objects": [
{
"object_addr": "var.pgadmin_password",
"status": "pass"
}
]
},
{
"object_kind": "var",
"config_addr": "var.postgres_max_connections",
"status": "pass",
"objects": [
{
"object_addr": "var.postgres_max_connections",
"status": "pass"
}
]
},
{
"object_kind": "var",
"config_addr": "var.redis_version",
"status": "pass",
"objects": [
{
"object_addr": "var.redis_version",
"status": "pass"
}
]
},
{
"object_kind": "var",
"config_addr": "var.node_version",
"status": "pass",
"objects": [
{
"object_addr": "var.node_version",
"status": "pass"
}
]
},
{
"object_kind": "var",
"config_addr": "var.environment",
"status": "pass",
"objects": [
{
"object_addr": "var.environment",
"status": "pass"
}
]
},
{
"object_kind": "var",
"config_addr": "var.workspace_memory_limit",
"status": "pass",
"objects": [
{
"object_addr": "var.workspace_memory_limit",
"status": "pass"
}
]
},
{
"object_kind": "var",
"config_addr": "var.redis_password",
"status": "pass",
"objects": [
{
"object_addr": "var.redis_password",
"status": "pass"
}
]
},
{
"object_kind": "var",
"config_addr": "var.pgadmin_port",
"status": "pass",
"objects": [
{
"object_addr": "var.pgadmin_port",
"status": "pass"
}
]
},
{
"object_kind": "var",
"config_addr": "var.pgadmin_email",
"status": "pass",
"objects": [
{
"object_addr": "var.pgadmin_email",
"status": "pass"
}
]
},
{
"object_kind": "var",
"config_addr": "var.workspace_cpu_limit",
"status": "pass",
"objects": [
{
"object_addr": "var.workspace_cpu_limit",
"status": "pass"
}
]
},
{
"object_kind": "var",
"config_addr": "var.postgres_version",
"status": "pass",
"objects": [
{
"object_addr": "var.postgres_version",
"status": "pass"
}
]
},
{
"object_kind": "var",
"config_addr": "var.postgres_password",
"status": "pass",
"objects": [
{
"object_addr": "var.postgres_password",
"status": "pass"
}
]
},
{
"object_kind": "var",
"config_addr": "var.python_version",
"status": "pass",
"objects": [
{
"object_addr": "var.python_version",
"status": "pass"
}
]
},
{
"object_kind": "var",
"config_addr": "var.redis_max_memory",
"status": "pass",
"objects": [
{
"object_addr": "var.redis_max_memory",
"status": "pass"
}
]
},
{
"object_kind": "var",
"config_addr": "var.project_name",
"status": "pass",
"objects": [
{
"object_addr": "var.project_name",
"status": "pass"
}
]
}
]
}