provider "kubernetes" { config_path = "~/.kube/config" } variable "domain" { type = string } variable "smtp" { type = object({ host = string username = string password = string from = string }) } variable "stoat" { type = object({ subdomain = string api = object({ name = optional(string, "stoat-api") port = optional(number, 14702) image = string version = string }) events = object({ name = optional(string, "stoat-events") port = optional(number, 14703) image = string version = string }) autumn = object({ name = optional(string, "stoat-autumn") port = optional(number, 14704) image = string version = string }) january = object({ name = optional(string, "stoat-january") port = optional(number, 14705) image = string version = string }) gifbox = object({ name = optional(string, "stoat-gifbox") port = optional(number, 14706) image = string version = string }) pushd = object({ name = optional(string, "stoat-pushd") image = string version = string }) crond = object({ name = optional(string, "stoat-crond") image = string version = string }) voice_ingress = object({ name = optional(string, "stoat-voice-ingress") port = optional(number, 8500) image = string version = string }) web = object({ name = optional(string, "stoat-webapp") port = optional(number, 80) image = string version = string }) }) } resource "kubernetes_namespace_v1" "stoat" { metadata { name = "stoat" } } resource "kubernetes_config_map_v1" "Revolt" { metadata { name = "revolt" namespace = kubernetes_namespace_v1.stoat.metadata[0].name } data = { "Revolt.toml" = templatefile("${path.module}/templates/Revolt.toml.tftpl", { domain = var.domain hostname = "${var.stoat.subdomain}.${var.domain}" smtp = var.smtp livekit_api_key = var.livekit.api_key livekit_secret_key = random_password.livekit_api_secret.result minio_host = var.minio.app_name minio_user = var.minio.user minio_pass = random_password.minio.result mongo_host = var.mongo.app_name rabbit_host = var.rabbit.app_name rabbit_port = var.rabbit.port rabbit_user = var.rabbit.user rabbit_passwd = random_password.rabbit.result redis_host = var.redis.app_name }) "Caddyfile" = templatefile("${path.module}/templates/Caddyfile.tftpl", { hostname = "${var.stoat.subdomain}.${var.domain}" stoat = var.stoat }) } } resource "kubernetes_config_map_v1" "env_web" { metadata { name = "env-web" namespace = kubernetes_namespace_v1.stoat.metadata[0].name } data = { NGINX_HOST = "chat.ruan.fr" } } resource "kubernetes_ingress_v1" "stoat" { metadata { name = "stoat" namespace = kubernetes_namespace_v1.stoat.metadata[0].name annotations = { "cert-manager.io/cluster-issuer" = "letsencrypt" } } spec { tls { hosts = [ "${var.stoat.subdomain}.${var.domain}", "api.${var.stoat.subdomain}.${var.domain}", "file.${var.stoat.subdomain}.${var.domain}", "proxy.${var.stoat.subdomain}.${var.domain}", "events.${var.stoat.subdomain}.${var.domain}", "gifbox.${var.stoat.subdomain}.${var.domain}", ] secret_name = "stoat-tls" } rule { host = "${var.stoat.subdomain}.${var.domain}" http { path { path = "/" path_type = "Prefix" backend { service { name = kubernetes_service_v1.stoat_caddy.metadata[0].name port { number = 80 } } } } } } rule { host = "api.${var.stoat.subdomain}.${var.domain}" http { path { path = "/" path_type = "Prefix" backend { service { name = kubernetes_service_v1.stoat_api.metadata[0].name port { number = var.stoat.api.port } } } } } } rule { host = "events.${var.stoat.subdomain}.${var.domain}" http { path { path = "/" path_type = "Exact" backend { service { name = kubernetes_service_v1.stoat_events.metadata[0].name port { number = var.stoat.events.port } } } } } } rule { host = "file.${var.stoat.subdomain}.${var.domain}" http { path { path = "/" path_type = "Prefix" backend { service { name = kubernetes_service_v1.stoat_autumn.metadata[0].name port { number = var.stoat.autumn.port } } } } } } rule { host = "proxy.${var.stoat.subdomain}.${var.domain}" http { path { path = "/" path_type = "Prefix" backend { service { name = kubernetes_service_v1.stoat_january.metadata[0].name port { number = var.stoat.january.port } } } } } } rule { host = "gifbox.${var.stoat.subdomain}.${var.domain}" http { path { path = "/" path_type = "Prefix" backend { service { name = kubernetes_service_v1.stoat_gifbox.metadata[0].name port { number = var.stoat.gifbox.port } } } } } } } } resource "kubernetes_service_v1" "stoat_caddy" { metadata { name = "caddy" namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { selector = { app = "caddy" } port { port = 80 target_port = 80 } } } resource "kubernetes_deployment_v1" "stoat_caddy" { metadata { name = "caddy" namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { replicas = 1 selector { match_labels = { app = "caddy" } } template { metadata { labels = { "app" = "caddy" } } spec { container { name = "caddy" image = "docker.io/caddy" port { container_port = 80 } env_from { config_map_ref { name = kubernetes_config_map_v1.env_web.metadata[0].name optional = false } } volume_mount { name = "revolt" mount_path = "/etc/caddy/Caddyfile" sub_path = "Caddyfile" } } volume { name = "revolt" config_map { name = kubernetes_config_map_v1.Revolt.metadata[0].name optional = false } } } } } } resource "kubernetes_service_v1" "stoat_api" { metadata { name = var.stoat.api.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { selector = { app = var.stoat.api.name } port { port = var.stoat.api.port target_port = var.stoat.api.port } } } resource "kubernetes_deployment_v1" "stoat_api" { metadata { name = var.stoat.api.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { replicas = 1 selector { match_labels = { app = var.stoat.api.name } } template { metadata { labels = { "app" = var.stoat.api.name } } spec { container { name = var.stoat.api.name image = "${var.stoat.api.image}:${var.stoat.api.version}" port { container_port = var.stoat.api.port } volume_mount { name = "revolt-toml" mount_path = "/Revolt.toml" sub_path = "Revolt.toml" } } volume { name = "revolt-toml" config_map { name = kubernetes_config_map_v1.Revolt.metadata[0].name optional = false } } } } } } resource "kubernetes_service_v1" "stoat_events" { metadata { name = var.stoat.events.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { selector = { app = var.stoat.events.name } port { port = var.stoat.events.port target_port = var.stoat.events.port } } } resource "kubernetes_deployment_v1" "stoat_events" { metadata { name = var.stoat.events.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { replicas = 1 selector { match_labels = { app = var.stoat.events.name } } template { metadata { labels = { "app" = var.stoat.events.name } } spec { container { name = var.stoat.events.name image = "${var.stoat.events.image}:${var.stoat.events.version}" port { container_port = var.stoat.events.port } volume_mount { name = "revolt-toml" mount_path = "/Revolt.toml" sub_path = "Revolt.toml" } } volume { name = "revolt-toml" config_map { name = kubernetes_config_map_v1.Revolt.metadata[0].name optional = false } } } } } } resource "kubernetes_service_v1" "stoat_autumn" { metadata { name = var.stoat.autumn.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { selector = { app = var.stoat.autumn.name } port { port = var.stoat.autumn.port target_port = var.stoat.autumn.port } } } resource "kubernetes_deployment_v1" "stoat_autumn" { metadata { name = var.stoat.autumn.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { replicas = 1 selector { match_labels = { app = var.stoat.autumn.name } } template { metadata { labels = { "app" = var.stoat.autumn.name } } spec { container { name = var.stoat.autumn.name image = "${var.stoat.autumn.image}:${var.stoat.autumn.version}" port { container_port = var.stoat.autumn.port } volume_mount { name = "revolt-toml" mount_path = "/Revolt.toml" sub_path = "Revolt.toml" } } volume { name = "revolt-toml" config_map { name = kubernetes_config_map_v1.Revolt.metadata[0].name optional = false } } } } } } resource "kubernetes_service_v1" "stoat_january" { metadata { name = var.stoat.january.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { selector = { app = var.stoat.january.name } port { port = var.stoat.january.port target_port = var.stoat.january.port } } } resource "kubernetes_deployment_v1" "stoat_january" { metadata { name = var.stoat.january.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { replicas = 1 selector { match_labels = { app = var.stoat.january.name } } template { metadata { labels = { "app" = var.stoat.january.name } } spec { container { name = var.stoat.january.name image = "${var.stoat.january.image}:${var.stoat.january.version}" port { container_port = var.stoat.january.port } volume_mount { name = "revolt-toml" mount_path = "/Revolt.toml" sub_path = "Revolt.toml" } } volume { name = "revolt-toml" config_map { name = kubernetes_config_map_v1.Revolt.metadata[0].name optional = false } } } } } } resource "kubernetes_service_v1" "stoat_gifbox" { metadata { name = var.stoat.gifbox.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { selector = { app = var.stoat.gifbox.name } port { port = var.stoat.gifbox.port target_port = var.stoat.gifbox.port } } } resource "kubernetes_deployment_v1" "stoat_gifbox" { metadata { name = var.stoat.gifbox.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { replicas = 1 selector { match_labels = { app = var.stoat.gifbox.name } } template { metadata { labels = { "app" = var.stoat.gifbox.name } } spec { container { name = var.stoat.gifbox.name image = "${var.stoat.gifbox.image}:${var.stoat.gifbox.version}" port { container_port = var.stoat.gifbox.port } volume_mount { name = "revolt-toml" mount_path = "/Revolt.toml" sub_path = "Revolt.toml" } } volume { name = "revolt-toml" config_map { name = kubernetes_config_map_v1.Revolt.metadata[0].name optional = false } } } } } } resource "kubernetes_deployment_v1" "stoat_pushd" { metadata { name = var.stoat.pushd.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { replicas = 1 selector { match_labels = { app = var.stoat.pushd.name } } template { metadata { labels = { "app" = var.stoat.pushd.name } } spec { container { name = var.stoat.pushd.name image = "${var.stoat.pushd.image}:${var.stoat.pushd.version}" volume_mount { name = "revolt-toml" mount_path = "/Revolt.toml" sub_path = "Revolt.toml" } } volume { name = "revolt-toml" config_map { name = kubernetes_config_map_v1.Revolt.metadata[0].name optional = false } } } } } } resource "kubernetes_deployment_v1" "stoat_crond" { metadata { name = var.stoat.crond.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { replicas = 1 selector { match_labels = { app = var.stoat.crond.name } } template { metadata { labels = { "app" = var.stoat.crond.name } } spec { container { name = var.stoat.crond.name image = "${var.stoat.crond.image}:${var.stoat.crond.version}" volume_mount { name = "revolt-toml" mount_path = "/Revolt.toml" sub_path = "Revolt.toml" } } volume { name = "revolt-toml" config_map { name = kubernetes_config_map_v1.Revolt.metadata[0].name optional = false } } } } } } resource "kubernetes_service_v1" "stoat_voice_ingress" { metadata { name = var.stoat.voice_ingress.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { selector = { app = var.stoat.voice_ingress.name } port { port = var.stoat.voice_ingress.port target_port = var.stoat.voice_ingress.port } } } resource "kubernetes_deployment_v1" "stoat_voice_ingress" { metadata { name = var.stoat.voice_ingress.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { replicas = 1 selector { match_labels = { app = var.stoat.voice_ingress.name } } template { metadata { labels = { "app" = var.stoat.voice_ingress.name } } spec { container { name = var.stoat.voice_ingress.name image = "${var.stoat.voice_ingress.image}:${var.stoat.voice_ingress.version}" volume_mount { name = "revolt-toml" mount_path = "/Revolt.toml" sub_path = "Revolt.toml" } } volume { name = "revolt-toml" config_map { name = kubernetes_config_map_v1.Revolt.metadata[0].name optional = false } } } } } } resource "kubernetes_service_v1" "stoat_web" { metadata { name = var.stoat.web.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { selector = { app = var.stoat.web.name } port { port = var.stoat.web.port target_port = var.stoat.web.port } } } resource "kubernetes_deployment_v1" "stoat_web" { metadata { name = var.stoat.web.name namespace = kubernetes_namespace_v1.stoat.metadata[0].name } spec { replicas = 1 selector { match_labels = { app = var.stoat.web.name } } template { metadata { labels = { "app" = var.stoat.web.name } } spec { container { name = var.stoat.web.name image = "${var.stoat.web.image}:${var.stoat.web.version}" image_pull_policy = "Always" port { container_port = var.stoat.web.port } env_from { config_map_ref { name = kubernetes_config_map_v1.env_web.metadata[0].name optional = false } } } } } } }