Files
media-charts/README.md
2025-05-10 17:18:15 +02:00

9.6 KiB

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:

  1. qBittorrent (for downloads)
  2. Jackett (for indexers)
  3. Sonarr and Radarr (for media management)
  4. 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 PVCs
  • securityContext.PUID/PGID: User/Group IDs (default: 1000)
  • ingress: Ingress configuration
  • resources: 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:

  1. First, install qBittorrent:
# qbittorrent/values.yaml
persistence:
  downloads:
    enabled: true
    size: 100Gi
  1. 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
  1. 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:

  1. nginx-ingress:
ingress:
  className: "nginx"
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  1. traefik:
ingress:
  className: "traefik"
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
  1. contour:
ingress:
  className: "contour"
  annotations:
    projectcontour.io/websocket-routes: "/"

Ingress Troubleshooting

If you encounter issues with ingress:

  1. Check ingress controller:

    # Verify ingress controller is running
    kubectl get pods -n ingress-nginx
    
    # Check ingress resource
    kubectl get ingress
    kubectl describe ingress jackett
    
  2. Common issues and solutions:

    • If paths aren't working, try changing pathType to Prefix
    • For 404 errors, check if the rewrite-target annotation is needed
    • For SSL/TLS issues, verify cert-manager setup and TLS secret creation
  3. Verify service connectivity:

    # Test service directly
    kubectl port-forward svc/jackett 9117:9117
    

Initial Setup

After installing all services, follow these steps:

  1. 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
  2. Jackett:

    • Access the Jackett UI and add your preferred indexers
    • Note down the API key and indexer URLs for Sonarr/Radarr
  3. qBittorrent:

    • Access the WebUI (default credentials: admin/adminadmin)
    • Configure download paths and settings
    • Note down the username/password for Sonarr/Radarr
  4. Sonarr/Radarr:

    • Add Jackett indexers
    • Configure qBittorrent as download client
    • Set up media library paths
    • Get API keys for Overseerr
  5. 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:

  1. PVC Issues:

    • Ensure storage class exists
    • Check PVC status with kubectl get pvc
  2. Permission Issues:

    • Adjust PUID/PGID to match your media files ownership
    • Ensure consistent permissions across services
  3. 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

  1. 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>
  2. 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 as application/x-tar
      • index.yaml as text/yaml or application/yaml

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 media
  • radarr - Movie collection management
  • sonarr - TV show collection management
  • readarr - Book and audiobook collection management
  • prowlarr - Indexer manager/proxy for arr applications
  • qbittorrent - BitTorrent client for download management
  • ... other charts