Servarr is the name for the ecosystem of apps that help you run and automate your own home media server. This includes fetching movie and TV show releases, books and music management, indexer and UseNet/Torrent managers and downloaders.
This section includes some guides on getting Servarr setup in a Kubernetes cluster using Terraform IaC.
Apps included:
Servarr is split up into separate services that each manage a section of your media library. This allows you to plug and play tools as you need them, and reduces dependencies between them.
Prowlarr's indexer management allows you to store all your indexers private/public in one place, and automatically syncs them to the other tools. An alternative to Prowlarr would be Jackett.
Since everything is isolated, you can easily switch these services out for another. And this becomes very easy with Kubernetes and Terraform. Just create a module for the service you want to deploy, and update the configurations in the other tools.
If there's a feature you're still missing, you most likely will find a tool on GitHub or elsewhere that does the job.
For more information on Servarr, refer to the community-maintained wiki which includes information about deployment on Docker, configuration and more.
Images of the Servarr stack are maintained by community projects. The largest of them being linuxserver.io with great documentation and consistent updates. Those are the ones primarily used in this setup.
hotio.dev by Pullio also provides an alternative source for images, with some images that aren't maintained by linuxserver.io.
Since Servarr is a large stack that you probably want to deploy with one single configuration, it makes sense to create a root Terraform module that deploys the rest of the Servarr apps. This ensures you only have to configure the namespace and providers once, which will be reused by the submodules.
This is the module I used to deploy my Servarr stack with all the above mentioned applications:
terraform {
required_providers {
kubernetes = {
source = "hashicorp/kubernetes"
version = "2.13.1"
}
}
}
provider "kubernetes" {
config_path = "~/.kube/config"
config_context = "homelab01"
}
locals {
namespace = "servarr"
}
resource "kubernetes_namespace" "servarr" {
metadata {
name = local.namespace
}
}
module "radarr" {
source = "./modules/radarr"
namespace = kubernetes_namespace.servarr.metadata.0.name
host = var.radarr_host
}
module "sonarr" {
source = "./modules/sonarr"
namespace = kubernetes_namespace.servarr.metadata.0.name
host = var.sonarr_host
}
module "bazarr" {
source = "./modules/bazarr"
namespace = kubernetes_namespace.servarr.metadata.0.name
host = var.bazarr_host
}
module "prowlarr" {
source = "./modules/prowlarr"
namespace = kubernetes_namespace.servarr.metadata.0.name
host = var.prowlarr_host
}
module "unmanic" {
source = "./modules/unmanic"
namespace = kubernetes_namespace.servarr.metadata.0.name
host = var.unmanic_host
}
module "unpackerr" {
source = "./modules/unpackerr"
namespace = kubernetes_namespace.servarr.metadata.0.name
sonarr_api_key = var.sonarr_api_key
radarr_api_key = var.radarr_api_key
}
module "qflood" {
source = "./modules/qflood"
namespace = kubernetes_namespace.servarr.metadata.0.name
qbittorrent_host = var.qbittorrent_host
qbittorrent_username = var.qbittorrent_username
qbittorrent_password = var.qbittorrent_password
floodui_host = var.floodui_host
}