# 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 ```bash # 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: ```yaml # qbittorrent/values.yaml persistence: downloads: enabled: true size: 100Gi ``` 2. Then configure Sonarr/Radarr to use the existing PVC: ```yaml # sonarr/values.yaml or radarr/values.yaml persistence: downloads: enabled: true existingClaim: "qbittorrent-downloads" # Use the PVC created by qBittorrent ``` 3. For Plex, you can reuse existing storage for all volume types: ```yaml # 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: ```yaml 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**: ```yaml ingress: className: "nginx" annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" ``` 2. **traefik**: ```yaml ingress: className: "traefik" annotations: traefik.ingress.kubernetes.io/router.entrypoints: websecure ``` 3. **contour**: ```yaml ingress: className: "contour" annotations: projectcontour.io/websocket-routes: "/" ``` ### Ingress Troubleshooting If you encounter issues with ingress: 1. **Check ingress controller**: ```bash # 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**: ```bash # 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: ```yaml env: PLEX_CLAIM: "your-claim-token" ``` - For hardware transcoding, enable it in values.yaml: ```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 ```yaml transcoding: hardware: enabled: true intel: true ``` ### Nvidia GPU ```yaml 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://.github.io/` 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 ```bash # 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: ```bash # 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: ```bash # 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 ```