From 1ce0fb8a36b9d62fbf6e8a6a703d580270d379e1 Mon Sep 17 00:00:00 2001 From: Jim Martens Date: Sat, 7 Feb 2026 16:57:04 +0100 Subject: [PATCH] change: Add further DNS records to terraform feat: Support MX-only domains feat: Support Uberspace domain key --- terraform/imports.tf | 82 ++++++++++++++++++--------- terraform/modules/domain/main.tf | 17 ++++++ terraform/modules/domain/variables.tf | 19 ++++++- terraform/nameserver-records.tf | 15 +++++ terraform/uberspace.tf | 45 ++++++++++++--- 5 files changed, 140 insertions(+), 38 deletions(-) diff --git a/terraform/imports.tf b/terraform/imports.tf index 94a20f1..04b27e9 100644 --- a/terraform/imports.tf +++ b/terraform/imports.tf @@ -1,74 +1,104 @@ import { - to = hcloud_zone.twomartens_de - id = "2martens.de" -} - -import { - to = module.keycloak_domain.hcloud_zone_rrset.a + to = module.keycloak_domain.hcloud_zone_rrset.a[0] id = "2martens.de/id/A" } import { - to = module.keycloak_domain.hcloud_zone_rrset.aaaa + to = module.keycloak_domain.hcloud_zone_rrset.aaaa[0] id = "2martens.de/id/AAAA" } import { - to = module.keycloak_domain.hcloud_zone_rrset.mx[0] - id = "2martens.de/id/MX" + to = module.keycloak_domain.hcloud_zone_rrset.uberspace_domain_key[0] + id = "2martens.de/uberspace._domainkey.id/TXT" } import { - to = module.keycloak_domain.hcloud_zone_rrset.txt[0] - id = "2martens.de/id/TXT" -} - -import { - to = module.gitea_domain.hcloud_zone_rrset.a + to = module.gitea_domain.hcloud_zone_rrset.a[0] id = "2martens.de/git/A" } import { - to = module.gitea_domain.hcloud_zone_rrset.aaaa + to = module.gitea_domain.hcloud_zone_rrset.aaaa[0] id = "2martens.de/git/AAAA" } import { - to = module.helm-repo_domain.hcloud_zone_rrset.a + to = module.helm-repo_domain.hcloud_zone_rrset.a[0] id = "2martens.de/repo/A" } import { - to = module.helm-repo_domain.hcloud_zone_rrset.aaaa + to = module.helm-repo_domain.hcloud_zone_rrset.aaaa[0] id = "2martens.de/repo/AAAA" } import { - to = module.statping_domain.hcloud_zone_rrset.a + to = module.statping_domain.hcloud_zone_rrset.a[0] id = "2martens.de/status/A" } import { - to = module.statping_domain.hcloud_zone_rrset.aaaa + to = module.statping_domain.hcloud_zone_rrset.aaaa[0] id = "2martens.de/status/AAAA" } import { - to = module.personal_website_domain.hcloud_zone_rrset.a + to = module.personal_website_domain.hcloud_zone_rrset.a[0] id = "2martens.de/@/A" } import { - to = module.personal_website_domain.hcloud_zone_rrset.aaaa + to = module.personal_website_domain.hcloud_zone_rrset.aaaa[0] id = "2martens.de/@/AAAA" } import { - to = module.personal_website_domain.hcloud_zone_rrset.mx[0] - id = "2martens.de/@/MX" + to = module.personal_website_domain.hcloud_zone_rrset.uberspace_domain_key[0] + id = "2martens.de/uberspace._domainkey/TXT" } import { - to = module.personal_website_domain.hcloud_zone_rrset.txt[0] - id = "2martens.de/@/TXT" + to = module.medium_domain.hcloud_zone_rrset.a[0] + id = "2martens.de/medium/A" +} + +import { + to = module.medium_domain.hcloud_zone_rrset.aaaa[0] + id = "2martens.de/medium/AAAA" +} + +import { + to = module.appreview_domain.hcloud_zone_rrset.mx[0] + id = "2martens.de/appreview/MX" +} + +import { + to = module.appreview_domain.hcloud_zone_rrset.txt[0] + id = "2martens.de/appreview/TXT" +} + +import { + to = module.appreview_domain.hcloud_zone_rrset.uberspace_domain_key[0] + id = "2martens.de/uberspace._domainkey.appreview/TXT" +} + +import { + to = module.cms_domain.hcloud_zone_rrset.a[0] + id = "2martens.de/cms/A" +} + +import { + to = module.cms_domain.hcloud_zone_rrset.aaaa[0] + id = "2martens.de/cms/AAAA" +} + +import { + to = module.nas_domain.hcloud_zone_rrset.a[0] + id = "2martens.de/nas/A" +} + +import { + to = module.nas_domain.hcloud_zone_rrset.aaaa[0] + id = "2martens.de/nas/AAAA" } \ No newline at end of file diff --git a/terraform/modules/domain/main.tf b/terraform/modules/domain/main.tf index 660131a..9088cb4 100644 --- a/terraform/modules/domain/main.tf +++ b/terraform/modules/domain/main.tf @@ -1,4 +1,6 @@ resource "hcloud_zone_rrset" "a" { + count = var.hasIPRecords ? 1 : 0 + zone = var.domain name = var.subdomain != "" ? var.subdomain : "@" type = "A" @@ -10,6 +12,8 @@ resource "hcloud_zone_rrset" "a" { } resource "hcloud_zone_rrset" "aaaa" { + count = var.hasIPRecords ? 1 : 0 + zone = var.domain name = var.subdomain != "" ? var.subdomain : "@" type = "AAAA" @@ -46,3 +50,16 @@ resource "hcloud_zone_rrset" "txt" { { value = provider::hcloud::txt_record(txtValue) } ] } + +resource "hcloud_zone_rrset" "uberspace_domain_key" { + count = var.uberspaceDomainKey != "" ? 1 : 0 + + zone = var.domain + name = var.subdomain != "" ? format("%s.%s", "uberspace._domainkey", var.subdomain) : "uberspace._domainkey" + type = "TXT" + ttl = 3600 + + records = [ + { value = provider::hcloud::txt_record(var.uberspaceDomainKey) } + ] +} \ No newline at end of file diff --git a/terraform/modules/domain/variables.tf b/terraform/modules/domain/variables.tf index 9d786bf..0b0d3d2 100644 --- a/terraform/modules/domain/variables.tf +++ b/terraform/modules/domain/variables.tf @@ -1,9 +1,11 @@ variable "ipv4" { - type = string + type = string + default = "" } variable "ipv6" { - type = string + type = string + default = "" } variable "domain" { @@ -11,7 +13,8 @@ variable "domain" { } variable "subdomain" { - type = string + type = string + default = "" } variable "hasMXRecord" { @@ -19,6 +22,11 @@ variable "hasMXRecord" { default = false } +variable "hasIPRecords" { + type = bool + default = true +} + variable "hostName" { type = string default = "" @@ -33,3 +41,8 @@ variable "txtValues" { type = list(string) default = [] } + +variable "uberspaceDomainKey" { + type = string + default = "" +} diff --git a/terraform/nameserver-records.tf b/terraform/nameserver-records.tf index fb4870c..ddf0343 100644 --- a/terraform/nameserver-records.tf +++ b/terraform/nameserver-records.tf @@ -7,3 +7,18 @@ resource "hcloud_zone" "twomartens_de" { delete_protection = true } +module "medium_domain" { + source = "./modules/domain" + domain = hcloud_zone.twomartens_de.name + subdomain = "medium" + ipv4 = "162.159.153.4" + ipv6 = "2606:4700:7::a29f:9804" +} + +module "nas_domain" { + source = "./modules/domain" + domain = hcloud_zone.twomartens_de.name + subdomain = "nas" + ipv4 = "31.19.63.181" + ipv6 = "2a02:8108:c19:c400:9209:d0ff:fe70:7570" +} \ No newline at end of file diff --git a/terraform/uberspace.tf b/terraform/uberspace.tf index b6d9080..e0587e9 100644 --- a/terraform/uberspace.tf +++ b/terraform/uberspace.tf @@ -1,14 +1,15 @@ // Identity management module "keycloak_domain" { - source = "./modules/domain" - domain = hcloud_zone.twomartens_de.name - subdomain = "id" - ipv4 = "95.143.172.184" - ipv6 = "2001:1a50:11:0:98b3:92ff:fe3e:bba1" - hasMXRecord = true - hostName = "monoceres.uberspace.de" - mxPrio = 0 - txtValues = ["v=spf1 include:spf.uberspace.de ~all"] + source = "./modules/domain" + domain = hcloud_zone.twomartens_de.name + subdomain = "id" + ipv4 = "95.143.172.184" + ipv6 = "2001:1a50:11:0:98b3:92ff:fe3e:bba1" + hasMXRecord = true + hostName = "monoceres.uberspace.de" + mxPrio = 0 + txtValues = ["v=spf1 include:spf.uberspace.de ~all"] + uberspaceDomainKey = "v=DKIM1;t=s;n=core;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqs3bFL8W77z7VJHCFbsJ3o68Y1uBbVsbIS1y35CMfRv6wp7si7aIG2ZeKqzdh2dTMsvtvSMaYVq1gT/EtRmTbU/BYC21ff8sqcVqn/ll5nNsk5jKWXTYAlTQp4LBQN7icw94ZNGr5/SDYcnv2nsBYFf2GUviObWXGHX4RaBFNj9NVUNWNin/HicvW+LsbfYq37QtlhjmUn9K96VCwKcTV1mx+Ek0osErYefcOVNawqWIlVRQDLkHZhk1StLsOpRqV+qEjhzTk4n4ZiNtLJG1D9CpHl24d5DKsQDyVFdEfqHimFTSNgiitlkuXg+i+NMiRA9G3gNJtvw8uvfN8f+stQIDAQAB" } // Angular frontends @@ -61,6 +62,7 @@ module "personal_website_domain" { "google-site-verification=nUFiHQFxBpBMdX96ELH3TcfyIfXf2ZlwMFYtXjVq5lo", "v=spf1 include:spf.uberspace.de ~all" ] + uberspaceDomainKey = "v=DKIM1;t=s;n=core;p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA3inJYRQRdWD0NQf9WRVcct8Z+GF74WYCK9Q9E/hl9qRSrqHLbm4AZ8gDWZDUQ7O0WbsQ4wcBa2SLB0znpW2UmVrp0iMhqGXVU5USWTHLgAPOVo9DKKbY5wCuugftQe99hvW1Z5BNhzvGUczknQHW/oZF/a7l1nwkYuAZ9YyzQY+sB8o3euuZ0QxaVde0UNDMGpjUO/Nd8MRZj1WBNNyy12ppKVskg7GzuVpulkskslM/mAWdTJ7HKZh1HHPjjGS2ttyDMGWU7/sxuenZ5Z46PvKWQ37djwEsXqXuqYrLI+QBoefolhisHNhHA9cwuUU3bq/+zXhLTN4bYZVPeV31mM6cguKJibPXg0HgYUImJ0A/sADYcd4q7ryZ/sAzCydPT4FDrx64apRPlaIhugSU1KCz+N+7UtCjrQaJLA8i/F4+krfZpfiYr5MJrI8jTAZFW9lzGL7NTVLe1yDf/9aJGc7R/TyI/c5uGFGUnu0C+AKC5KJCIf/I2hJ9ARRRzKe1RtmiTJMAxi8FqzRQoEQwfSDi+vGXtrUC4JCV2Zh7xgwmZV+lMiP5M6x3aOM7FI26WPx+7tdRlzWiYu7okS5ayAgu26EYoKjGuWWHGUuKSKNqjTy3oBunZv3LzdnhOAn4eOrE7+2qn8hiL8SLa9oGcUv1BI0KQmopIAY+BiaX6JkCAwEAAQ==" } // Nextcloud @@ -75,3 +77,28 @@ module "personal_website_domain" { # mxPrio = 0 # mxSpf = "v=spf1 include:spf.uberspace.de ~all" # } + +// App Review (Mail only) +module "appreview_domain" { + source = "./modules/domain" + domain = hcloud_zone.twomartens_de.name + subdomain = "appreview" + + hasIPRecords = false + hasMXRecord = true + hostName = "wolf.uberspace.de" + mxPrio = 0 + txtValues = [ + "v=spf1 include:spf.uberspace.de ~all" + ] + uberspaceDomainKey = "v=DKIM1;t=s;n=core;p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuzbMYDHwmAtKti6DFFZu7ySxbWE87XgA14OPck78rj4QX3cNFdnn+WkUpmp0x76NN1rhm3EKCcbBUs9I6MvFQU7A9QJFpMoGq+u7OJ63SSDSmnzUld0mKnWbj/gNp1r4ChQB5JSFIT2A6Q3ias6IM1DscBqfsGsp6StbWaIiBF7Mro7p64sHX4kUgW1iBtNiix0GHqi6imzAryOiGg+X3GhjhwV0j+15rBeBSaFOX2TudlE5VHLox59TLb8ctfdir3kT7UFWJT2GW1iWgUxaTxU6OsSLe2vuQcXIYFBcTN2lbw/dXp7LdBPFzXygC9LZsjxao2bxwAs5MpCLpMrFZVbCEDSO9fEiSsGqgBcwiyxG0DnHexGbKMpr2Ergt+Q9NhfzUjcfNzGvG0HaPEIM70J+yK8gi4mGT7hTRjAFL9+8hGW8qjvna89WAu/ACKSGw3sKIqtevO4Cpc2FMZ1v0FmW7eshe++qfe7lodCmUeaZnQD9H6iR+Q4UJm4QBjIB3uz6ZiXMSZdhfc14T493o14V0j/IAu/OngeZM4O24XR8xCj0NvNAObh6OlKKEIv0fyPlauhQnz573K8fhsPeAFxNnc5lDRTRL96FJFIy3tefDJVHFr5yaFzxQPtaf17mBIaLqKOj42YkZmgcd7+1kN/G8HvrhzsCuz+Zr6z12rcCAwEAAQ==" +} + +// Payload CMS +module "cms_domain" { + source = "./modules/domain" + domain = hcloud_zone.twomartens_de.name + subdomain = "cms" + ipv4 = "95.143.172.212" + ipv6 = "2001:1a50:11:0:247a:8ff:fe00:5f6c" +} \ No newline at end of file