Media Server Helm Charts
This repository contains a collection of Helm charts for deploying a complete media server stack on Kubernetes. The stack includes:
- Plex: Media server for streaming your media collection
- Jackett: Index manager/proxy for torrent trackers
- qBittorrent: Torrent client for downloading
- Sonarr: TV shows management and automation
- Radarr: Movies management and automation
- Overseerr: Request management and discovery interface
Prerequisites
- Kubernetes cluster
- Helm 3.x installed
- Storage class available for persistent volumes
- (Optional) Ingress controller if you plan to use ingress
Installation
Each service can be installed independently, but they are designed to work together. Here's the recommended installation order:
- qBittorrent (for downloads)
- Jackett (for indexers)
- Sonarr and Radarr (for media management)
- Overseerr (for request management)
Basic Installation
# Install qBittorrent
helm install qbittorrent ./qbittorrent
# Install Jackett
helm install jackett ./jackett
# Install Sonarr
helm install sonarr ./sonarr
# Install Radarr
helm install radarr ./radarr
# Install Overseerr
helm install overseerr ./overseerr
Configuration
Each chart supports the following common configurations through their respective values.yaml
:
Common Settings
replicaCount
: Number of replicas (default: 1)image.tag
: Container image tag (default: "latest")persistence.*.storageClass
: Storage class for PVCssecurityContext.PUID/PGID
: User/Group IDs (default: 1000)ingress
: Ingress configurationresources
: CPU/Memory limits and requests
Service-Specific Ports
- Plex: 32400 (main), 32469 (DLNA), 1900 (DLNA/UDP), 32410-32414 (GDM)
- Jackett: 9117
- qBittorrent: 8080 (WebUI), 6881 (BitTorrent)
- Sonarr: 8989
- Radarr: 7878
- Overseerr: 5055
Example Values
Using Existing Download Directory
To share the download directory between qBittorrent, Sonarr, and Radarr:
- First, install qBittorrent:
# qbittorrent/values.yaml
persistence:
downloads:
enabled: true
size: 100Gi
- Then configure Sonarr/Radarr to use the existing PVC:
# sonarr/values.yaml or radarr/values.yaml
persistence:
downloads:
enabled: true
existingClaim: "qbittorrent-downloads" # Use the PVC created by qBittorrent
- For Plex, you can reuse existing storage for all volume types:
# plex/values.yaml
persistence:
# Use existing PVC for configuration
config:
enabled: true
existingClaim: "plex-config" # Optional: reuse existing config PVC
# Use existing PVC for transcoding
transcode:
enabled: true
existingClaim: "plex-transcode" # Optional: reuse existing transcode PVC
# Use existing PVC for media
data:
enabled: true
existingClaim: "media-storage" # Optional: reuse existing media PVC
This allows you to:
- Preserve Plex configuration across reinstalls
- Share transcode space between multiple Plex instances
- Mount existing media libraries
Setting Up Ingress
Each service can be exposed using Kubernetes ingress. Here's a detailed example:
ingress:
enabled: true
className: "nginx" # Specify your ingress controller
annotations:
# For automatic HTTPS with cert-manager
cert-manager.io/cluster-issuer: letsencrypt-prod
# If you're using nginx-ingress
nginx.ingress.kubernetes.io/ssl-redirect: "true"
# Add this if you're having issues with paths
nginx.ingress.kubernetes.io/rewrite-target: /
hosts:
- host: jackett.example.com # Replace with your domain
paths:
- path: /
pathType: Prefix # Use Prefix for most cases
tls:
- secretName: jackett-tls
hosts:
- jackett.example.com
Common ingress configurations for different controllers:
- nginx-ingress:
ingress:
className: "nginx"
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
- traefik:
ingress:
className: "traefik"
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
- contour:
ingress:
className: "contour"
annotations:
projectcontour.io/websocket-routes: "/"
Ingress Troubleshooting
If you encounter issues with ingress:
-
Check ingress controller:
# Verify ingress controller is running kubectl get pods -n ingress-nginx # Check ingress resource kubectl get ingress kubectl describe ingress jackett
-
Common issues and solutions:
- If paths aren't working, try changing
pathType
toPrefix
- For 404 errors, check if the
rewrite-target
annotation is needed - For SSL/TLS issues, verify cert-manager setup and TLS secret creation
- If paths aren't working, try changing
-
Verify service connectivity:
# Test service directly kubectl port-forward svc/jackett 9117:9117
Initial Setup
After installing all services, follow these steps:
-
Plex:
- Get your claim token from https://plex.tv/claim
- Set the claim token in values.yaml:
env: PLEX_CLAIM: "your-claim-token"
- For hardware transcoding, enable it in values.yaml:
transcoding: hardware: enabled: true intel: true # For Intel GPU # or nvidia: true # For Nvidia GPU
- Configure your media libraries in the Plex web interface
-
Jackett:
- Access the Jackett UI and add your preferred indexers
- Note down the API key and indexer URLs for Sonarr/Radarr
-
qBittorrent:
- Access the WebUI (default credentials: admin/adminadmin)
- Configure download paths and settings
- Note down the username/password for Sonarr/Radarr
-
Sonarr/Radarr:
- Add Jackett indexers
- Configure qBittorrent as download client
- Set up media library paths
- Get API keys for Overseerr
-
Overseerr:
- Configure Sonarr/Radarr connections using their API keys
- Set up user authentication
Persistence
Each service requires persistent storage:
- Jackett: Configuration data
- qBittorrent: Configuration and downloads
- Sonarr: Configuration and TV shows library
- Radarr: Configuration and movies library
- Overseerr: Configuration data
Make sure your storage class supports the required access modes (ReadWriteOnce by default).
Security
- All services run as non-root with configurable PUID/PGID
- Default credentials should be changed after installation
- Consider using ingress with TLS for secure access
- API keys should be kept secure and not shared
Troubleshooting
Common issues and solutions:
-
PVC Issues:
- Ensure storage class exists
- Check PVC status with
kubectl get pvc
-
Permission Issues:
- Adjust PUID/PGID to match your media files ownership
- Ensure consistent permissions across services
-
Network Issues:
- Verify services can communicate using internal DNS
- Check service and pod status with
kubectl get pods,svc
Contributing
Feel free to submit issues and pull requests for improvements.
Hardware Transcoding
Plex supports hardware transcoding with compatible GPUs:
Intel GPU
transcoding:
hardware:
enabled: true
intel: true
Nvidia GPU
transcoding:
hardware:
enabled: true
nvidia: true
Note: Hardware transcoding requires:
- Compatible GPU hardware on your Kubernetes nodes
- Proper drivers installed on the host
- Appropriate permissions/security contexts
- Plex Pass subscription
Using as a Helm Repository
You can serve these charts from your own server. The repository structure is available in the .packaged
directory.
Hosting the Repository
-
Using GitHub Pages:
- Push the contents of
.packaged
to a GitHub repository - Enable GitHub Pages in your repository settings
- The repository will be available at
https://<username>.github.io/<repository>
- Push the contents of
-
Using your own web server:
- Copy the contents of
.packaged
to your web server - Ensure the files are served with correct MIME types:
.tgz
files asapplication/x-tar
index.yaml
astext/yaml
orapplication/yaml
- Copy the contents of
Adding the Repository to Helm
# Add the repository
helm repo add media-charts https://git.mumme-it.de/Mumme-IT/media-charts/raw/branch/main/.packaged
# Update the repository cache
helm repo update
# Search available charts
helm search repo media-charts
Repository Source
The source code for these charts is available at: https://git.mumme-it.de/Mumme-IT/media-charts
Installing Charts from Repository
Instead of installing from local files, you can install directly from the repository:
# Install Plex
helm install plex media-charts/plex
# Install Jackett
helm install jackett media-charts/jackett
# Install qBittorrent
helm install qbittorrent media-charts/qbittorrent
# Install Sonarr
helm install sonarr media-charts/sonarr
# Install Radarr
helm install radarr media-charts/radarr
# Install Overseerr
helm install overseerr media-charts/overseerr
Updating Charts
To update charts when new versions are released:
# Update repository cache
helm repo update
# Upgrade a specific chart
helm upgrade plex media-charts/plex
# Or upgrade with custom values
helm upgrade plex media-charts/plex -f my-values.yaml
Charts
The following charts are included in this repository:
plex
- Media server for streaming mediaradarr
- Movie collection managementsonarr
- TV show collection managementreadarr
- Book and audiobook collection managementprowlarr
- Indexer manager/proxy for arr applicationsqbittorrent
- BitTorrent client for download management- ... other charts