@@ -2,7 +2,7 @@ terraform {
2
2
required_providers {
3
3
coder = {
4
4
source = " coder/coder"
5
- version = " 0.6.10 "
5
+ version = " 0.7.0 "
6
6
}
7
7
docker = {
8
8
source = " kreuzwerker/docker"
@@ -11,67 +11,155 @@ terraform {
11
11
}
12
12
}
13
13
14
- # User parameters
15
-
16
- variable "region" {
17
- type = string
18
- description = " Which region to deploy to."
19
- default = " us-pittsburgh"
20
- validation {
21
- condition = contains ([" us-pittsburgh" , " eu-helsinki" , " ap-sydney" ], var. region )
22
- error_message = " Region must be one of us-pittsburg, eu-helsinki, or ap-sydney."
23
- }
24
- }
25
-
26
- variable "dotfiles_uri" {
27
- type = string
28
- description = <<- EOF
29
- Dotfiles repo URI (optional)
30
-
31
- see https://dotfiles.github.io
32
- EOF
33
- default = " "
34
- }
35
-
36
- variable "datocms_api_token" {
37
- type = string
38
- description = " An API token from DATOCMS for usage with building our website."
39
- default = " "
40
- }
41
-
42
14
locals {
43
15
// These are Tailscale IP addresses. Ask Dean or Kyle for help.
44
16
docker_host = {
45
17
" " = " tcp://100.94.74.63:2375"
46
18
" us-pittsburgh" = " tcp://100.94.74.63:2375"
47
19
" eu-helsinki" = " tcp://100.117.102.81:2375"
48
20
" ap-sydney" = " tcp://100.87.194.110:2375"
21
+ " sa-saopaulo" = " tcp://100.99.64.123:2375"
22
+ " eu-paris" = " tcp://100.74.161.61:2375"
49
23
}
50
24
}
51
25
26
+ data "coder_parameter" "repo_dir" {
27
+ type = " string"
28
+ name = " Coder Repository Directory"
29
+ default = " ~/coder"
30
+ description = " The directory specified will be created and [coder/coder](https://github.com/coder/coder) will be automatically cloned into it 🪄."
31
+ mutable = true
32
+ }
33
+
34
+ data "coder_parameter" "dotfiles_url" {
35
+ type = " string"
36
+ name = " Dotfiles URL"
37
+ description = " A path to your dotfiles. See: https://dotfiles.github.io"
38
+ default = " "
39
+ mutable = true
40
+ }
41
+
42
+ data "coder_parameter" "region" {
43
+ type = " string"
44
+ name = " Region"
45
+ icon = " /emojis/1f30e.png"
46
+ option {
47
+ icon = " /emojis/1f1fa-1f1f8.png"
48
+ name = " Pittsburgh"
49
+ value = " us-pittsburgh"
50
+ }
51
+ option {
52
+ icon = " /emojis/1f1eb-1f1ee.png"
53
+ name = " Helsinki"
54
+ value = " eu-helsinki"
55
+ }
56
+ option {
57
+ icon = " /emojis/1f1e6-1f1fa.png"
58
+ name = " Sydney"
59
+ value = " ap-sydney"
60
+ }
61
+ option {
62
+ icon = " /emojis/1f1e7-1f1f7.png"
63
+ name = " São Paulo"
64
+ value = " sa-saopaulo"
65
+ }
66
+ # option {
67
+ # icon = "/emojis/1f1eb-1f1f7.png"
68
+ # name = "Phorcys' Server in Paris"
69
+ # value = "eu-paris"
70
+ # }
71
+ }
72
+
52
73
provider "docker" {
53
- host = lookup (local. docker_host , var . region )
74
+ host = lookup (local. docker_host , data . coder_parameter . region . value )
54
75
}
55
76
56
77
provider "coder" {}
57
78
79
+ data "coder_git_auth" "github" {
80
+ id = " github"
81
+ }
82
+
58
83
data "coder_workspace" "me" {}
59
84
60
85
resource "coder_agent" "dev" {
61
86
arch = " amd64"
62
87
os = " linux"
63
88
64
- login_before_ready = false
89
+ dir = data. coder_parameter . repo_dir . value
90
+ env = {
91
+ GITHUB_TOKEN : data.coder_git_auth.github.access_token,
92
+ OIDC_TOKEN : data.coder_workspace.me.owner_oidc_access_token,
93
+ }
94
+ login_before_ready = false
95
+
96
+ metadata {
97
+ display_name = " CPU Usage"
98
+ key = " cpu"
99
+ script = << EOT
100
+ vmstat | awk 'FNR==3 {printf "%2.0f%%", $13+$14+$16}'
101
+ EOT
102
+ interval = 1
103
+ timeout = 1
104
+ }
105
+
106
+ metadata {
107
+ display_name = " Load Average"
108
+ key = " load"
109
+ script = " awk '{print $1}' /proc/loadavg"
110
+ interval = 1
111
+ timeout = 1
112
+ }
113
+
114
+ metadata {
115
+ display_name = " Disk Usage"
116
+ key = " disk"
117
+ script = " df -h | awk '$6 ~ /^\\ /$/ { print $5 }'"
118
+ interval = 1
119
+ timeout = 1
120
+ }
121
+
122
+ metadata {
123
+ display_name = " Memory Usage"
124
+ key = " mem"
125
+ script = << EOT
126
+ free | awk '/^Mem/ { printf("%.0f%%", $4/$2 * 100.0) }'
127
+ EOT
128
+ interval = 1
129
+ timeout = 1
130
+ }
131
+
132
+
133
+ metadata {
134
+ display_name = " Word of the Day"
135
+ key = " word"
136
+ script = << EOT
137
+ curl -o - --silent https://www.merriam-webster.com/word-of-the-day 2>&1 | awk ' $0 ~ "Word of the Day: [A-z]+" { print $5; exit }'
138
+ EOT
139
+ interval = 60
140
+ timeout = 5
141
+ }
142
+
143
+
65
144
startup_script_timeout = 60
66
145
startup_script = <<- EOT
67
146
set -eux -o pipefail
147
+
68
148
# install and start code-server
69
149
curl -fsSL https://code-server.dev/install.sh | sh -s -- --method=standalone --prefix=/tmp/code-server --version 4.8.3
70
150
/tmp/code-server/bin/code-server --auth none --port 13337 >/tmp/code-server.log 2>&1 &
151
+
152
+
153
+ if [ ! -d ${ data . coder_parameter . repo_dir . value } ]; then
154
+ mkdir -p ${ data . coder_parameter . repo_dir . value }
155
+
156
+ git clone https://github.com/coder/coder ${ data . coder_parameter . repo_dir . value }
157
+ fi
158
+
71
159
sudo service docker start
72
- DOTFILES_URI=${ var . dotfiles_uri }
160
+ DOTFILES_URI=" ${ data . coder_parameter . dotfiles_url . value } "
73
161
rm -f ~/.personalize.log
74
- if [ -n "$DOTFILES_URI" ]; then
162
+ if [ -n "$${ DOTFILES_URI// } " ]; then
75
163
coder dotfiles "$DOTFILES_URI" -y 2>&1 | tee -a ~/.personalize.log
76
164
fi
77
165
if [ -x ~/personalize ]; then
@@ -125,15 +213,6 @@ resource "docker_volume" "home_volume" {
125
213
}
126
214
}
127
215
128
- resource "coder_metadata" "home_info" {
129
- resource_id = docker_volume. home_volume . id
130
- item {
131
- key = " 🤫🤫🤫<br/><br/>"
132
- value = " ❤️❤️❤️"
133
- sensitive = true
134
- }
135
- }
136
-
137
216
locals {
138
217
container_name = " coder-${ data . coder_workspace . me . owner } -${ lower (data. coder_workspace . me . name )} "
139
218
registry_name = " codercom/oss-dogfood"
@@ -157,14 +236,14 @@ resource "docker_container" "workspace" {
157
236
image = docker_image. dogfood . name
158
237
name = local. container_name
159
238
# Hostname makes the shell more user friendly: coder@my-workspace:~$
160
- hostname = data. coder_workspace . me . name
239
+ hostname = data. coder_workspace . me . name
240
+ # Use the docker gateway if the access URL is 127.0.0.1
161
241
entrypoint = [" sh" , " -c" , coder_agent . dev . init_script ]
162
242
# CPU limits are unnecessary since Docker will load balance automatically
163
243
memory = 32768
164
244
runtime = " sysbox-runc"
165
245
env = [
166
246
" CODER_AGENT_TOKEN=${ coder_agent . dev . token } " ,
167
- " DATOCMS_API_TOKEN=${ var . datocms_api_token } " ,
168
247
]
169
248
host {
170
249
host = " host.docker.internal"
0 commit comments