From 04eb619279a3550b9b3657c0e599d2adcc1b0aa1 Mon Sep 17 00:00:00 2001 From: Harsh panwar Date: Sat, 12 Jul 2025 15:37:39 +0530 Subject: [PATCH] add Hetzner Cloud Template --- .icons/Hetzner.svg | 5 ++ .../templates/Hetzner-Cloud/README.md | 28 +++++++ .../Harsh9485/templates/Hetzner-Cloud/main.tf | 77 +++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 .icons/Hetzner.svg create mode 100644 registry/Harsh9485/templates/Hetzner-Cloud/README.md create mode 100644 registry/Harsh9485/templates/Hetzner-Cloud/main.tf diff --git a/.icons/Hetzner.svg b/.icons/Hetzner.svg new file mode 100644 index 00000000..74bb87c1 --- /dev/null +++ b/.icons/Hetzner.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/registry/Harsh9485/templates/Hetzner-Cloud/README.md b/registry/Harsh9485/templates/Hetzner-Cloud/README.md new file mode 100644 index 00000000..20e607f9 --- /dev/null +++ b/registry/Harsh9485/templates/Hetzner-Cloud/README.md @@ -0,0 +1,28 @@ +--- +display_name: "Hetzner Cloud Template" +description: "A complete Coder template to provision Hetzner Cloud virtual machines with private networking and attached volumes." +icon: "../../../../.icons/Hetzner.svg" +verified: false +tags: ["hetzner", "cloud", "vm", "infrastructure"] +--- + +# Hetzner Cloud Template + +This template provisions one or more Hetzner Cloud virtual machines with: +- Private network +- Attached volumes +- Coder agent + +It is designed to be used directly by Coder to spin up full workspaces on Hetzner Cloud. + +## Requirements +- Hetzner Cloud account +- Hetzner Cloud API token (can be added via environment variable or Terraform variable) + +## Usage + +To test this template: + +```sh +coder templates push hetzner-cloud -d . +``` \ No newline at end of file diff --git a/registry/Harsh9485/templates/Hetzner-Cloud/main.tf b/registry/Harsh9485/templates/Hetzner-Cloud/main.tf new file mode 100644 index 00000000..1f2a8941 --- /dev/null +++ b/registry/Harsh9485/templates/Hetzner-Cloud/main.tf @@ -0,0 +1,77 @@ +terraform { + required_version = ">= 1.0" + + required_providers { + coder = { + source = "coder/coder" + version = ">= 2.5" + } + hcloud = { + source = "hetznercloud/hcloud" + version = ">= 1.50" + } + } +} + +provider "hcloud" { + token = var.hcloud_token +} + +data "coder_workspace" "me" {} + +data "coder_workspace_owner" "me" {} + +resource "hcloud_network" "private" { + name = "workspace-net-${data.coder_workspace.me.id}" + ip_range = var.network_cidr +} + +resource "hcloud_network_subnet" "private" { + network_id = hcloud_network.private.id + type = "server" + network_zone = var.location + ip_range = var.network_cidr +} + +resource "hcloud_server" "dev" { + count = var.instances + name = "dev-${count.index}-${data.coder_workspace.me.id}" + image = var.image + server_type = var.server_type + location = var.location + ssh_keys = [] + + user_data = <<-EOT + #!/bin/bash + curl -fsSL https://get.coder.com -o coder.sh + bash coder.sh + EOT +} + +resource "hcloud_volume" "dev_data" { + count = var.instances + name = "volume-${count.index}-${data.coder_workspace.me.id}" + size = var.volume_size + server_id = hcloud_server.dev[count.index].id +} + +resource "hcloud_server_network" "connect" { + count = var.instances + server_id = hcloud_server.dev[count.index].id + network_id = hcloud_network.private.id + ip = cidrhost(var.network_cidr, count.index + 10) +} + +resource "coder_agent" "main" { + os = "linux" + arch = "amd64" + startup_script = <<-EOT + echo "Coder agent started on Hetzner VM" + EOT +} + +module "code-server" { + source = "registry.coder.com/coder/code-server/coder" + version = "~> 1.0" + agent_id = coder_agent.main.id +} \ No newline at end of file