Move media stack to tofu

This commit is contained in:
Antonin Ruan
2026-02-09 23:10:53 +01:00
parent f20172f6a4
commit 22df3a9c8c
16 changed files with 1061 additions and 502 deletions

180
media/jellyfin.tf Normal file
View File

@@ -0,0 +1,180 @@
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
}
}
}
}
}
}