369 lines
9.2 KiB
Markdown
369 lines
9.2 KiB
Markdown
# 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://<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
|
|
|
|
```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
|
|
``` |