Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- terraform {
- required_providers {
- coder = {
- source = "coder/coder"
- }
- docker = {
- source = "kreuzwerker/docker"
- }
- }
- }
- locals {
- username = data.coder_workspace_owner.me.name
- folder_name = try(element(split("/", data.coder_parameter.git_repo.value), length(split("/", data.coder_parameter.git_repo.value)) - 1), "")
- }
- data "coder_external_auth" "github" {
- id = "primary-github"
- }
- data "coder_parameter" "git_repo" {
- name = "git_repo"
- display_name = "Git repository"
- default = "https://github.com/coder/coder"
- }
- data "coder_provisioner" "me" {
- }
- provider "docker" {
- }
- data "coder_workspace" "me" {
- }
- data "coder_workspace_owner" "me" {
- }
- data "coder_parameter" "force_rebuild" {
- name = "force_rebuild"
- type = "bool"
- description = "Rebuild the Docker image rather than use the cached one."
- mutable = true
- default = false
- ephemeral = true
- }
- resource "coder_agent" "main" {
- arch = data.coder_provisioner.me.arch
- os = "linux"
- dir = "~/${local.folder_name}"
- startup_script = <<-EOT
- # Clone repo from GitHub
- if [ ! -d "${local.folder_name}" ]
- then
- git clone ${data.coder_parameter.git_repo.value}
- fi
- set -e
- # install and start code-server
- curl -fsSL https://code-server.dev/install.sh | sh -s -- --method=standalone --prefix=/tmp/code-server --version 4.19.1
- /tmp/code-server/bin/code-server --auth none --port 13337 >/tmp/code-server.log 2>&1 &
- sudo dockerd >/tmp/dockerd.log 2>&1 &
- 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 = ${data.coder_workspace.me.owner_name}
- # GIT_AUTHOR_EMAIL = "${data.coder_workspace.me.owner_email}"
- # GIT_COMMITTER_NAME = coalesce(data.coder_workspace.me.owner_name, data.coder_workspace.me.owner)
- # GIT_COMMITTER_EMAIL = "${data.coder_workspace.me.owner_email}"
- # }
- # The following metadata blocks are optional. They are used to display
- # information about your workspace in the dashboard. You can remove them
- # if you don't want to display any information.
- # For basic resources, you can use the `coder stat` command.
- # If you need more control, you can write your own script.
- 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
- }
- metadata {
- display_name = "Load Average (Host)"
- key = "6_load_host"
- # get load avg scaled by number of cores
- script = <<EOT
- echo "`cat /proc/loadavg | awk '{ print $1 }'` `nproc`" | awk '{ printf "%0.2f", $1/$2 }'
- EOT
- interval = 60
- timeout = 1
- }
- metadata {
- display_name = "Swap Usage (Host)"
- key = "7_swap_host"
- script = <<EOT
- free -b | awk '/^Swap/ { printf("%.1f/%.1f", $3/1024.0/1024.0/1024.0, $2/1024.0/1024.0/1024.0) }'
- EOT
- 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_agent" "coder" {
- os = "linux"
- arch = "amd64"
- dir = "/home/coder"
- startup_script = <<-EOF
- pip3 install jupyterlab
- $HOME/.local/bin/jupyter lab --ServerApp.token='' --ip='*'
- EOF
- }
- resource "coder_app" "jupyter" {
- agent_id = coder_agent.coder.id
- slug = "jupyter"
- display_name = "JupyterLab"
- url = "http://localhost:8888"
- icon = "/icon/jupyter.svg"
- share = "owner"
- subdomain = true
- healthcheck {
- url = "http://localhost:8888/healthz"
- interval = 5
- threshold = 10
- }
- }
- 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_owner.me.name
- }
- labels {
- label = "coder.owner_id"
- value = data.coder_workspace_owner.me.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_owner.me.name}-${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}"]
- runtime = "sysbox-runc"
- 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_owner.me.name
- }
- labels {
- label = "coder.owner_id"
- value = data.coder_workspace_owner.me.id
- }
- labels {
- label = "coder.workspace_id"
- value = data.coder_workspace.me.id
- }
- labels {
- label = "coder.workspace_name"
- value = data.coder_workspace.me.name
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment