{"id":16103972,"url":"https://github.com/deyaeddin/terraform-hcloud-k3s-ext","last_synced_at":"2025-03-17T17:31:32.753Z","repository":{"id":122984735,"uuid":"367538329","full_name":"deyaeddin/terraform-hcloud-k3s-ext","owner":"deyaeddin","description":"Terraform module to install K3S on Hetzner cloud servers with battery included. Cert-Manger, External-DNS, Nginx-ingress-controller, Minio, Octant Dashboard ...etc ","archived":false,"fork":false,"pushed_at":"2024-06-22T12:54:36.000Z","size":148,"stargazers_count":14,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-02-28T02:34:27.730Z","etag":null,"topics":["hetzner","terraform-module"],"latest_commit_sha":null,"homepage":"https://registry.terraform.io/modules/deyaeddin/k3s-ext/hcloud/latest","language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deyaeddin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-05-15T04:23:58.000Z","updated_at":"2025-02-02T13:56:51.000Z","dependencies_parsed_at":"2024-06-22T21:25:33.310Z","dependency_job_id":null,"html_url":"https://github.com/deyaeddin/terraform-hcloud-k3s-ext","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deyaeddin%2Fterraform-hcloud-k3s-ext","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deyaeddin%2Fterraform-hcloud-k3s-ext/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deyaeddin%2Fterraform-hcloud-k3s-ext/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deyaeddin%2Fterraform-hcloud-k3s-ext/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deyaeddin","download_url":"https://codeload.github.com/deyaeddin/terraform-hcloud-k3s-ext/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243875011,"owners_count":20361930,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hetzner","terraform-module"],"created_at":"2024-10-09T18:59:17.686Z","updated_at":"2025-03-17T17:31:32.434Z","avatar_url":"https://github.com/deyaeddin.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Kubernetes K3S Terraform Module\nThis module is inspired by [cicdteam/terraform-hcloud-k3s](https://github.com/cicdteam/terraform-hcloud-k3s) with extra applications ready to be installed with ``` make apply```. All Applications are using HELM charts, and highly customizable.\n\nUse [Hetzner Cloud link](https://hetzner.cloud/?ref=6PAAEo0epOOA) to get €20  \n\n## List of Applications:\n - [cert-manager](https://cert-manager.io/): 3 ways to choice for issuing certificates [HTTP01, DNS01_CLOUDFLARE, [DNS01_HETZNER](https://github.com/deyaeddin/cert-manager-webhook-hetzner)]\n - [default-backend](https://github.com/bitnami/charts/tree/master/bitnami/nginx): default bitnami-nginx chart\n - [external-dns](https://github.com/bitnami/charts/tree/master/bitnami/external-dns):  external-dns chart with ability to chose between \"hetzner or cloudflare\"\n - [nginx-ingress-controller](https://github.com/bitnami/charts/tree/master/bitnami/nginx-ingress-controller): default bitnami-nginx-ingress-controller chart, with annotations:\n   - load-balancer.hetzner.cloud/name: ${lb_name}\n   - load-balancer.hetzner.cloud/location: ${lb_location}\n   - load-balancer.hetzner.cloud/use-private-ip: \"true\"\n   - load-balancer.hetzner.cloud/disable-private-ingress: \"true\"\n   - load-balancer.hetzner.cloud/ipv6-disabled: \"true\"\n   - load-balancer.hetzner.cloud/protocol: ${lb_protocol}\n\n\n***refer to [Inputs](#Inputs) for more options***\n\n\n## Example\n```terraform\nmodule \"k3s-ext\" {\n   source                       = \"deyaeddin/k3s-ext/hcloud\"\n   version                      = \"0.0.1\"\n   cloud_flare_api_email        = \"\u003cCloudflare primary email :: leave empty if you are using Hetzner\u003e\"\n   cloud_flare_api_key          = \"\u003cCloudflare api key :: leave empty if you are using Hetzner\u003e\"\n   cloud_flare_api_token        = \"\u003cCloudflare api token :: leave empty if you are using Hetzner\u003e\"\n   default_domain               = \"example.com\"\n   hcloud_dns_api_token         = \"\u003chetzner DNS api token :: leave empty if you are using Cloudflare\u003e\"\n   hcloud_masters_extra_scripts = []\n   hcloud_node_extra_scripts    = []\n   hcloud_token                 = \"\u003cHetzner Cloud api token\u003e\"\n   issuer_email                 = \"deya@yanax.com\"\n   enable_apps                  = true\n\n   //optional\n   k3s_version                  = \"v1.21.1+k3s1\" //\"v1.19.11+k3s1\" \"v1.20.7+k3s1\" \"v1.21.1+k3s1\"\n   master_groups_type           = \"cx21\"         # 2 vCPU, 4 GB RAM, 40 GB Disk space\n   master_groups_count          = 3              // Odd number for HA enabled\n   node_groups = {                               // NOTE: pass emtpy map to use a single master\n      \"cx21\" = 4\n      \"cpx11\" = 2\n   }\n}\n```\n\n## Requirements to init/plan/apply\nRequired libraries to be installed before running the module:\n - [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)\n - [helm](https://helm.sh/docs/intro/install/)\n - [terraform](https://learn.hashicorp.com/tutorials/terraform/install-cli)\n - [jq](https://stedolan.github.io/jq/download/) \n - [graphviz](https://graphviz.org/download/) (optional)\n - [terraform-docs](https://github.com/terraform-docs/terraform-docs) (optional)\n - [shellspec](https://shellspec.info/) (optional)\n\n## Requirements\n\n| Name | Version |\n|------|---------|\n| \u003ca name=\"requirement_terraform\"\u003e\u003c/a\u003e [terraform](#requirement\\_terraform) | \u003e= 1.8.0 |\n| \u003ca name=\"requirement_hcloud\"\u003e\u003c/a\u003e [hcloud](#requirement\\_hcloud) | \u003e= 1.47.0 |\n| \u003ca name=\"requirement_helm\"\u003e\u003c/a\u003e [helm](#requirement\\_helm) | \u003e= 2.14.0 |\n| \u003ca name=\"requirement_kubernetes\"\u003e\u003c/a\u003e [kubernetes](#requirement\\_kubernetes) | \u003e= 2.2.0 |\n| \u003ca name=\"requirement_local\"\u003e\u003c/a\u003e [local](#requirement\\_local) | \u003e= 2.5.1 |\n| \u003ca name=\"requirement_null\"\u003e\u003c/a\u003e [null](#requirement\\_null) | \u003e= 3.2.2 |\n| \u003ca name=\"requirement_random\"\u003e\u003c/a\u003e [random](#requirement\\_random) | \u003e= 3.6.2 |\n\n## Providers\n\n| Name | Version |\n|------|---------|\n| \u003ca name=\"provider_hcloud\"\u003e\u003c/a\u003e [hcloud](#provider\\_hcloud) | \u003e= 1.47.0 |\n\n## Modules\n\n| Name | Source | Version |\n|------|--------|---------|\n| \u003ca name=\"module_apps\"\u003e\u003c/a\u003e [apps](#module\\_apps) | ./modules/apps | n/a |\n| \u003ca name=\"module_hcloud\"\u003e\u003c/a\u003e [hcloud](#module\\_hcloud) | ./modules/hcloud | n/a |\n\n## Resources\n\n| Name | Type |\n|------|------|\n| [hcloud_ssh_key.default](https://registry.terraform.io/providers/hetznercloud/hcloud/latest/docs/resources/ssh_key) | resource |\n\n## Inputs\n\n| Name | Description | Type | Default | Required |\n|------|-------------|------|---------|:--------:|\n| \u003ca name=\"input_cert_manager_solver_type\"\u003e\u003c/a\u003e [cert\\_manager\\_solver\\_type](#input\\_cert\\_manager\\_solver\\_type) | which solver cert-manger will use, values : HTTP01, DNS01\\_CLOUDFLARE, DNS01\\_HETZNER | `string` | `\"HTTP01\"` | no |\n| \u003ca name=\"input_cloud_flare_api_email\"\u003e\u003c/a\u003e [cloud\\_flare\\_api\\_email](#input\\_cloud\\_flare\\_api\\_email) | Cloudflare primary email (login email) | `any` | n/a | yes |\n| \u003ca name=\"input_cloud_flare_api_key\"\u003e\u003c/a\u003e [cloud\\_flare\\_api\\_key](#input\\_cloud\\_flare\\_api\\_key) | Cloudflare api key.  Ref: https://dash.cloudflare.com/profile/api-tokens | `any` | n/a | yes |\n| \u003ca name=\"input_cloud_flare_api_proxied\"\u003e\u003c/a\u003e [cloud\\_flare\\_api\\_proxied](#input\\_cloud\\_flare\\_api\\_proxied) | wither the zone will be proxied on cloudflare | `bool` | `false` | no |\n| \u003ca name=\"input_cloud_flare_api_token\"\u003e\u003c/a\u003e [cloud\\_flare\\_api\\_token](#input\\_cloud\\_flare\\_api\\_token) | Cloudflare api token. Ref: https://dash.cloudflare.com/profile/api-tokens | `any` | n/a | yes |\n| \u003ca name=\"input_cluster_issuer_name\"\u003e\u003c/a\u003e [cluster\\_issuer\\_name](#input\\_cluster\\_issuer\\_name) | name for cert-manager cluster issuer | `string` | `\"letsencrypt\"` | no |\n| \u003ca name=\"input_cluster_name\"\u003e\u003c/a\u003e [cluster\\_name](#input\\_cluster\\_name) | Cluster name (prefix for all resource names) | `string` | `\"my-cluster\"` | no |\n| \u003ca name=\"input_default_backend_image_digest\"\u003e\u003c/a\u003e [default\\_backend\\_image\\_digest](#input\\_default\\_backend\\_image\\_digest) | default backend image digest | `string` | `\"\"` | no |\n| \u003ca name=\"input_default_backend_image_registry\"\u003e\u003c/a\u003e [default\\_backend\\_image\\_registry](#input\\_default\\_backend\\_image\\_registry) | default backend image registry | `string` | `\"docker.io\"` | no |\n| \u003ca name=\"input_default_backend_image_repository\"\u003e\u003c/a\u003e [default\\_backend\\_image\\_repository](#input\\_default\\_backend\\_image\\_repository) | default backend image repository e.g. bitnami/nginx | `string` | `\"bitnami/nginx\"` | no |\n| \u003ca name=\"input_default_backend_image_tag\"\u003e\u003c/a\u003e [default\\_backend\\_image\\_tag](#input\\_default\\_backend\\_image\\_tag) | default backend image tag e.g. 1.27.0-debian-12-r1 | `string` | `\"1.27.0-debian-12-r1\"` | no |\n| \u003ca name=\"input_default_domain\"\u003e\u003c/a\u003e [default\\_domain](#input\\_default\\_domain) | root domain for ingress default service | `any` | n/a | yes |\n| \u003ca name=\"input_default_namespace\"\u003e\u003c/a\u003e [default\\_namespace](#input\\_default\\_namespace) | default applications namespace | `string` | `\"apps\"` | no |\n| \u003ca name=\"input_dns_provider\"\u003e\u003c/a\u003e [dns\\_provider](#input\\_dns\\_provider) | DNS provider to use. Values can be hetzner or cloudflare | `string` | `\"hetzner\"` | no |\n| \u003ca name=\"input_enable_apps\"\u003e\u003c/a\u003e [enable\\_apps](#input\\_enable\\_apps) | wither to enable deploying cert-manager, nginx-ingress-controller ...etc | `bool` | `false` | no |\n| \u003ca name=\"input_hcloud_datacenter\"\u003e\u003c/a\u003e [hcloud\\_datacenter](#input\\_hcloud\\_datacenter) | Hetzner datacenter where resources resides, hel1-dc2 (Helsinki 1 DC 2) or fsn1-dc14 (Falkenstein 1 DC14) | `string` | `\"hel1-dc2\"` | no |\n| \u003ca name=\"input_hcloud_dns_api_token\"\u003e\u003c/a\u003e [hcloud\\_dns\\_api\\_token](#input\\_hcloud\\_dns\\_api\\_token) | hashed Hetzner DNS access token | `any` | n/a | yes |\n| \u003ca name=\"input_hcloud_masters_extra_scripts\"\u003e\u003c/a\u003e [hcloud\\_masters\\_extra\\_scripts](#input\\_hcloud\\_masters\\_extra\\_scripts) | Additional list of commands to be added to initial master server creation | `list(string)` | n/a | yes |\n| \u003ca name=\"input_hcloud_network_ip_range\"\u003e\u003c/a\u003e [hcloud\\_network\\_ip\\_range](#input\\_hcloud\\_network\\_ip\\_range) | ip\\_range of the main network | `string` | `\"10.0.0.0/8\"` | no |\n| \u003ca name=\"input_hcloud_network_subnet_ip_range\"\u003e\u003c/a\u003e [hcloud\\_network\\_subnet\\_ip\\_range](#input\\_hcloud\\_network\\_subnet\\_ip\\_range) | ip\\_range of the subnetwork | `string` | `\"10.0.0.0/16\"` | no |\n| \u003ca name=\"input_hcloud_network_subnet_type\"\u003e\u003c/a\u003e [hcloud\\_network\\_subnet\\_type](#input\\_hcloud\\_network\\_subnet\\_type) | subnet type | `string` | `\"cloud\"` | no |\n| \u003ca name=\"input_hcloud_network_subnet_zone\"\u003e\u003c/a\u003e [hcloud\\_network\\_subnet\\_zone](#input\\_hcloud\\_network\\_subnet\\_zone) | Subnet Zon | `string` | `\"eu-central\"` | no |\n| \u003ca name=\"input_hcloud_node_extra_scripts\"\u003e\u003c/a\u003e [hcloud\\_node\\_extra\\_scripts](#input\\_hcloud\\_node\\_extra\\_scripts) | Additional list of commands to be added to initial node server creation | `list(string)` | n/a | yes |\n| \u003ca name=\"input_hcloud_token\"\u003e\u003c/a\u003e [hcloud\\_token](#input\\_hcloud\\_token) | Hetzner cloud auth token | `any` | n/a | yes |\n| \u003ca name=\"input_image\"\u003e\u003c/a\u003e [image](#input\\_image) | Node boot image | `string` | `\"ubuntu-24.04\"` | no |\n| \u003ca name=\"input_issuer_email\"\u003e\u003c/a\u003e [issuer\\_email](#input\\_issuer\\_email) | email for issuing certificates with LetsEncrypt | `any` | n/a | yes |\n| \u003ca name=\"input_k3s_channel\"\u003e\u003c/a\u003e [k3s\\_channel](#input\\_k3s\\_channel) | k3s channel (stable, latest, v1.19 and so on) | `string` | `\"latest\"` | no |\n| \u003ca name=\"input_k3s_config_file\"\u003e\u003c/a\u003e [k3s\\_config\\_file](#input\\_k3s\\_config\\_file) | String path to config file | `string` | `\"~/.kubeconfig/hetzner.config\"` | no |\n| \u003ca name=\"input_k3s_version\"\u003e\u003c/a\u003e [k3s\\_version](#input\\_k3s\\_version) | k3s version (v1.21.0+k3s1, v1.19.10+k3s1 and so on) | `string` | `\"v1.30.1+k3s1\"` | no |\n| \u003ca name=\"input_lb_hcloud_location\"\u003e\u003c/a\u003e [lb\\_hcloud\\_location](#input\\_lb\\_hcloud\\_location) | location of the loadbalancer | `string` | `\"hel1\"` | no |\n| \u003ca name=\"input_lb_hcloud_name\"\u003e\u003c/a\u003e [lb\\_hcloud\\_name](#input\\_lb\\_hcloud\\_name) | name of the loadbalancer | `string` | `\"name_cluster_lb\"` | no |\n| \u003ca name=\"input_lb_hcloud_protocol\"\u003e\u003c/a\u003e [lb\\_hcloud\\_protocol](#input\\_lb\\_hcloud\\_protocol) | protocol for the loadbalancer | `string` | `\"tcp\"` | no |\n| \u003ca name=\"input_letsencrypt_is_prod\"\u003e\u003c/a\u003e [letsencrypt\\_is\\_prod](#input\\_letsencrypt\\_is\\_prod) | wither to utilize the staging or production for Letsencrypt certificates issuing | `bool` | `false` | no |\n| \u003ca name=\"input_master_groups_count\"\u003e\u003c/a\u003e [master\\_groups\\_count](#input\\_master\\_groups\\_count) | Number of control plane nodes. | `number` | `1` | no |\n| \u003ca name=\"input_master_groups_type\"\u003e\u003c/a\u003e [master\\_groups\\_type](#input\\_master\\_groups\\_type) | Node type (size) | `string` | `\"cx22\"` | no |\n| \u003ca name=\"input_nginx_default_backend\"\u003e\u003c/a\u003e [nginx\\_default\\_backend](#input\\_nginx\\_default\\_backend) | nginx ingress controller default backend service name | `string` | `\"default-backend\"` | no |\n| \u003ca name=\"input_node_groups\"\u003e\u003c/a\u003e [node\\_groups](#input\\_node\\_groups) | Map of worker node groups, key is server\\_type, value is count of nodes in group. NOTE: pass emtpy map to use a single master | `map(string)` | \u003cpre\u003e{\u003cbr\u003e  \"cx22\": 2,\u003cbr\u003e  \"cx32\": 1\u003cbr\u003e}\u003c/pre\u003e | no |\n| \u003ca name=\"input_private_key_path\"\u003e\u003c/a\u003e [private\\_key\\_path](#input\\_private\\_key\\_path) | string path to private key which will be used to access all the servers including the nodes | `string` | `\"~/.ssh/id_rsa\"` | no |\n| \u003ca name=\"input_public_key_path\"\u003e\u003c/a\u003e [public\\_key\\_path](#input\\_public\\_key\\_path) | string path to public key which will be used to access all the servers including the nodes | `string` | `\"~/.ssh/id_rsa.pub\"` | no |\n| \u003ca name=\"input_storage_class\"\u003e\u003c/a\u003e [storage\\_class](#input\\_storage\\_class) | storage class to use with minio drivers | `string` | `\"hcloud-volumes\"` | no |\n\n## Outputs\n\n| Name | Description |\n|------|-------------|\n| \u003ca name=\"output_master_internal_ipv4\"\u003e\u003c/a\u003e [master\\_internal\\_ipv4](#output\\_master\\_internal\\_ipv4) | Private IP Address of the master node |\n| \u003ca name=\"output_master_ipv4\"\u003e\u003c/a\u003e [master\\_ipv4](#output\\_master\\_ipv4) | Public IP Address of the master node |\n| \u003ca name=\"output_master_nodes_internal_ipv4\"\u003e\u003c/a\u003e [master\\_nodes\\_internal\\_ipv4](#output\\_master\\_nodes\\_internal\\_ipv4) | Public IP Address of the master nodes in groups |\n| \u003ca name=\"output_master_nodes_ipv4\"\u003e\u003c/a\u003e [master\\_nodes\\_ipv4](#output\\_master\\_nodes\\_ipv4) | Public IP Address of the master nodes in groups |\n| \u003ca name=\"output_nodes_ipv4\"\u003e\u003c/a\u003e [nodes\\_ipv4](#output\\_nodes\\_ipv4) | Public IP Address of the worker nodes in groups |","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeyaeddin%2Fterraform-hcloud-k3s-ext","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeyaeddin%2Fterraform-hcloud-k3s-ext","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeyaeddin%2Fterraform-hcloud-k3s-ext/lists"}