terraform { required_providers { coder = { source = "coder/coder" version = "~> 0.8.2" } docker = { source = "kreuzwerker/docker" version = "~> 3.0.1" } } } locals { username = data.coder_workspace.me.owner } provider "coder" { feature_use_managed_variables = "true" } data "coder_provisioner" "me" { } provider "docker" { } data "coder_workspace" "me" { } variable "waka_api_url" { description = "URL For WakaAPI" type = string sensitive = true } variable "waka_api_key" { description = "API Key for WakaAPI" type = string sensitive = true } data "coder_parameter" "git_repo" { name = "git_repo" display_name= "Git Repo" description = "Git Repo to Clone" default = " " } resource "coder_agent" "main" { arch = data.coder_provisioner.me.arch os = "linux" startup_script_timeout = 180 startup_script = <<-EOT set -e # Base Script curl -fsSL https://gitea.nicholaspease.com/npease/CoderTemplatesV2/raw/branch/main/container-scripts/base.sh | sh # WakaAPI Setup echo "[settings]" >> ~/.wakatime.cfg && echo "api_url = ${var.waka_api_url}" >> ~/.wakatime.cfg && echo "api_key = ${var.waka_api_key}" >> ~/.wakatime.cfg # Clone Git Repo cd ~/ echo OUTPUT: '${data.coder_parameter.git_repo.value}' # Local Extensions code-server --install-extension vscjava.vscode-java-pack if [ "${data.coder_parameter.git_repo.value}" != " " ] && [ ! -d "${data.coder_workspace.me.name}" ] then git clone ${data.coder_parameter.git_repo.value} fi EOT # These environment variables allow you to make Git commits right away after creating a # workspace. Note that they take precedence over configuration defined in ~/.gitconfig! # You can remove this block if you'd prefer to configure Git manually or using # dotfiles. (see docs/dotfiles.md) env = { GIT_AUTHOR_NAME = "Nicholas Pease" GIT_COMMITTER_NAME = "Nicholas Pease" GIT_AUTHOR_EMAIL = "me@nicholaspease.com" GIT_COMMITTER_EMAIL = "me@nicholaspease.com" } } resource "docker_volume" "home_volume" { name = "coder-${data.coder_workspace.me.id}-home" # Protect the volume from being deleted due to changes in attributes. lifecycle { ignore_changes = all } # Add labels in Docker to keep track of orphan resources. labels { label = "coder.owner" value = data.coder_workspace.me.owner } labels { label = "coder.owner_id" value = data.coder_workspace.me.owner_id } labels { label = "coder.workspace_id" value = data.coder_workspace.me.id } # This field becomes outdated if the workspace is renamed but can # be useful for debugging or cleaning out dangling volumes. labels { label = "coder.workspace_name_at_creation" value = data.coder_workspace.me.name } } resource "docker_image" "main" { name = "coder-${data.coder_workspace.me.id}" build { context = "./build" build_args = { USER = local.username } } triggers = { dir_sha1 = sha1(join("", [for f in fileset(path.module, "build/*") : filesha1(f)])) } } resource "docker_container" "workspace" { count = data.coder_workspace.me.start_count image = docker_image.main.name # Uses lower() to avoid Docker restriction on container names. name = "coder-${data.coder_workspace.me.owner}-${lower(data.coder_workspace.me.name)}" # Hostname makes the shell more user friendly: coder@my-workspace:~$ hostname = data.coder_workspace.me.name # Use the docker gateway if the access URL is 127.0.0.1 entrypoint = ["sh", "-c", replace(coder_agent.main.init_script, "/localhost|127\\.0\\.0\\.1/", "host.docker.internal")] env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"] host { host = "host.docker.internal" ip = "host-gateway" } volumes { container_path = "/home/${local.username}" volume_name = docker_volume.home_volume.name read_only = false } # Add labels in Docker to keep track of orphan resources. labels { label = "coder.owner" value = data.coder_workspace.me.owner } labels { label = "coder.owner_id" value = data.coder_workspace.me.owner_id } labels { label = "coder.workspace_id" value = data.coder_workspace.me.id } labels { label = "coder.workspace_name" value = data.coder_workspace.me.name } }