@@ -41,7 +41,7 @@ data "coder_parameter" "location" {
4141 type = " string"
4242 default = " fsn1"
4343 mutable = false
44-
44+
4545 dynamic "option" {
4646 for_each = local. hetzner_config . type_meta . locations
4747 content {
@@ -80,7 +80,7 @@ data "coder_parameter" "server_image" {
8080 default = " ubuntu-22.04"
8181 type = " string"
8282 mutable = false
83-
83+
8484 dynamic "option" {
8585 for_each = local. hetzner_config . type_meta . images
8686 content {
@@ -89,7 +89,7 @@ data "coder_parameter" "server_image" {
8989 icon = option. value . icon
9090 }
9191 }
92-
92+
9393}
9494
9595# Optional custom image override
@@ -125,27 +125,27 @@ data "coder_parameter" "volume_size" {
125125
126126locals {
127127 # Ensure unique names by including workspace ID
128- server_name = " coder-${ lower (data. coder_workspace_owner . me . name )} -${ lower (data. coder_workspace . me . name )} -${ substr (data. coder_workspace . me . id , 0 , 8 )} "
129- volume_name = " coder-${ lower (data. coder_workspace_owner . me . name )} -${ lower (data. coder_workspace . me . name )} -${ substr (data. coder_workspace . me . id , 0 , 8 )} -home"
130- network_name = " coder-${ lower (data. coder_workspace_owner . me . name )} -${ lower (data. coder_workspace . me . name )} -${ substr (data. coder_workspace . me . id , 0 , 8 )} -net"
131- firewall_name = " coder-${ lower (data. coder_workspace_owner . me . name )} -${ lower (data. coder_workspace . me . name )} -${ substr (data. coder_workspace . me . id , 0 , 8 )} -fw"
132-
128+ server_name = " coder-${ lower (data. coder_workspace_owner . me . name )} -${ lower (data. coder_workspace . me . name )} -${ substr (data. coder_workspace . me . id , 0 , 8 )} "
129+ volume_name = " coder-${ lower (data. coder_workspace_owner . me . name )} -${ lower (data. coder_workspace . me . name )} -${ substr (data. coder_workspace . me . id , 0 , 8 )} -home"
130+ network_name = " coder-${ lower (data. coder_workspace_owner . me . name )} -${ lower (data. coder_workspace . me . name )} -${ substr (data. coder_workspace . me . id , 0 , 8 )} -net"
131+ firewall_name = " coder-${ lower (data. coder_workspace_owner . me . name )} -${ lower (data. coder_workspace . me . name )} -${ substr (data. coder_workspace . me . id , 0 , 8 )} -fw"
132+
133133 # Get selected server type and location configuration
134134 selected_server_type = local. hetzner_config . type_meta . server_types [data . coder_parameter . server_type . value ]
135- selected_location = local. hetzner_config . type_meta . locations [data . coder_parameter . location . value ]
136- network_zone = local. selected_location . zone
137-
135+ selected_location = local. hetzner_config . type_meta . locations [data . coder_parameter . location . value ]
136+ network_zone = local. selected_location . zone
137+
138138 # Get availability for selected server type (use specific or wildcard)
139139 server_availability = lookup (local. hetzner_config . availability , data. coder_parameter . server_type . value , local. hetzner_config . availability [" *" ])
140-
140+
141141 # Validate server type is available in selected location
142142 is_valid_combination = contains (local. server_availability , data. coder_parameter . location . value )
143143}
144144
145145# Validation check for server type and location compatibility
146146resource "null_resource" "validate_server_location" {
147147 count = local. is_valid_combination ? 0 : 1
148-
148+
149149 provisioner "local-exec" {
150150 command = " echo 'ERROR: Server type ${ data . coder_parameter . server_type . value } is not available in location ${ data . coder_parameter . location . value } ' && exit 1"
151151 }
@@ -192,11 +192,11 @@ module "code-server" {
192192
193193# See https://registry.coder.com/modules/coder/jetbrains
194194module "jetbrains" {
195- count = data. coder_workspace . me . start_count
196- source = " registry.coder.com/coder/jetbrains/coder"
197- version = " ~> 1.0"
198- agent_id = coder_agent. main . id
199- folder = " /home/coder"
195+ count = data. coder_workspace . me . start_count
196+ source = " registry.coder.com/coder/jetbrains/coder"
197+ version = " ~> 1.0"
198+ agent_id = coder_agent. main . id
199+ folder = " /home/coder"
200200}
201201
202202variable "ssh_key_id" {
@@ -221,7 +221,7 @@ variable "ssh_key_id" {
221221resource "hcloud_network" "workspace" {
222222 name = local. network_name
223223 ip_range = " 10.0.0.0/16"
224-
224+
225225 labels = {
226226 " coder.workspace" = data.coder_workspace.me.name
227227 " coder.owner" = data.coder_workspace_owner.me.name
@@ -240,55 +240,55 @@ resource "hcloud_network_subnet" "workspace" {
240240# Create firewall
241241resource "hcloud_firewall" "workspace" {
242242 name = local. firewall_name
243-
243+
244244 labels = {
245245 " coder.workspace" = data.coder_workspace.me.name
246246 " coder.owner" = data.coder_workspace_owner.me.name
247247 " coder.resource" = " firewall"
248248 }
249-
249+
250250 rule {
251- direction = " in"
252- port = " 22"
253- protocol = " tcp"
251+ direction = " in"
252+ port = " 22"
253+ protocol = " tcp"
254254 source_ips = [" 0.0.0.0/0" , " ::/0" ]
255255 }
256-
256+
257257 rule {
258- direction = " in"
259- port = " 80"
260- protocol = " tcp"
258+ direction = " in"
259+ port = " 80"
260+ protocol = " tcp"
261261 source_ips = [" 0.0.0.0/0" , " ::/0" ]
262262 }
263-
263+
264264 rule {
265- direction = " in"
266- port = " 443"
267- protocol = " tcp"
265+ direction = " in"
266+ port = " 443"
267+ protocol = " tcp"
268268 source_ips = [" 0.0.0.0/0" , " ::/0" ]
269269 }
270-
270+
271271 rule {
272- direction = " in"
273- port = " 8080"
274- protocol = " tcp"
272+ direction = " in"
273+ port = " 8080"
274+ protocol = " tcp"
275275 source_ips = [" 0.0.0.0/0" , " ::/0" ]
276276 }
277277}
278278
279279# Create volume for home directory
280280resource "hcloud_volume" "home_volume" {
281- name = local. volume_name
282- size = data. coder_parameter . volume_size . value
283- location = data. coder_parameter . location . value
284- format = " ext4"
285-
281+ name = local. volume_name
282+ size = data. coder_parameter . volume_size . value
283+ location = data. coder_parameter . location . value
284+ format = " ext4"
285+
286286 labels = {
287287 " coder.workspace" = data.coder_workspace.me.name
288288 " coder.owner" = data.coder_workspace_owner.me.name
289289 " coder.resource" = " home-volume"
290290 }
291-
291+
292292 # Protect the volume from being deleted due to changes in attributes
293293 lifecycle {
294294 ignore_changes = all
@@ -297,42 +297,42 @@ resource "hcloud_volume" "home_volume" {
297297
298298# Create the server
299299resource "hcloud_server" "workspace" {
300- count = data. coder_workspace . me . start_count
301- name = local. server_name
302- server_type = data. coder_parameter . server_type . value
303- image = local. final_image
304- location = data. coder_parameter . location . value
305- ssh_keys = var. ssh_key_id > 0 ? [var . ssh_key_id ] : []
300+ count = data. coder_workspace . me . start_count
301+ name = local. server_name
302+ server_type = data. coder_parameter . server_type . value
303+ image = local. final_image
304+ location = data. coder_parameter . location . value
305+ ssh_keys = var. ssh_key_id > 0 ? [var . ssh_key_id ] : []
306306 firewall_ids = [hcloud_firewall . workspace . id ]
307-
307+
308308 labels = {
309309 " coder.workspace" = data.coder_workspace.me.name
310310 " coder.owner" = data.coder_workspace_owner.me.name
311311 " coder.resource" = " workspace-server"
312312 }
313-
313+
314314 public_net {
315315 ipv4_enabled = true
316316 ipv6_enabled = true
317317 }
318-
318+
319319 network {
320320 network_id = hcloud_network. workspace . id
321321 ip = " 10.0.1.5"
322322 }
323-
323+
324324 user_data = templatefile (" ${ path . module } /cloud-config.yaml.tftpl" , {
325325 hostname = local.server_name
326326 username = lower (data. coder_workspace_owner . me . name )
327327 volume_device = " /dev/sdb"
328328 init_script = base64encode (coder_agent. main . init_script )
329329 coder_agent_token = coder_agent.main.token
330330 })
331-
331+
332332 depends_on = [
333333 hcloud_network_subnet . workspace
334334 ]
335-
335+
336336 # Proper lifecycle: server is destroyed when workspace stops, but volume persists
337337 lifecycle {
338338 ignore_changes = [ssh_keys , user_data ]
@@ -361,7 +361,7 @@ resource "coder_metadata" "workspace_info" {
361361 }
362362 item {
363363 key = " vcpus"
364- value = " ${ local . selected_server_type . vcpus } "
364+ value = local. selected_server_type . vcpus
365365 }
366366 item {
367367 key = " memory"
0 commit comments