add qbittorrent

This commit is contained in:
2025-05-10 17:18:15 +02:00
parent 61eb4dfb88
commit 18dd6b42d3
13 changed files with 542 additions and 14 deletions

View File

@ -3,7 +3,7 @@ entries:
jackett:
- apiVersion: v2
appVersion: 1.16.0
created: "2025-05-10T02:15:34.421399+02:00"
created: "2025-05-10T17:17:56.406645+02:00"
description: A Helm chart for Kubernetes
digest: cb583d90a982e50cb0028e2d8d2afce93ef8f64dc202ddffd59262a74ff33fe1
name: jackett
@ -14,7 +14,7 @@ entries:
overseerr:
- apiVersion: v2
appVersion: 1.16.0
created: "2025-05-10T02:15:34.421902+02:00"
created: "2025-05-10T17:17:56.407314+02:00"
description: A Helm chart for Kubernetes
digest: ac634ebbb7000644e02606157bedbc8ab6e3dd59d22d8ee699093d0f683a2899
name: overseerr
@ -25,7 +25,7 @@ entries:
owncloud:
- apiVersion: v2
appVersion: 1.16.0
created: "2025-05-10T02:15:34.4237+02:00"
created: "2025-05-10T17:17:56.408806+02:00"
description: A Helm chart for Kubernetes
digest: 9a1724f504cc46baffa8dbaff5e3f5b7f3c07d64143643acb3f653b07868e963
name: owncloud
@ -36,7 +36,7 @@ entries:
plex:
- apiVersion: v2
appVersion: 1.16.0
created: "2025-05-10T02:15:34.424157+02:00"
created: "2025-05-10T17:17:56.410833+02:00"
description: A Helm chart for Kubernetes
digest: 52d474c17f631c86fcc5d4eeeff6ec75d3121ea9317a00a9b200d5b7550281a0
name: plex
@ -47,7 +47,7 @@ entries:
prowlarr:
- apiVersion: v2
appVersion: 1.0.0
created: "2025-05-10T02:15:34.42456+02:00"
created: "2025-05-10T17:17:56.411341+02:00"
description: A Helm chart for Prowlarr - indexer manager/proxy for Sonarr, Radarr,
etc.
digest: 18a3cb2ebdfa9c5f73c341e92b6a4f152e6143d77ad51f7efbc7215f9c88171c
@ -58,10 +58,10 @@ entries:
version: 0.1.0
qbittorrent:
- apiVersion: v2
appVersion: 1.16.0
created: "2025-05-10T02:15:34.425003+02:00"
description: A Helm chart for Kubernetes
digest: 962463c2a27832ad6dc9709a3be008f242e1b039d9da7579becfa0bb96f6e063
appVersion: 4.5.2
created: "2025-05-10T17:17:56.411643+02:00"
description: A Helm chart for qBittorrent - Open-source BitTorrent client
digest: 5e6a7b112faa6f61d697866bed64b8865a9ba31b36f71b572cd25bc8f2914530
name: qbittorrent
type: application
urls:
@ -70,7 +70,7 @@ entries:
radarr:
- apiVersion: v2
appVersion: 1.16.0
created: "2025-05-10T02:15:34.425508+02:00"
created: "2025-05-10T17:17:56.412051+02:00"
description: A Helm chart for Kubernetes
digest: 78b75bd7d472fadde70016881f54f3359293b39d6ea964344131cc5572bb2b2f
name: radarr
@ -81,7 +81,7 @@ entries:
readarr:
- apiVersion: v2
appVersion: 0.3.0
created: "2025-05-10T02:15:34.426732+02:00"
created: "2025-05-10T17:17:56.412498+02:00"
description: A Helm chart for Kubernetes
digest: 5f30c43141fba64f75c346f3ffb657f5d084ae2f941a42731092c91001aec4e4
name: readarr
@ -92,7 +92,7 @@ entries:
sonarr:
- apiVersion: v2
appVersion: 1.16.0
created: "2025-05-10T02:15:34.427103+02:00"
created: "2025-05-10T17:17:56.412897+02:00"
description: A Helm chart for Kubernetes
digest: ba9b24a526270d72b33d1918755baa182095f97fb4f38df16b5a833c8138d6dc
name: sonarr
@ -100,4 +100,4 @@ entries:
urls:
- sonarr-0.1.0.tgz
version: 0.1.0
generated: "2025-05-10T02:15:34.420902+02:00"
generated: "2025-05-10T17:17:56.405948+02:00"

Binary file not shown.

View File

@ -366,4 +366,16 @@ 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

23
qbittorrent/.helmignore Normal file
View 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
qbittorrent/Chart.yaml Normal file
View File

@ -0,0 +1,24 @@
apiVersion: v2
name: qbittorrent
description: A Helm chart for qBittorrent - Open-source BitTorrent client
# 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: "4.5.2"

79
qbittorrent/README.md Normal file
View File

@ -0,0 +1,79 @@
# qBittorrent Helm Chart
This chart installs [qBittorrent](https://www.qbittorrent.org/), an open-source BitTorrent client, in a Kubernetes cluster.
## Prerequisites
- Kubernetes 1.16+
- Helm 3.1.0+
- PV provisioner support in the underlying infrastructure
## Installation
```bash
# Add this repository
helm repo add media-charts https://your-repo-url/
# Install the chart with the release name "qbittorrent"
helm install qbittorrent media-charts/qbittorrent
```
## Configuration
The following table lists the configurable parameters for the qBittorrent chart and their default values.
| Parameter | Description | Default |
|--------------------------------------|-----------------------------------------------|--------------------------|
| `image.repository` | qBittorrent image repository | `linuxserver/qbittorrent`|
| `image.tag` | qBittorrent image tag | `latest` |
| `image.pullPolicy` | Image pull policy | `IfNotPresent` |
| `service.type` | Service type | `NodePort` |
| `service.webPort` | Web UI port | `8080` |
| `service.btPort` | BitTorrent port | `6881` |
| `service.webNodePort` | Node port for Web UI (if service.type=NodePort) | `30080` |
| `service.btNodePort` | Node port for BitTorrent (if service.type=NodePort) | `30881` |
| `persistence.config.claimName` | PVC name for config | `qbittorrent-config` |
| `persistence.downloads.claimName` | PVC name for downloads | `qbittorrent-downloads` |
## Using with MyAnonamouse (MAM)
This chart is configured with NodePort service type by default, which allows your qBittorrent instance to be directly accessible from the internet. This is necessary for private trackers like MyAnonamouse to properly connect to your client.
### Setting up for MyAnonamouse
1. **Port Forwarding Setup**:
- Ensure your router is configured to forward the BitTorrent port (default: 30881) to your Kubernetes node
- The port must be open in any firewalls between your Kubernetes cluster and the internet
2. **Client Configuration**:
- After installing qBittorrent, access the web UI
- Go to Tools > Options > Connection
- Set the "Port used for incoming connections" to match your service.btPort (default: 6881)
- Verify that "Use UPnP / NAT-PMP port forwarding from my router" is checked
3. **Testing Connectivity**:
- In qBittorrent, go to Tools > Options > Connection
- Click the "Test Port" button to verify external connectivity
- Alternatively, use an online port checking tool with your public IP and configured port
4. **MyAnonamouse Setup**:
- Log into MyAnonamouse and visit the "Connectable" link
- Your client should show as connectable with a green indicator
- If it's not connectable, verify your port forwarding configuration
### Security Considerations
Using NodePort exposes your qBittorrent client directly to the internet. To enhance security:
1. Enable qBittorrent's web UI authentication (enabled by default)
2. Consider using a VPN for additional privacy
3. Regularly update the qBittorrent image to get security patches
## Troubleshooting
If MyAnonamouse cannot connect to your client:
1. Verify that port forwarding is correctly set up on your router
2. Check that any firewalls (including cloud provider firewalls) allow the BitTorrent port
3. Ensure your Kubernetes node has a public IP or is properly NAT'ed
4. Try using a different port, as some ISPs block common BitTorrent ports

View 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 "qbittorrent.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 "qbittorrent.fullname" . }}'
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "qbittorrent.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
echo http://$SERVICE_IP:{{ .Values.service.webPort }}
{{- else if contains "ClusterIP" .Values.service.type }}
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "qbittorrent.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 }}

View File

@ -0,0 +1,51 @@
{{/*
Expand the name of the chart.
*/}}
{{- define "qbittorrent.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 "qbittorrent.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 "qbittorrent.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "qbittorrent.labels" -}}
helm.sh/chart: {{ include "qbittorrent.chart" . }}
{{ include "qbittorrent.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "qbittorrent.selectorLabels" -}}
app.kubernetes.io/name: {{ include "qbittorrent.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

View File

@ -0,0 +1,78 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "qbittorrent.fullname" . }}
labels:
{{- include "qbittorrent.labels" . | nindent 4 }}
spec:
replicas: 1
selector:
matchLabels:
{{- include "qbittorrent.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "qbittorrent.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 }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
{{- range .Values.env }}
- name: {{ .name }}
value: {{ .value | quote }}
{{- end }}
ports:
- name: web
containerPort: {{ .Values.service.webPort }}
protocol: TCP
- name: bittorrent
containerPort: {{ .Values.service.btPort }}
protocol: TCP
volumeMounts:
- name: config
mountPath: {{ .Values.persistence.config.mountPath }}
- name: downloads
mountPath: {{ .Values.persistence.downloads.mountPath }}
{{- with .Values.volumeMounts }}
{{- toYaml . | nindent 12 }}
{{- end }}
livenessProbe:
httpGet:
path: /
port: web
readinessProbe:
httpGet:
path: /
port: web
resources:
{{- toYaml .Values.resources | nindent 12 }}
volumes:
- name: config
persistentVolumeClaim:
claimName: {{ .Values.persistence.config.claimName }}
- name: downloads
persistentVolumeClaim:
claimName: {{ .Values.persistence.downloads.claimName }}
{{- with .Values.volumes }}
{{- toYaml . | nindent 8 }}
{{- 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 }}

View File

@ -0,0 +1,61 @@
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "qbittorrent.fullname" . -}}
{{- $svcPort := .Values.service.webPort -}}
{{- 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 "qbittorrent.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:
name: web
{{- else }}
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}

View File

@ -0,0 +1,27 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ .Values.persistence.config.claimName }}
labels:
{{- include "qbittorrent.labels" . | nindent 4 }}
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: standard
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ .Values.persistence.downloads.claimName }}
labels:
{{- include "qbittorrent.labels" . | nindent 4 }}
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standard

View File

@ -0,0 +1,25 @@
apiVersion: v1
kind: Service
metadata:
name: {{ include "qbittorrent.fullname" . }}
labels:
{{- include "qbittorrent.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.webPort }}
targetPort: web
protocol: TCP
name: web
{{- if and (eq .Values.service.type "NodePort") .Values.service.webNodePort }}
nodePort: {{ .Values.service.webNodePort }}
{{- end }}
- port: {{ .Values.service.btPort }}
targetPort: bittorrent
protocol: TCP
name: bittorrent
{{- if and (eq .Values.service.type "NodePort") .Values.service.btNodePort }}
nodePort: {{ .Values.service.btNodePort }}
{{- end }}
selector:
{{- include "qbittorrent.selectorLabels" . | nindent 4 }}

126
qbittorrent/values.yaml Normal file
View File

@ -0,0 +1,126 @@
# Default values for qbittorrent.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: linuxserver/qbittorrent
pullPolicy: IfNotPresent
tag: "latest"
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
serviceAccount:
# Specifies whether a service account should be created
create: false
# Automatically mount a ServiceAccount's API credentials?
automount: false
# Annotations to add to the service account
annotations: {}
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name: ""
podAnnotations: {}
podLabels: {}
podSecurityContext:
runAsUser: 0
runAsGroup: 0
fsGroup: 0
securityContext:
privileged: true
capabilities:
add:
- CHOWN
- FOWNER
- SETUID
- SETGID
service:
type: NodePort
webPort: 8080
btPort: 6881
webNodePort: 30080
btNodePort: 30881
ingress:
enabled: true
className: "nginx"
annotations:
cert-manager.io/cluster-issuer: "letsencrypt"
hosts:
- host: qbittorrent.media.mumme-it.de
paths:
- path: /
pathType: Prefix
tls:
- hosts:
- qbittorrent.media.mumme-it.de
secretName: qbittorrent-tls
resources:
limits:
cpu: 1000m
memory: 1Gi
requests:
cpu: 200m
memory: 256Mi
livenessProbe:
httpGet:
path: /
port: web
readinessProbe:
httpGet:
path: /
port: web
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# Additional volumes on the output Deployment definition.
volumes: []
# - name: foo
# secret:
# secretName: mysecret
# optional: false
# Additional volumeMounts on the output Deployment definition.
volumeMounts: []
# - name: foo
# mountPath: "/etc/foo"
# readOnly: true
nodeSelector: {}
tolerations: []
affinity: {}
# Environment variables
env:
- name: TZ
value: "Europe/Berlin"
- name: PUID
value: "0"
- name: PGID
value: "0"
- name: WEBUI_PORT
value: "8080"
# Persistence configuration
persistence:
config:
claimName: qbittorrent-config
mountPath: /config
downloads:
claimName: qbittorrent-downloads
mountPath: /downloads