variable "jellyfin" { type = object({ app_name = optional(string, "jellyfin") image = string version = optional(string, "latest") subdomain = optional(string, "jellyfin") port = optional(number, 8096) }) } resource "kubernetes_service_v1" "jellyfin" { metadata { name = var.jellyfin.app_name namespace = kubernetes_namespace_v1.media.metadata[0].name } spec { selector = { app = var.jellyfin.app_name } port { name = "web" port = var.jellyfin.port target_port = var.jellyfin.port } port { name = "client-discovery" port = 7359 target_port = 7359 } } } resource "kubernetes_ingress_v1" "jellyfin" { metadata { name = var.jellyfin.app_name namespace = kubernetes_namespace_v1.media.metadata[0].name annotations = { "cert-manager.io/cluster-issuer" = "letsencrypt" } } spec { tls { hosts = ["${var.jellyfin.subdomain}.${var.domain}"] secret_name = "${var.jellyfin.app_name}-tls" } rule { host = "${var.jellyfin.subdomain}.${var.domain}" http { path { path = "/" path_type = "Prefix" backend { service { name = kubernetes_service_v1.jellyfin.metadata[0].name port { number = var.jellyfin.port } } } } } } } } resource "kubernetes_persistent_volume_claim_v1" "jellyfin-config" { metadata { name = "${var.jellyfin.app_name}-config" namespace = kubernetes_namespace_v1.media.metadata[0].name } spec { storage_class_name = "local-path" access_modes = ["ReadWriteOnce"] resources { requests = { storage = "1Gi" } } } } resource "kubernetes_persistent_volume_claim_v1" "jellyfin-cache" { metadata { name = "${var.jellyfin.app_name}-cache" namespace = kubernetes_namespace_v1.media.metadata[0].name } spec { storage_class_name = "local-path" access_modes = ["ReadWriteOnce"] resources { requests = { storage = "1Gi" } } } } resource "kubernetes_deployment_v1" "jellyfin" { metadata { name = var.jellyfin.app_name namespace = kubernetes_namespace_v1.media.metadata[0].name labels = { app = var.jellyfin.app_name } } spec { replicas = 1 selector { match_labels = { app = var.jellyfin.app_name } } template { metadata { labels = { "app" = var.jellyfin.app_name } } spec { container { name = var.jellyfin.app_name image = "${var.jellyfin.image}:${var.jellyfin.version}" image_pull_policy = "Always" port { container_port = var.jellyfin.port } port { container_port = 7359 } volume_mount { name = "jellyfin-config" mount_path = "/config" } volume_mount { name = "jellyfin-cache" mount_path = "/cache" } volume_mount { name = "jellyfin-data" mount_path = "/media" } } volume { name = "jellyfin-config" persistent_volume_claim { claim_name = kubernetes_persistent_volume_claim_v1.jellyfin-config.metadata[0].name } } volume { name = "jellyfin-cache" persistent_volume_claim { claim_name = kubernetes_persistent_volume_claim_v1.jellyfin-cache.metadata[0].name } } volume { name = "jellyfin-data" nfs { path = "${var.media_storage.root_path}/${var.media_storage.jellyfin_path}" server = var.media_storage.server_ip read_only = false } } } } } }