2023-03-17 16:46:44 +00:00
terraform {
required_providers {
fly = {
source = " fly-apps/fly "
version = " ~>0.0.21 "
}
coder = {
source = " coder/coder "
2023-04-12 17:05:16 +00:00
version = " ~>0.7.0 "
2023-03-17 16:46:44 +00:00
}
}
}
provider " fly " {
useinternaltunnel = true
internaltunnelorg = var . fly_org
internaltunnelregion = data . coder_parameter . region . value
fly_api_token = var . fly_api_token == " " ? null : var . fly_api_token
}
provider " coder " {
feature_use_managed_variables = true
}
resource " fly_app " " workspace " {
name = " coder- ${ data . coder_workspace . me . owner } - ${ lower ( data . coder_workspace . me . name ) } "
org = var . fly_org
}
2023-03-19 19:55:11 +00:00
# resource "fly_ip" "workspace-ip4" {
# app = fly_app.workspace.name
# type = "v4"
# }
2023-03-17 16:46:44 +00:00
resource " fly_volume " " home-volume " {
app = fly_app . workspace . name
name = " coder_ ${ data . coder_workspace . me . owner } _ ${ lower ( replace ( data . coder_workspace . me . name , " - " , " _ " ) ) } _home "
size = data . coder_parameter . volume - size . value
region = data . coder_parameter . region . value
}
resource " fly_machine " " workspace " {
count = data . coder_workspace . me . start_count
app = fly_app . workspace . name
region = data . coder_parameter . region . value
name = data . coder_workspace . me . name
image = data . coder_parameter . docker - image . value
cpus = data . coder_parameter . cpu . value
2023-03-19 19:55:11 +00:00
cputype = data . coder_parameter . cputype . value
2023-03-17 16:46:44 +00:00
memorymb = data . coder_parameter . memory . value * 1024
env = {
CODER_AGENT_TOKEN = " ${ coder_agent . main . token } "
}
2023-03-19 19:55:11 +00:00
# entrypoint = ["sh", "-c", replace(coder_agent.main.init_script, "/localhost|127\\.0\\.0\\.1/", "${fly_ip.workspace-ip4.address}")] # replace localhost with the IP of the workspace
entrypoint = [ " sh " , " -c " , coder_agent . main . init_script ]
2023-03-17 16:46:44 +00:00
services = [
{
ports = [
{
port = 443
handlers = [ " tls " , " http " ]
} ,
{
port = 80
handlers = [ " http " ]
}
]
protocol = " tcp " ,
" internal_port " = 80
} ,
{
ports = [
{
port = 8080
handlers = [ " tls " , " http " ]
}
]
protocol = " tcp " ,
" internal_port " = 8080
}
]
mounts = [
{
volume = fly_volume . home - volume . id
path = " /home/coder "
}
]
}
variable " fly_api_token " {
type = string
description = < < - EOF
The Fly . io API token to use for deploying the workspace . You can generate one by running :
$ flyctl auth token
EOF
sensitive = true
}
variable " fly_org " {
type = string
description = < < - EOF
The Fly . io organization slug to deploy the workspace in . List organizations by running :
$ flyctl orgs list
EOF
}
data " coder_parameter " " docker-image " {
2023-04-12 17:05:16 +00:00
name = " docker-image "
2023-04-12 21:33:38 +00:00
display_name = " Docker image "
2023-04-12 17:05:16 +00:00
description = " The docker image to use for the workspace "
default = " codercom/code-server:latest "
icon = " https://raw.githubusercontent.com/matifali/logos/main/docker.svg "
2023-03-17 16:46:44 +00:00
}
data " coder_parameter " " cpu " {
2023-04-12 17:05:16 +00:00
name = " cpu "
display_name = " CPU "
description = " The number of CPUs to allocate to the workspace (1-8) "
type = " number "
default = " 1 "
icon = " https://raw.githubusercontent.com/matifali/logos/main/cpu-3.svg "
mutable = true
2023-03-17 16:46:44 +00:00
validation {
min = 1
max = 8
}
}
2023-03-19 19:55:11 +00:00
data " coder_parameter " " cputype " {
2023-04-12 17:05:16 +00:00
name = " cputype "
2023-04-12 21:33:38 +00:00
display_name = " CPU type "
2023-04-12 17:05:16 +00:00
description = " Which CPU type do you want? "
default = " shared "
icon = " https://raw.githubusercontent.com/matifali/logos/main/cpu-1.svg "
mutable = true
2023-03-19 19:55:11 +00:00
option {
name = " Shared "
value = " shared "
}
option {
name = " Performance "
value = " performance "
}
}
2023-03-17 16:46:44 +00:00
data " coder_parameter " " memory " {
2023-04-12 17:05:16 +00:00
name = " memory "
display_name = " Memory "
description = " The amount of memory to allocate to the workspace in GB (up to 16GB) "
type = " number "
default = " 2 "
icon = " /icon/memory.svg "
mutable = true
2023-03-17 16:46:44 +00:00
validation {
2023-03-19 19:55:11 +00:00
min = data . coder_parameter . cputype . value == " performance " ? 2 : 1 # if the CPU type is performance, the minimum memory is 2GB
2023-03-17 16:46:44 +00:00
max = 16
}
}
data " coder_parameter " " volume-size " {
2023-04-12 17:05:16 +00:00
name = " volume-size "
2023-04-12 21:33:38 +00:00
display_name = " Home volume size "
2023-04-12 17:05:16 +00:00
description = " The size of the volume to create for the workspace in GB (1-20) "
type = " number "
default = " 1 "
icon = " https://raw.githubusercontent.com/matifali/logos/main/database.svg "
2023-03-17 16:46:44 +00:00
validation {
min = 1
max = 20
}
}
# You can see all available regions here: https://fly.io/docs/reference/regions/
data " coder_parameter " " region " {
2023-04-12 17:05:16 +00:00
name = " region "
display_name = " Region "
description = " The region to deploy the workspace in "
default = " ams "
icon = " /emojis/1f30e.png "
2023-03-17 16:46:44 +00:00
option {
name = " Amsterdam, Netherlands "
value = " ams "
icon = " /emojis/1f1f3-1f1f1.png "
}
option {
name = " Frankfurt, Germany "
value = " fra "
icon = " /emojis/1f1e9-1f1ea.png "
}
option {
name = " Paris, France "
value = " cdg "
icon = " /emojis/1f1eb-1f1f7.png "
}
option {
name = " Denver, Colorado (US) "
value = " den "
icon = " /emojis/1f1fa-1f1f8.png "
}
option {
name = " Dallas, Texas (US) "
2023-03-21 19:04:04 +00:00
value = " dfw "
2023-03-17 16:46:44 +00:00
icon = " /emojis/1f1fa-1f1f8.png "
}
option {
name = " Hong Kong "
value = " hkg "
icon = " /emojis/1f1ed-1f1f0.png "
}
option {
name = " Los Angeles, California (US) "
value = " lax "
icon = " /emojis/1f1fa-1f1f8.png "
}
option {
name = " London, United Kingdom "
value = " lhr "
icon = " /emojis/1f1ec-1f1e7.png "
}
option {
name = " Chennai, India "
value = " maa "
icon = " /emojis/1f1ee-1f1f3.png "
}
option {
name = " Tokyo, Japan "
value = " nrt "
icon = " /emojis/1f1ef-1f1f5.png "
}
option {
name = " Chicago, Illinois (US) "
value = " ord "
icon = " /emojis/1f1fa-1f1f8.png "
}
option {
name = " Seattle, Washington (US) "
value = " sea "
icon = " /emojis/1f1fa-1f1f8.png "
}
option {
name = " Singapore "
value = " sin "
icon = " /emojis/1f1f8-1f1ec.png "
}
option {
name = " Sydney, Australia "
value = " syd "
icon = " /emojis/1f1e6-1f1fa.png "
}
option {
name = " Toronto, Canada "
value = " yyz "
icon = " /emojis/1f1e8-1f1e6.png "
}
}
resource " coder_app " " code-server " {
count = 1
agent_id = coder_agent . main . id
2023-04-12 17:05:16 +00:00
display_name = " code-server "
2023-03-17 16:46:44 +00:00
slug = " code-server "
url = " http://localhost:8080?folder=/home/coder/ "
icon = " /icon/code.svg "
subdomain = false
share = " owner "
healthcheck {
url = " http://localhost:8080/healthz "
interval = 3
threshold = 10
}
}
resource " coder_agent " " main " {
arch = data . coder_provisioner . me . arch
os = " linux "
startup_script_timeout = 180
startup_script = < < - EOT
set - e
# Start code-server
code - server - - auth none > / tmp / code - server . log 2 > & 1 &
# Set the hostname to the workspace name
sudo hostname - b " ${ data . coder_workspace . me . name } -fly "
2023-05-18 08:42:04 +00:00
echo " 127.0.0.1 ${ data . coder_workspace . me . name } -fly " | sudo tee - a / etc / hosts
2023-03-19 19:55:11 +00:00
# Install the Fly CLI and add it to the PATH
curl - L https : //fly.io/install.sh | sh
2023-05-18 08:42:04 +00:00
echo " export PATH= $ PATH:/home/coder/.fly/bin " > > / home / coder / . bashrc
source / home / coder / . bashrc
2023-03-17 16:46:44 +00:00
EOT
2023-04-12 17:05:16 +00:00
metadata {
key = " cpu "
display_name = " CPU Usage "
interval = 5
timeout = 5
script = < < - EOT
#!/bin/bash
set - e
top - bn1 | grep " Cpu(s) " | awk ' { print $ 2 + $ 4 " % " } '
EOT
}
metadata {
key = " memory "
display_name = " Memory Usage "
interval = 5
timeout = 5
script = < < - EOT
#!/bin/bash
set - e
free - m | awk ' NR == 2 { printf " %.2f%% \ t " , $ 3 * 100 / $ 2 } '
EOT
}
metadata {
key = " disk "
display_name = " Disk Usage "
interval = 600 # every 10 minutes
timeout = 30 # df can take a while on large filesystems
script = < < - EOT
#!/bin/bash
set - e
2023-05-18 08:42:04 +00:00
df | awk ' $ NF == " /home/coder " { printf " %s " , $ 5 } '
2023-04-12 17:05:16 +00:00
EOT
}
2023-03-17 16:46:44 +00:00
}
2023-03-19 19:55:11 +00:00
resource " coder_metadata " " workspace " {
count = data . coder_workspace . me . start_count
resource_id = fly_app . workspace . id
icon = data . coder_parameter . region . option [ index ( data . coder_parameter . region . option . * . value , data . coder_parameter . region . value ) ] . icon
item {
key = " Region "
value = data . coder_parameter . region . option [ index ( data . coder_parameter . region . option . * . value , data . coder_parameter . region . value ) ] . name
}
item {
key = " CPU Type "
value = data . coder_parameter . cputype . option [ index ( data . coder_parameter . cputype . option . * . value , data . coder_parameter . cputype . value ) ] . name
}
item {
key = " CPU Count "
value = data . coder_parameter . cpu . value
}
item {
key = " Memory (GB) "
value = data . coder_parameter . memory . value
}
item {
key = " Volume Size (GB) "
value = data . coder_parameter . volume - size . value
}
}
2023-03-17 16:46:44 +00:00
data " coder_provisioner " " me " {
}
data " coder_workspace " " me " {
}