terraform { required_providers { coder = { source = "coder/coder" } docker = { source = "kreuzwerker/docker" } } } locals { username = data.coder_workspace_owner.me.name } data "coder_provisioner" "me" {} provider "docker" { registry_auth { address = "harbor.infra.cluster.ionos.com" username = var.docker_registry_user password = var.docker_registry_pass } } variable "docker_registry_user" { default = "" } variable "docker_registry_pass" { default = "" sensitive = false } output "debug_my_var" { value = var.docker_registry_user description = "Debug-Ausgabe für my_var" sensitive = false } output "debug_my_var2" { value = var.docker_registry_pass description = "Debug-Ausgabe für my_var" sensitive = false } provider "coder" {} data "coder_workspace" "me" {} data "coder_workspace_owner" "me" {} resource "coder_agent" "main" { arch = data.coder_provisioner.me.arch os = "linux" startup_script = <<-EOT set -e curl -fsSL https://code-server.dev/install.sh | sh -s -- --method=standalone --version=4.96.4 --prefix=/tmp/code-server /tmp/code-server/bin/code-server --auth none --port 13337 --host 0.0.0.0 >/tmp/code-server.log 2>&1 & EOT env = { 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 GIT_COMMITTER_NAME = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name) GIT_COMMITTER_EMAIL = data.coder_workspace_owner.me.email } metadata { display_name = "CPU Usage" key = "0_cpu_usage" script = "coder stat cpu" interval = 10 timeout = 1 } metadata { display_name = "RAM Usage" key = "1_ram_usage" script = "coder stat mem" interval = 10 timeout = 1 } metadata { display_name = "Home Disk" key = "3_home_disk" script = "coder stat disk --path $${HOME}" interval = 60 timeout = 1 } metadata { display_name = "CPU Usage (Host)" key = "4_cpu_usage_host" script = "coder stat cpu --host" interval = 10 timeout = 1 } metadata { display_name = "Memory Usage (Host)" key = "5_mem_usage_host" script = "coder stat mem --host" interval = 10 timeout = 1 } } resource "coder_app" "code-server" { agent_id = coder_agent.main.id slug = "code-server" display_name = "code-server" url = "http://localhost:13337/?folder=/home/${local.username}" icon = "/icon/code.svg" subdomain = false share = "owner" healthcheck { url = "http://localhost:13337/healthz" interval = 5 threshold = 6 } } resource "coder_app" "coder-server-doc" { agent_id = coder_agent.main.id icon = "/emojis/1f4dd.png" slug = "getting-started" url = "https://coder.com/docs/code-server" external = true } resource "docker_volume" "home_volume" { name = "coder-${data.coder_workspace.me.id}-home" lifecycle { ignore_changes = all } } # Volume für Go-Projekte resource "docker_volume" "go_projects" { name = "coder-${data.coder_workspace.me.id}-go-projects" lifecycle { ignore_changes = all } } # Volume für Docker-Daten resource "docker_volume" "docker_data" { name = "coder-${data.coder_workspace.me.id}-docker-data" lifecycle { ignore_changes = all } } resource "docker_image" "main_image" { name = "harbor.infra.cluster.ionos.com/si-workshops/#valonscodertools@sha256:13da3b2098105567a5ea9b30f7da352eeda2db18de9264d9a9ad5eb46cf78383" } resource "docker_network" "private_network" { name = "network-${data.coder_workspace.me.id}" } # Main workspace container with persistent volumes resource "docker_container" "workspace" { count = data.coder_workspace.me.start_count image = docker_image.main_image.name name = "coder-${data.coder_workspace_owner.me.name}-${lower(data.coder_workspace.me.name)}" hostname = data.coder_workspace.me.name entrypoint = ["sh", "-c", coder_agent.main.init_script] env = [ "CODER_AGENT_TOKEN=${coder_agent.main.token}", "DOCKER_HOST=tcp://dind-${data.coder_workspace.me.id}:2375" ] volumes { container_path = "/home/${local.username}/go" volume_name = docker_volume.go_projects.name read_only = false } networks_advanced { name = docker_network.private_network.name } } # Docker-in-Docker (DinD) container resource "docker_container" "dind" { image = "docker:dind" privileged = true name = "dind-${data.coder_workspace.me.id}" entrypoint = ["dockerd", "-H", "tcp://0.0.0.0:2375"] volumes { container_path = "/var/lib/docker" volume_name = docker_volume.docker_data.name read_only = false } networks_advanced { name = docker_network.private_network.name } }