add plex
This commit is contained in:
122
README.md
122
README.md
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
This repository contains a collection of Helm charts for deploying a complete media server stack on Kubernetes. The stack includes:
|
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
|
- **Jackett**: Index manager/proxy for torrent trackers
|
||||||
- **qBittorrent**: Torrent client for downloading
|
- **qBittorrent**: Torrent client for downloading
|
||||||
- **Sonarr**: TV shows management and automation
|
- **Sonarr**: TV shows management and automation
|
||||||
@ -56,6 +57,7 @@ Each chart supports the following common configurations through their respective
|
|||||||
- `resources`: CPU/Memory limits and requests
|
- `resources`: CPU/Memory limits and requests
|
||||||
|
|
||||||
#### Service-Specific Ports
|
#### Service-Specific Ports
|
||||||
|
- Plex: 32400 (main), 32469 (DLNA), 1900 (DLNA/UDP), 32410-32414 (GDM)
|
||||||
- Jackett: 9117
|
- Jackett: 9117
|
||||||
- qBittorrent: 8080 (WebUI), 6881 (BitTorrent)
|
- qBittorrent: 8080 (WebUI), 6881 (BitTorrent)
|
||||||
- Sonarr: 8989
|
- Sonarr: 8989
|
||||||
@ -88,45 +90,119 @@ persistence:
|
|||||||
|
|
||||||
#### Setting Up Ingress
|
#### Setting Up Ingress
|
||||||
|
|
||||||
Example ingress configuration for each service:
|
Each service can be exposed using Kubernetes ingress. Here's a detailed example:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
ingress:
|
ingress:
|
||||||
enabled: true
|
enabled: true
|
||||||
className: nginx
|
className: "nginx" # Specify your ingress controller
|
||||||
annotations:
|
annotations:
|
||||||
|
# For automatic HTTPS with cert-manager
|
||||||
cert-manager.io/cluster-issuer: letsencrypt-prod
|
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:
|
hosts:
|
||||||
- host: service-name.example.com
|
- host: jackett.example.com # Replace with your domain
|
||||||
paths:
|
paths:
|
||||||
- path: /
|
- path: /
|
||||||
pathType: ImplementExact
|
pathType: Prefix # Use Prefix for most cases
|
||||||
tls:
|
tls:
|
||||||
- secretName: service-name-tls
|
- secretName: jackett-tls
|
||||||
hosts:
|
hosts:
|
||||||
- service-name.example.com
|
- 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
|
## Initial Setup
|
||||||
|
|
||||||
After installing all services, follow these steps:
|
After installing all services, follow these steps:
|
||||||
|
|
||||||
1. **Jackett**:
|
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
|
- Access the Jackett UI and add your preferred indexers
|
||||||
- Note down the API key and indexer URLs for Sonarr/Radarr
|
- Note down the API key and indexer URLs for Sonarr/Radarr
|
||||||
|
|
||||||
2. **qBittorrent**:
|
3. **qBittorrent**:
|
||||||
- Access the WebUI (default credentials: admin/adminadmin)
|
- Access the WebUI (default credentials: admin/adminadmin)
|
||||||
- Configure download paths and settings
|
- Configure download paths and settings
|
||||||
- Note down the username/password for Sonarr/Radarr
|
- Note down the username/password for Sonarr/Radarr
|
||||||
|
|
||||||
3. **Sonarr/Radarr**:
|
4. **Sonarr/Radarr**:
|
||||||
- Add Jackett indexers
|
- Add Jackett indexers
|
||||||
- Configure qBittorrent as download client
|
- Configure qBittorrent as download client
|
||||||
- Set up media library paths
|
- Set up media library paths
|
||||||
- Get API keys for Overseerr
|
- Get API keys for Overseerr
|
||||||
|
|
||||||
4. **Overseerr**:
|
5. **Overseerr**:
|
||||||
- Configure Sonarr/Radarr connections using their API keys
|
- Configure Sonarr/Radarr connections using their API keys
|
||||||
- Set up user authentication
|
- Set up user authentication
|
||||||
|
|
||||||
@ -168,3 +244,29 @@ Common issues and solutions:
|
|||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Feel free to submit issues and pull requests for improvements.
|
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
|
1
jackett-chart/templates/configmap-templates.yaml
Normal file
1
jackett-chart/templates/configmap-templates.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
|
@ -41,13 +41,13 @@ persistence:
|
|||||||
|
|
||||||
ingress:
|
ingress:
|
||||||
enabled: false
|
enabled: false
|
||||||
className: ""
|
className: "nginx"
|
||||||
annotations: {}
|
annotations: {}
|
||||||
hosts:
|
hosts:
|
||||||
- host: chart-example.local
|
- host: jackett.local
|
||||||
paths:
|
paths:
|
||||||
- path: /
|
- path: /
|
||||||
pathType: ImplementExact
|
pathType: Prefix
|
||||||
tls: []
|
tls: []
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
|
@ -42,19 +42,21 @@ service:
|
|||||||
|
|
||||||
ingress:
|
ingress:
|
||||||
enabled: false
|
enabled: false
|
||||||
className: ""
|
className: "nginx"
|
||||||
annotations: {}
|
annotations: {}
|
||||||
# kubernetes.io/ingress.class: nginx
|
# kubernetes.io/ingress.class: nginx
|
||||||
# kubernetes.io/tls-acme: "true"
|
# kubernetes.io/tls-acme: "true"
|
||||||
|
# nginx.ingress.kubernetes.io/rewrite-target: /
|
||||||
|
# nginx.ingress.kubernetes.io/ssl-redirect: "false"
|
||||||
hosts:
|
hosts:
|
||||||
- host: chart-example.local
|
- host: overseerr.local
|
||||||
paths:
|
paths:
|
||||||
- path: /
|
- path: /
|
||||||
pathType: ImplementExact
|
pathType: Prefix
|
||||||
tls: []
|
tls: []
|
||||||
# - secretName: chart-example-tls
|
# - secretName: overseerr-tls
|
||||||
# hosts:
|
# hosts:
|
||||||
# - chart-example.local
|
# - overseerr.local
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
|
23
plex/.helmignore
Normal file
23
plex/.helmignore
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# Patterns to ignore when building packages.
|
||||||
|
# This supports shell glob matching, relative path matching, and
|
||||||
|
# negation (prefixed with !). Only one pattern per line.
|
||||||
|
.DS_Store
|
||||||
|
# Common VCS dirs
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
.bzr/
|
||||||
|
.bzrignore
|
||||||
|
.hg/
|
||||||
|
.hgignore
|
||||||
|
.svn/
|
||||||
|
# Common backup files
|
||||||
|
*.swp
|
||||||
|
*.bak
|
||||||
|
*.tmp
|
||||||
|
*.orig
|
||||||
|
*~
|
||||||
|
# Various IDEs
|
||||||
|
.project
|
||||||
|
.idea/
|
||||||
|
*.tmproj
|
||||||
|
.vscode/
|
24
plex/Chart.yaml
Normal file
24
plex/Chart.yaml
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
apiVersion: v2
|
||||||
|
name: plex
|
||||||
|
description: A Helm chart for Kubernetes
|
||||||
|
|
||||||
|
# A chart can be either an 'application' or a 'library' chart.
|
||||||
|
#
|
||||||
|
# Application charts are a collection of templates that can be packaged into versioned archives
|
||||||
|
# to be deployed.
|
||||||
|
#
|
||||||
|
# Library charts provide useful utilities or functions for the chart developer. They're included as
|
||||||
|
# a dependency of application charts to inject those utilities and functions into the rendering
|
||||||
|
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
|
||||||
|
type: application
|
||||||
|
|
||||||
|
# This is the chart version. This version number should be incremented each time you make changes
|
||||||
|
# to the chart and its templates, including the app version.
|
||||||
|
# Versions are expected to follow Semantic Versioning (https://semver.org/)
|
||||||
|
version: 0.1.0
|
||||||
|
|
||||||
|
# This is the version number of the application being deployed. This version number should be
|
||||||
|
# incremented each time you make changes to the application. Versions are not expected to
|
||||||
|
# follow Semantic Versioning. They should reflect the version the application is using.
|
||||||
|
# It is recommended to use it with quotes.
|
||||||
|
appVersion: "1.16.0"
|
22
plex/templates/NOTES.txt
Normal file
22
plex/templates/NOTES.txt
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
1. Get the application URL by running these commands:
|
||||||
|
{{- if .Values.ingress.enabled }}
|
||||||
|
{{- range $host := .Values.ingress.hosts }}
|
||||||
|
{{- range .paths }}
|
||||||
|
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- else if contains "NodePort" .Values.service.type }}
|
||||||
|
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "plex.fullname" . }})
|
||||||
|
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||||
|
echo http://$NODE_IP:$NODE_PORT
|
||||||
|
{{- else if contains "LoadBalancer" .Values.service.type }}
|
||||||
|
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
||||||
|
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "plex.fullname" . }}'
|
||||||
|
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "plex.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
||||||
|
echo http://$SERVICE_IP:{{ .Values.service.port }}
|
||||||
|
{{- else if contains "ClusterIP" .Values.service.type }}
|
||||||
|
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "plex.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
|
||||||
|
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
|
||||||
|
echo "Visit http://127.0.0.1:8080 to use your application"
|
||||||
|
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
|
||||||
|
{{- end }}
|
62
plex/templates/_helpers.tpl
Normal file
62
plex/templates/_helpers.tpl
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
{{/*
|
||||||
|
Expand the name of the chart.
|
||||||
|
*/}}
|
||||||
|
{{- define "plex.name" -}}
|
||||||
|
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create a default fully qualified app name.
|
||||||
|
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||||
|
If release name contains chart name it will be used as a full name.
|
||||||
|
*/}}
|
||||||
|
{{- define "plex.fullname" -}}
|
||||||
|
{{- if .Values.fullnameOverride }}
|
||||||
|
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- else }}
|
||||||
|
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||||
|
{{- if contains $name .Release.Name }}
|
||||||
|
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- else }}
|
||||||
|
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create chart name and version as used by the chart label.
|
||||||
|
*/}}
|
||||||
|
{{- define "plex.chart" -}}
|
||||||
|
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Common labels
|
||||||
|
*/}}
|
||||||
|
{{- define "plex.labels" -}}
|
||||||
|
helm.sh/chart: {{ include "plex.chart" . }}
|
||||||
|
{{ include "plex.selectorLabels" . }}
|
||||||
|
{{- if .Chart.AppVersion }}
|
||||||
|
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||||
|
{{- end }}
|
||||||
|
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Selector labels
|
||||||
|
*/}}
|
||||||
|
{{- define "plex.selectorLabels" -}}
|
||||||
|
app.kubernetes.io/name: {{ include "plex.name" . }}
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create the name of the service account to use
|
||||||
|
*/}}
|
||||||
|
{{- define "plex.serviceAccountName" -}}
|
||||||
|
{{- if .Values.serviceAccount.create }}
|
||||||
|
{{- default (include "plex.fullname" .) .Values.serviceAccount.name }}
|
||||||
|
{{- else }}
|
||||||
|
{{- default "default" .Values.serviceAccount.name }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
134
plex/templates/deployment.yaml
Normal file
134
plex/templates/deployment.yaml
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: {{ include "plex.fullname" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "plex.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
replicas: {{ .Values.replicaCount }}
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
{{- include "plex.selectorLabels" . | nindent 6 }}
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
{{- include "plex.selectorLabels" . | nindent 8 }}
|
||||||
|
spec:
|
||||||
|
{{- with .Values.imagePullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
securityContext:
|
||||||
|
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||||
|
containers:
|
||||||
|
- name: {{ .Chart.Name }}
|
||||||
|
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||||
|
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||||
|
env:
|
||||||
|
- name: TZ
|
||||||
|
value: {{ .Values.env.TZ | quote }}
|
||||||
|
- name: PUID
|
||||||
|
value: {{ .Values.securityContext.PUID | quote }}
|
||||||
|
- name: PGID
|
||||||
|
value: {{ .Values.securityContext.PGID | quote }}
|
||||||
|
- name: VERSION
|
||||||
|
value: {{ .Values.env.VERSION | quote }}
|
||||||
|
{{- if .Values.env.PLEX_CLAIM }}
|
||||||
|
- name: PLEX_CLAIM
|
||||||
|
value: {{ .Values.env.PLEX_CLAIM | quote }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
containerPort: {{ .Values.service.port }}
|
||||||
|
protocol: TCP
|
||||||
|
{{- range .Values.service.additional }}
|
||||||
|
- name: {{ .name }}
|
||||||
|
containerPort: {{ .port }}
|
||||||
|
protocol: {{ .protocol }}
|
||||||
|
{{- end }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: config
|
||||||
|
mountPath: {{ .Values.persistence.config.mountPath }}
|
||||||
|
- name: transcode
|
||||||
|
mountPath: {{ .Values.persistence.transcode.mountPath }}
|
||||||
|
- name: data
|
||||||
|
mountPath: {{ .Values.persistence.data.mountPath }}
|
||||||
|
{{- if .Values.transcoding.hardware.enabled }}
|
||||||
|
{{- if .Values.transcoding.hardware.intel }}
|
||||||
|
- name: dev-dri
|
||||||
|
mountPath: /dev/dri
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.transcoding.hardware.nvidia }}
|
||||||
|
- name: nvidia
|
||||||
|
mountPath: /usr/lib/nvidia
|
||||||
|
- name: nvidia-dev
|
||||||
|
mountPath: /dev/nvidia0
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /identity
|
||||||
|
port: http
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /identity
|
||||||
|
port: http
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
periodSeconds: 10
|
||||||
|
resources:
|
||||||
|
{{- toYaml .Values.resources | nindent 12 }}
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
{{- if .Values.persistence.config.enabled }}
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: {{ include "plex.fullname" . }}-config
|
||||||
|
{{- else }}
|
||||||
|
emptyDir: {}
|
||||||
|
{{- end }}
|
||||||
|
- name: transcode
|
||||||
|
{{- if .Values.persistence.transcode.enabled }}
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: {{ include "plex.fullname" . }}-transcode
|
||||||
|
{{- else }}
|
||||||
|
emptyDir: {}
|
||||||
|
{{- end }}
|
||||||
|
- name: data
|
||||||
|
{{- if .Values.persistence.data.enabled }}
|
||||||
|
persistentVolumeClaim:
|
||||||
|
{{- if .Values.persistence.data.existingClaim }}
|
||||||
|
claimName: {{ .Values.persistence.data.existingClaim }}
|
||||||
|
{{- else }}
|
||||||
|
claimName: {{ include "plex.fullname" . }}-data
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
emptyDir: {}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.transcoding.hardware.enabled }}
|
||||||
|
{{- if .Values.transcoding.hardware.intel }}
|
||||||
|
- name: dev-dri
|
||||||
|
hostPath:
|
||||||
|
path: /dev/dri
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.transcoding.hardware.nvidia }}
|
||||||
|
- name: nvidia
|
||||||
|
hostPath:
|
||||||
|
path: /usr/lib/nvidia
|
||||||
|
- name: nvidia-dev
|
||||||
|
hostPath:
|
||||||
|
path: /dev/nvidia0
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.nodeSelector }}
|
||||||
|
nodeSelector:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.affinity }}
|
||||||
|
affinity:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.tolerations }}
|
||||||
|
tolerations:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
61
plex/templates/ingress.yaml
Normal file
61
plex/templates/ingress.yaml
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
{{- if .Values.ingress.enabled -}}
|
||||||
|
{{- $fullName := include "plex.fullname" . -}}
|
||||||
|
{{- $svcPort := .Values.service.port -}}
|
||||||
|
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
|
||||||
|
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
|
||||||
|
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||||
|
apiVersion: networking.k8s.io/v1beta1
|
||||||
|
{{- else -}}
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
{{- end }}
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: {{ $fullName }}
|
||||||
|
labels:
|
||||||
|
{{- include "plex.labels" . | nindent 4 }}
|
||||||
|
{{- with .Values.ingress.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
|
||||||
|
ingressClassName: {{ .Values.ingress.className }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.ingress.tls }}
|
||||||
|
tls:
|
||||||
|
{{- range .Values.ingress.tls }}
|
||||||
|
- hosts:
|
||||||
|
{{- range .hosts }}
|
||||||
|
- {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
|
secretName: {{ .secretName }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
rules:
|
||||||
|
{{- range .Values.ingress.hosts }}
|
||||||
|
- host: {{ .host | quote }}
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
{{- range .paths }}
|
||||||
|
- path: {{ .path }}
|
||||||
|
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
|
||||||
|
pathType: {{ .pathType }}
|
||||||
|
{{- end }}
|
||||||
|
backend:
|
||||||
|
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
|
||||||
|
service:
|
||||||
|
name: {{ $fullName }}
|
||||||
|
port:
|
||||||
|
number: {{ $svcPort }}
|
||||||
|
{{- else }}
|
||||||
|
serviceName: {{ $fullName }}
|
||||||
|
servicePort: {{ $svcPort }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
53
plex/templates/pvc.yaml
Normal file
53
plex/templates/pvc.yaml
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
{{- if .Values.persistence.config.enabled }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: {{ include "plex.fullname" . }}-config
|
||||||
|
labels:
|
||||||
|
{{- include "plex.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- {{ .Values.persistence.config.accessMode | quote }}
|
||||||
|
{{- if .Values.persistence.config.storageClass }}
|
||||||
|
storageClassName: {{ .Values.persistence.config.storageClass | quote }}
|
||||||
|
{{- end }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.persistence.config.size | quote }}
|
||||||
|
{{- end }}
|
||||||
|
---
|
||||||
|
{{- if .Values.persistence.transcode.enabled }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: {{ include "plex.fullname" . }}-transcode
|
||||||
|
labels:
|
||||||
|
{{- include "plex.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- {{ .Values.persistence.transcode.accessMode | quote }}
|
||||||
|
{{- if .Values.persistence.transcode.storageClass }}
|
||||||
|
storageClassName: {{ .Values.persistence.transcode.storageClass | quote }}
|
||||||
|
{{- end }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.persistence.transcode.size | quote }}
|
||||||
|
{{- end }}
|
||||||
|
---
|
||||||
|
{{- if and .Values.persistence.data.enabled (not .Values.persistence.data.existingClaim) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: {{ include "plex.fullname" . }}-data
|
||||||
|
labels:
|
||||||
|
{{- include "plex.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- {{ .Values.persistence.data.accessMode | quote }}
|
||||||
|
{{- if .Values.persistence.data.storageClass }}
|
||||||
|
storageClassName: {{ .Values.persistence.data.storageClass | quote }}
|
||||||
|
{{- end }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.persistence.data.size | quote }}
|
||||||
|
{{- end }}
|
21
plex/templates/service.yaml
Normal file
21
plex/templates/service.yaml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{ include "plex.fullname" . }}
|
||||||
|
labels:
|
||||||
|
{{- include "plex.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
type: {{ .Values.service.type }}
|
||||||
|
ports:
|
||||||
|
- port: {{ .Values.service.port }}
|
||||||
|
targetPort: http
|
||||||
|
protocol: TCP
|
||||||
|
name: http
|
||||||
|
{{- range .Values.service.additional }}
|
||||||
|
- port: {{ .port }}
|
||||||
|
targetPort: {{ .name }}
|
||||||
|
protocol: {{ .protocol }}
|
||||||
|
name: {{ .name }}
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
{{- include "plex.selectorLabels" . | nindent 4 }}
|
15
plex/templates/tests/test-connection.yaml
Normal file
15
plex/templates/tests/test-connection.yaml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
name: "{{ include "plex.fullname" . }}-test-connection"
|
||||||
|
labels:
|
||||||
|
{{- include "plex.labels" . | nindent 4 }}
|
||||||
|
annotations:
|
||||||
|
"helm.sh/hook": test
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: wget
|
||||||
|
image: busybox
|
||||||
|
command: ['wget']
|
||||||
|
args: ['{{ include "plex.fullname" . }}:{{ .Values.service.port }}']
|
||||||
|
restartPolicy: Never
|
116
plex/values.yaml
Normal file
116
plex/values.yaml
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
# Default values for plex.
|
||||||
|
# This is a YAML-formatted file.
|
||||||
|
# Declare variables to be passed into your templates.
|
||||||
|
|
||||||
|
replicaCount: 1
|
||||||
|
|
||||||
|
image:
|
||||||
|
repository: linuxserver/plex
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
tag: "latest"
|
||||||
|
|
||||||
|
# Security context for the container
|
||||||
|
podSecurityContext:
|
||||||
|
runAsUser: 1000
|
||||||
|
runAsGroup: 1000
|
||||||
|
fsGroup: 1000
|
||||||
|
|
||||||
|
# Configurable user and group IDs
|
||||||
|
securityContext:
|
||||||
|
PUID: 1000
|
||||||
|
PGID: 1000
|
||||||
|
|
||||||
|
service:
|
||||||
|
type: ClusterIP
|
||||||
|
port: 32400
|
||||||
|
# Additional ports for Plex
|
||||||
|
additional:
|
||||||
|
- name: dlna-tcp
|
||||||
|
port: 32469
|
||||||
|
protocol: TCP
|
||||||
|
- name: dlna-udp
|
||||||
|
port: 1900
|
||||||
|
protocol: UDP
|
||||||
|
- name: gdm1
|
||||||
|
port: 32410
|
||||||
|
protocol: UDP
|
||||||
|
- name: gdm2
|
||||||
|
port: 32412
|
||||||
|
protocol: UDP
|
||||||
|
- name: gdm3
|
||||||
|
port: 32413
|
||||||
|
protocol: UDP
|
||||||
|
- name: gdm4
|
||||||
|
port: 32414
|
||||||
|
protocol: UDP
|
||||||
|
|
||||||
|
# Environment variables
|
||||||
|
env:
|
||||||
|
TZ: "UTC"
|
||||||
|
# Version of plex to install
|
||||||
|
VERSION: "latest"
|
||||||
|
# Claim token from plex.tv/claim
|
||||||
|
PLEX_CLAIM: ""
|
||||||
|
|
||||||
|
# Persistence configuration
|
||||||
|
persistence:
|
||||||
|
config:
|
||||||
|
enabled: true
|
||||||
|
storageClass: ""
|
||||||
|
accessMode: ReadWriteOnce
|
||||||
|
size: 10Gi
|
||||||
|
mountPath: /config
|
||||||
|
transcode:
|
||||||
|
enabled: true
|
||||||
|
storageClass: ""
|
||||||
|
accessMode: ReadWriteOnce
|
||||||
|
size: 20Gi
|
||||||
|
mountPath: /transcode
|
||||||
|
data:
|
||||||
|
enabled: true
|
||||||
|
storageClass: ""
|
||||||
|
accessMode: ReadWriteOnce
|
||||||
|
size: 100Gi
|
||||||
|
mountPath: /data
|
||||||
|
# Optional: Use existing PVC
|
||||||
|
existingClaim: ""
|
||||||
|
|
||||||
|
# Hardware transcoding support
|
||||||
|
# Note: Requires compatible hardware and drivers
|
||||||
|
transcoding:
|
||||||
|
hardware:
|
||||||
|
enabled: false
|
||||||
|
# Intel GPU
|
||||||
|
intel: false
|
||||||
|
# Nvidia GPU
|
||||||
|
nvidia: false
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: false
|
||||||
|
className: "nginx"
|
||||||
|
annotations: {}
|
||||||
|
# kubernetes.io/ingress.class: nginx
|
||||||
|
# kubernetes.io/tls-acme: "true"
|
||||||
|
# nginx.ingress.kubernetes.io/rewrite-target: /
|
||||||
|
# nginx.ingress.kubernetes.io/ssl-redirect: "false"
|
||||||
|
hosts:
|
||||||
|
- host: plex.local
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
tls: []
|
||||||
|
# - secretName: plex-tls
|
||||||
|
# hosts:
|
||||||
|
# - plex.local
|
||||||
|
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: 4000m
|
||||||
|
memory: 4Gi
|
||||||
|
requests:
|
||||||
|
cpu: 1000m
|
||||||
|
memory: 1Gi
|
||||||
|
|
||||||
|
nodeSelector: {}
|
||||||
|
tolerations: []
|
||||||
|
affinity: {}
|
@ -67,13 +67,13 @@ persistence:
|
|||||||
|
|
||||||
ingress:
|
ingress:
|
||||||
enabled: false
|
enabled: false
|
||||||
className: ""
|
className: "nginx"
|
||||||
annotations: {}
|
annotations: {}
|
||||||
hosts:
|
hosts:
|
||||||
- host: chart-example.local
|
- host: qbittorrent.local
|
||||||
paths:
|
paths:
|
||||||
- path: /
|
- path: /
|
||||||
pathType: ImplementExact
|
pathType: Prefix
|
||||||
tls: []
|
tls: []
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
|
@ -42,13 +42,13 @@ service:
|
|||||||
|
|
||||||
ingress:
|
ingress:
|
||||||
enabled: false
|
enabled: false
|
||||||
className: ""
|
className: "nginx"
|
||||||
annotations: {}
|
annotations: {}
|
||||||
hosts:
|
hosts:
|
||||||
- host: chart-example.local
|
- host: radarr.local
|
||||||
paths:
|
paths:
|
||||||
- path: /
|
- path: /
|
||||||
pathType: ImplementExact
|
pathType: Prefix
|
||||||
tls: []
|
tls: []
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
|
@ -42,13 +42,13 @@ service:
|
|||||||
|
|
||||||
ingress:
|
ingress:
|
||||||
enabled: false
|
enabled: false
|
||||||
className: ""
|
className: "nginx"
|
||||||
annotations: {}
|
annotations: {}
|
||||||
hosts:
|
hosts:
|
||||||
- host: chart-example.local
|
- host: sonarr.local
|
||||||
paths:
|
paths:
|
||||||
- path: /
|
- path: /
|
||||||
pathType: ImplementExact
|
pathType: Prefix
|
||||||
tls: []
|
tls: []
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
|
Reference in New Issue
Block a user