From 4ca7af881870b7ebb16ff7ebd806add8fc17e6d9 Mon Sep 17 00:00:00 2001 From: Viktor Barzin Date: Tue, 24 Mar 2026 01:21:49 +0200 Subject: [PATCH] add audiobook-search service to servarr stack - New audiobook-search deployment + service + ingress (Authentik-protected) - qBittorrent: add NFS mount for /audiobooks (shared with Audiobookshelf) - Cloudflare DNS: add audiobook-search.viktorbarzin.me - Env vars: QBITTORRENT_URL/PASS, AUDIOBOOKSHELF_URL/TOKEN from ESO --- config.tfvars | Bin 10021 -> 10041 bytes stacks/servarr/audiobook-search/main.tf | 120 ++++++++++++++++++++++++ stacks/servarr/main.tf | 8 ++ stacks/servarr/qbittorrent/main.tf | 18 ++++ 4 files changed, 146 insertions(+) create mode 100644 stacks/servarr/audiobook-search/main.tf diff --git a/config.tfvars b/config.tfvars index a6e00fb227731ad094bbffd6bf63acf4aa9879c0..5293e1b293814049e1799653c9d8d0407ea38bf2 100644 GIT binary patch literal 10041 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 diff --git a/stacks/servarr/audiobook-search/main.tf b/stacks/servarr/audiobook-search/main.tf new file mode 100644 index 00000000..86f9cfe8 --- /dev/null +++ b/stacks/servarr/audiobook-search/main.tf @@ -0,0 +1,120 @@ +variable "tls_secret_name" {} +variable "tier" { type = string } +variable "audiobookshelf_token" { + type = string + sensitive = true +} +variable "qbittorrent_password" { + type = string + sensitive = true +} + +resource "kubernetes_deployment" "audiobook_search" { + metadata { + name = "audiobook-search" + namespace = "servarr" + labels = { + app = "audiobook-search" + tier = var.tier + } + } + spec { + replicas = 1 + selector { + match_labels = { + app = "audiobook-search" + } + } + template { + metadata { + labels = { + app = "audiobook-search" + } + } + spec { + container { + image = "viktorbarzin/audiobook-search:latest" + image_pull_policy = "Always" + name = "audiobook-search" + + port { + container_port = 8000 + } + env { + name = "QBITTORRENT_URL" + value = "http://qbittorrent.servarr.svc.cluster.local" + } + env { + name = "QBITTORRENT_PASS" + value = var.qbittorrent_password + } + env { + name = "AUDIOBOOKSHELF_URL" + value = "http://audiobookshelf.audiobookshelf.svc.cluster.local" + } + env { + name = "AUDIOBOOKSHELF_TOKEN" + value = var.audiobookshelf_token + } + resources { + requests = { + cpu = "10m" + memory = "64Mi" + } + limits = { + memory = "128Mi" + } + } + liveness_probe { + http_get { + path = "/health" + port = 8000 + } + initial_delay_seconds = 10 + period_seconds = 30 + } + } + } + } + } + lifecycle { + ignore_changes = [spec[0].template[0].spec[0].dns_config] + } +} + +resource "kubernetes_service" "audiobook_search" { + metadata { + name = "audiobook-search" + namespace = "servarr" + labels = { + app = "audiobook-search" + } + } + + spec { + selector = { + app = "audiobook-search" + } + port { + name = "http" + port = 80 + target_port = 8000 + } + } +} + +module "ingress" { + source = "../../../modules/kubernetes/ingress_factory" + namespace = "servarr" + name = "audiobook-search" + tls_secret_name = var.tls_secret_name + protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Audiobook Search" + "gethomepage.dev/description" = "Search & download audiobooks" + "gethomepage.dev/icon" = "audiobookshelf.png" + "gethomepage.dev/group" = "Media & Entertainment" + "gethomepage.dev/pod-selector" = "" + } +} diff --git a/stacks/servarr/main.tf b/stacks/servarr/main.tf index 9acd350c..99db1ab5 100644 --- a/stacks/servarr/main.tf +++ b/stacks/servarr/main.tf @@ -114,3 +114,11 @@ module "aiostreams" { tier = local.tiers.aux nfs_server = var.nfs_server } + +module "audiobook_search" { + source = "./audiobook-search" + tls_secret_name = var.tls_secret_name + tier = local.tiers.aux + audiobookshelf_token = data.kubernetes_secret.eso_secrets.data["audiobookshelf_api_token"] + qbittorrent_password = data.kubernetes_secret.eso_secrets.data["qbittorrent_password"] +} diff --git a/stacks/servarr/qbittorrent/main.tf b/stacks/servarr/qbittorrent/main.tf index 7c63f2e2..ab5fd43a 100644 --- a/stacks/servarr/qbittorrent/main.tf +++ b/stacks/servarr/qbittorrent/main.tf @@ -23,6 +23,14 @@ module "nfs_downloads" { nfs_path = "/mnt/main/servarr/downloads" } +module "nfs_audiobooks" { + source = "../../../modules/kubernetes/nfs_volume" + name = "servarr-qbittorrent-audiobooks" + namespace = "servarr" + nfs_server = var.nfs_server + nfs_path = "/mnt/main/audiobookshelf/audiobooks" +} + resource "kubernetes_deployment" "qbittorrent" { metadata { name = "qbittorrent" @@ -80,6 +88,10 @@ resource "kubernetes_deployment" "qbittorrent" { name = "downloads" mount_path = "/downloads" } + volume_mount { + name = "audiobooks" + mount_path = "/audiobooks" + } } volume { name = "data" @@ -93,6 +105,12 @@ resource "kubernetes_deployment" "qbittorrent" { claim_name = module.nfs_downloads.claim_name } } + volume { + name = "audiobooks" + persistent_volume_claim { + claim_name = module.nfs_audiobooks.claim_name + } + } } } }