diff --git a/modules/swarm/cwtv-web/main.tf b/modules/swarm/cwtv-web/main.tf new file mode 100644 index 0000000..21498eb --- /dev/null +++ b/modules/swarm/cwtv-web/main.tf @@ -0,0 +1,82 @@ +data "docker_registry_image" "cwtv_web" { + name = "nginx:latest" +} + +data "docker_network" "traefik" { + name = "traefik" +} + +locals { + labels = { + "shepherd.auto-update" = "true", + "traefik.enable" = "true" + "traefik.http.services.cwtv-web.loadbalancer.server.port" = "80", + "traefik.http.routers.cwtv-web.rule" = "Host(`www.chaoswest.tv`)||Host(`chaoswest.tv`)", + "traefik.http.routers.cwtv-web.tls" = "true", + "traefik.http.routers.cwtv-web.tls.certresolver" = "default", + } +} + +resource "docker_service" "cwtv_web" { + name = "cwtv-web" + + dynamic "labels" { + for_each = local.labels + content { + label = labels.key + value = labels.value + } + } + + task_spec { + networks_advanced { + name = data.docker_network.traefik.id + } + + container_spec { + image = "${data.docker_registry_image.cwtv_web.name}@${data.docker_registry_image.cwtv_web.sha256_digest}" + + mounts { + target = "/usr/share/nginx/html/" + source = "/mnt/data/cwtv-web/www/chaoswest.tv" + type = "bind" + } + } + } +} + +data "hetznerdns_zone" "primary" { + name = "chaoswest.tv" +} + +resource "hetznerdns_record" "primary" { + zone_id = data.hetznerdns_zone.primary.id + name = "www" + value = "ax41-1.fsn.mon2.de." + type = "CNAME" +} + + +data "dns_a_record_set" "primary" { + host = "ax41-1.fsn.mon2.de" +} + +data "dns_aaaa_record_set" "primary" { + host = "ax41-1.fsn.mon2.de" +} + +resource "hetznerdns_record" "apex_a" { + for_each = toset(data.dns_a_record_set.primary.addrs) + zone_id = data.hetznerdns_zone.primary.id + name = "@" + value = each.value + type = "A" +} + +resource "hetznerdns_record" "apex_aaaa" { + for_each = toset(data.dns_aaaa_record_set.primary.addrs) + zone_id = data.hetznerdns_zone.primary.id + name = "@" + value = each.value + type = "AAAA" +} diff --git a/modules/swarm/cwtv-web/outputs.tf b/modules/swarm/cwtv-web/outputs.tf new file mode 100644 index 0000000..e69de29 diff --git a/modules/swarm/cwtv-web/variables.tf b/modules/swarm/cwtv-web/variables.tf new file mode 100644 index 0000000..e69de29 diff --git a/modules/swarm/cwtv-web/version.tf b/modules/swarm/cwtv-web/version.tf new file mode 100644 index 0000000..3db6617 --- /dev/null +++ b/modules/swarm/cwtv-web/version.tf @@ -0,0 +1,17 @@ +terraform { + required_version = "1.5.5" + required_providers { + hetznerdns = { + source = "timohirt/hetznerdns" + version = "~>2.2" + } + docker = { + source = "kreuzwerker/docker" + version = "~>3.0" + } + dns = { + source = "hashicorp/dns" + version = "3.4.2" + } + } +} diff --git a/stacks/ax41-1/.terraform.lock.hcl b/stacks/ax41-1/.terraform.lock.hcl index 10e3bff..58316c4 100644 --- a/stacks/ax41-1/.terraform.lock.hcl +++ b/stacks/ax41-1/.terraform.lock.hcl @@ -5,6 +5,7 @@ provider "registry.terraform.io/carlpett/sops" { version = "1.0.0" constraints = "~> 1.0" hashes = [ + "h1:Ef2u9JLvoQv2TNT6rpuaKQu7Ps5teZKfGSxpoBMMEOk=", "h1:tnN2Mgl0NUF3cg7a0HtGmtOhHcG+tkaT6ncOPRuA9l8=", "zh:064e63ea800cd1a8e575064097bc7de6fd5faa8ad50dbb3f2f9d8a3ebc9d7b97", "zh:0663900085949d2faf24c170c7cdfbf76e545797915cc331da8304144c02bf27", @@ -20,6 +21,7 @@ provider "registry.terraform.io/goauthentik/authentik" { version = "2023.10.0" constraints = "~> 2023.10.0" hashes = [ + "h1:QoOsDOpXcq2YiON1+Mlfp34Gq4o50TweAu72QWfK25k=", "h1:d6pqTwKRUjRsHgkS5w2HxZGAHnpqCvDBu5WlDVlsOLM=", "zh:01fa235282d58dfa12550a7ee5a24c9ac0e48892efc7a457a2706af939ede015", "zh:0c33b5596e0fce54f5c2627607c9b2a2e9c40dece4310740fa96bdba7ecd36a9", @@ -38,10 +40,30 @@ provider "registry.terraform.io/goauthentik/authentik" { ] } +provider "registry.terraform.io/hashicorp/dns" { + version = "3.4.2" + hashes = [ + "h1:fANvQG0D/XKyj+s+egm66efvr8z2gNKER6UlKfjUxvU=", + "zh:75e40862402368e23cd298b62519203621cf4891b95e1c863530bf7d8e9614e6", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:7a660fbfe5f83d7b94fd5b4cc9bf10d2f6ae280779839f4b7f183c7db5f1e368", + "zh:7c8c3499fb015d2a877a645ffd0225c3fdb4e8b71c044ff242762a1aed2a28e6", + "zh:954f20a96c8d6a04961896137bc004dae19fdaaaf8fd29229fb6ebc98ccac040", + "zh:96bd331cdd3673037e679b20cbf64e02e16f16f05a8c5dc2567c484fdd271d48", + "zh:96f83dfaeba393b1cf17feef05f25ffc4083432c1e3336a28977e626aac6eb53", + "zh:c663da6c3fda06a69d082d23935cebc34c7dc1b898e03a825b50628ad0e0ba71", + "zh:d0cc78a4f9444efe52764a57e7159b217181e0fd4ab4a610fa3bf7839bd94b02", + "zh:d1e938eec2c7ec946775bf984e79b3c66440fe3c08c3662bf0b40d3097985ed9", + "zh:dee0ccb0588f4c4224fe36e50f649ae36add82d72ccbf070800438860da820ac", + "zh:f2b3be35c8c97ed58f7d01ac532207fc816514eda639dcd3fd1929f5f5be369f", + ] +} + provider "registry.terraform.io/kreuzwerker/docker" { version = "3.0.2" constraints = "~> 3.0" hashes = [ + "h1:XjdpVL61KtTsuPE8swok3GY8A+Bu3TZs8T2DOEpyiXo=", "h1:tryCE8s9BiT6VyfnGgU1mUt9s0HcCKlRERdLd2fr010=", "zh:15b0a2b2b563d8d40f62f83057d91acb02cd0096f207488d8b4298a59203d64f", "zh:23d919de139f7cd5ebfd2ff1b94e6d9913f0977fcfc2ca02e1573be53e269f95", @@ -64,6 +86,7 @@ provider "registry.terraform.io/timohirt/hetznerdns" { version = "2.2.0" constraints = "~> 2.2" hashes = [ + "h1:9a5BBgc0oi7DjmveI64xEhzW6wv5hQRAc+kmhs3QKyU=", "h1:HyskQAglrOueur79gSCBgx9MNDOs0tz39aNYQiFgxz8=", "zh:5bb0ab9f62be3ed92070235e507f3c290491d51391ef4edcc70df53b65a83019", "zh:5ccdfac7284f5515ac3cff748336b77f21c64760e429e811a1eeefa8ebb86e12", diff --git a/stacks/ax41-1/README.md b/stacks/ax41-1/README.md index 4764f96..3c40672 100644 --- a/stacks/ax41-1/README.md +++ b/stacks/ax41-1/README.md @@ -19,6 +19,7 @@ | Name | Source | Version | |------|--------|---------| +| [cwtv\_web](#module\_cwtv\_web) | ../../modules/swarm/cwtv-web | n/a | | [deckchores](#module\_deckchores) | ../../modules/swarm/deckchores | n/a | | [forgejo](#module\_forgejo) | ../../modules/swarm/forgejo | n/a | | [grafana](#module\_grafana) | ../../modules/swarm/grafana | n/a | diff --git a/stacks/ax41-1/main.tf b/stacks/ax41-1/main.tf index ec6da4a..70a4968 100644 --- a/stacks/ax41-1/main.tf +++ b/stacks/ax41-1/main.tf @@ -35,6 +35,10 @@ module "shit" { source = "../../modules/swarm/shit" } +module "cwtv_web" { + source = "../../modules/swarm/cwtv-web" +} + module "spaceapi" { source = "../../modules/swarm/spaceapi" }