Files
2026-02-16 19:26:47 +01:00

159 lines
3.6 KiB
Terraform

variable "livekit" {
type = object({
app_name = optional(string, "livekit")
api_key = string
image = string
version = string
http_port = optional(number, 7880)
tcp_port = optional(number, 7881)
udp_port = optional(number, 7882)
subdomain = optional(string, "livekit")
})
}
resource "random_password" "livekit_api_secret" {
length = 44
special = false
}
resource "kubernetes_config_map_v1" "livekit" {
metadata {
name = var.livekit.app_name
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
}
data = {
"livekit.yml" = templatefile("${path.module}/templates/livekit.yml.tftpl",
{
domain = var.domain
voice_ingress_url = "http://${var.stoat.voice_ingress.name}:8500/worldwide"
livekit = {
http_port = var.livekit.http_port
tcp_port = var.livekit.tcp_port
api_key = var.livekit.api_key
api_secret = random_password.livekit_api_secret.result
subdomain = var.livekit.subdomain
}
redis = {
host = "${var.redis.app_name}"
port = 6379
}
})
}
}
resource "kubernetes_service_v1" "livekit" {
metadata {
name = "${var.livekit.app_name}-service"
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
}
spec {
selector = {
app = var.livekit.app_name
}
type = "NodePort"
port {
name = "http"
port = var.livekit.http_port
target_port = var.livekit.http_port
}
port {
name = "tcp"
port = var.livekit.tcp_port
target_port = var.livekit.tcp_port
}
port {
name = "udp"
port = var.livekit.udp_port
target_port = var.livekit.udp_port
}
}
}
resource "kubernetes_ingress_v1" "livekit" {
metadata {
name = "${var.livekit.app_name}-service"
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
annotations = {
"cert-manager.io/cluster-issuer" = "letsencrypt"
}
}
spec {
tls {
hosts = [
"${var.livekit.subdomain}.${var.domain}"
]
secret_name = "livekit-tls"
}
rule {
host = "${var.livekit.subdomain}.${var.domain}"
http {
path {
path = "/"
path_type = "Prefix"
backend {
service {
name = kubernetes_service_v1.livekit.metadata[0].name
port {
number = var.livekit.http_port
}
}
}
}
}
}
}
}
resource "kubernetes_deployment_v1" "livekit" {
metadata {
name = var.livekit.app_name
namespace = kubernetes_namespace_v1.stoat.metadata[0].name
}
spec {
replicas = 1
selector {
match_labels = {
app = var.livekit.app_name
}
}
template {
metadata {
labels = {
"app" = var.livekit.app_name
}
}
spec {
host_network = true
dns_policy = "ClusterFirstWithHostNet"
container {
name = var.livekit.app_name
image = "${var.livekit.image}:${var.livekit.version}"
# command = [ "/bin/sh", "-c", "--", "while true; do sleep 5; done;"]
args = ["--config", "/etc/livekit.yml"]
volume_mount {
name = "livekit-config"
mount_path = "/etc/livekit.yml"
sub_path = "livekit.yml"
}
}
volume {
name = "livekit-config"
config_map {
name = kubernetes_config_map_v1.livekit.metadata[0].name
}
}
}
}
}
}