diff --git a/charts/jellyfin/Chart.yaml b/charts/jellyfin/Chart.yaml
index 5c24a48..bd6a3bb 100644
--- a/charts/jellyfin/Chart.yaml
+++ b/charts/jellyfin/Chart.yaml
@@ -13,4 +13,8 @@ appVersion: 10.11.2
annotations:
artifacthub.io/changes: |
- kind: added
+ description: Add comprehensive IPv6 and dual-stack networking documentation
+ - kind: changed
+ description: Improve health probe configuration examples for IPv6 compatibility
+ - kind: changed
description: Add revisionHistoryLimit parameter to control rollback history retention (defaults to 3 instead of Kubernetes default 10)
diff --git a/charts/jellyfin/README.md b/charts/jellyfin/README.md
index 10952b6..d330a84 100644
--- a/charts/jellyfin/README.md
+++ b/charts/jellyfin/README.md
@@ -1,6 +1,6 @@
# jellyfin
-  
+  
A Helm chart for Jellyfin Media Server
@@ -69,7 +69,7 @@ helm install my-jellyfin jellyfin/jellyfin -f values.yaml
| jellyfin.command | list | `[]` | Custom command to use as container entrypoint. |
| jellyfin.enableDLNA | bool | `false` | Enable DLNA. Requires host network. See: https://jellyfin.org/docs/general/networking/dlna.html |
| jellyfin.env | list | `[]` | Additional environment variables for the container. |
-| livenessProbe | object | `{"initialDelaySeconds":10,"tcpSocket":{"port":"http"}}` | Configure liveness probe for Jellyfin. |
+| livenessProbe | object | `{"httpGet":{"path":"/health","port":"http"},"initialDelaySeconds":10}` | Configure liveness probe for Jellyfin. Uses httpGet for compatibility with both IPv4 and IPv6. |
| metrics | object | `{"enabled":false,"serviceMonitor":{"enabled":false,"interval":"30s","labels":{},"metricRelabelings":[],"namespace":"","path":"/metrics","port":8096,"relabelings":[],"scheme":"http","scrapeTimeout":"30s","targetLabels":[],"tlsConfig":{}}}` | Configuration for metrics collection and monitoring |
| metrics.enabled | bool | `false` | Enable or disable metrics collection |
| metrics.serviceMonitor | object | `{"enabled":false,"interval":"30s","labels":{},"metricRelabelings":[],"namespace":"","path":"/metrics","port":8096,"relabelings":[],"scheme":"http","scrapeTimeout":"30s","targetLabels":[],"tlsConfig":{}}` | Configuration for the Prometheus ServiceMonitor |
@@ -107,14 +107,14 @@ helm install my-jellyfin jellyfin/jellyfin -f values.yaml
| podPrivileges.hostPID | bool | `false` | Enable hostPID namespace. Allows pod to see processes on the host. |
| podSecurityContext | object | `{}` | Security context for the pod. |
| priorityClassName | string | `""` | Define a priorityClassName for the pod. |
-| readinessProbe | object | `{"initialDelaySeconds":10,"tcpSocket":{"port":"http"}}` | Configure readiness probe for Jellyfin. |
+| readinessProbe | object | `{"httpGet":{"path":"/health","port":"http"},"initialDelaySeconds":10}` | Configure readiness probe for Jellyfin. Uses httpGet for compatibility with both IPv4 and IPv6. |
| replicaCount | int | `1` | Number of Jellyfin replicas to start. Should be left at 1. |
| resources | object | `{}` | Resource requests and limits for the Jellyfin container. |
| runtimeClassName | string | `""` | Define a custom runtimeClassName for the pod. |
| securityContext | object | `{}` | Security context for the container. |
| service.annotations | object | `{}` | Annotations for the service. |
-| service.ipFamilies | list | `[]` | Supported IP families (IPv4, IPv6). |
-| service.ipFamilyPolicy | string | `""` | Configure dual-stack IP family policy. See: https://kubernetes.io/docs/concepts/services-networking/dual-stack/ |
+| service.ipFamilies | list | `[]` | Supported IP families (IPv4, IPv6). Examples: IPv4 only: ["IPv4"] IPv6 only: ["IPv6"] Dual-stack (IPv4 primary): ["IPv4", "IPv6"] Dual-stack (IPv6 primary): ["IPv6", "IPv4"] Note: When using IPv6, ensure your health checks are compatible (consider using httpGet instead of tcpSocket) |
+| service.ipFamilyPolicy | string | `""` | Configure dual-stack IP family policy. See: https://kubernetes.io/docs/concepts/services-networking/dual-stack/ Options: SingleStack, PreferDualStack, RequireDualStack For IPv6-only clusters, use "SingleStack" with ipFamilies: ["IPv6"] For dual-stack, use "PreferDualStack" or "RequireDualStack" with ipFamilies: ["IPv4", "IPv6"] or ["IPv6", "IPv4"] |
| service.labels | object | `{}` | Labels for the service. |
| service.loadBalancerClass | string | `""` | Class of the LoadBalancer. |
| service.loadBalancerIP | string | `""` | Specific IP address for the LoadBalancer. |
@@ -160,3 +160,32 @@ extraVolumeMounts:
- name: hwa
mountPath: /dev/dri
```
+
+## IPv6 Configuration
+
+This chart supports IPv6 and dual-stack networking configurations out of the box. Health probes use httpGet by default for compatibility with both IPv4 and IPv6.
+
+### IPv6-only Configuration
+
+For IPv6-only clusters:
+
+```yaml
+service:
+ ipFamilyPolicy: SingleStack
+ ipFamilies:
+ - IPv6
+```
+
+### Dual-stack Configuration
+
+For dual-stack clusters (both IPv4 and IPv6):
+
+```yaml
+service:
+ ipFamilyPolicy: PreferDualStack # or RequireDualStack
+ ipFamilies:
+ - IPv4
+ - IPv6 # First family in the list is the primary
+```
+
+For more information about Kubernetes dual-stack networking, see:
diff --git a/charts/jellyfin/README.md.gotmpl b/charts/jellyfin/README.md.gotmpl
index ee08a35..90546e6 100644
--- a/charts/jellyfin/README.md.gotmpl
+++ b/charts/jellyfin/README.md.gotmpl
@@ -85,3 +85,32 @@ extraVolumeMounts:
- name: hwa
mountPath: /dev/dri
```
+
+## IPv6 Configuration
+
+This chart supports IPv6 and dual-stack networking configurations out of the box. Health probes use httpGet by default for compatibility with both IPv4 and IPv6.
+
+### IPv6-only Configuration
+
+For IPv6-only clusters:
+
+```yaml
+service:
+ ipFamilyPolicy: SingleStack
+ ipFamilies:
+ - IPv6
+```
+
+### Dual-stack Configuration
+
+For dual-stack clusters (both IPv4 and IPv6):
+
+```yaml
+service:
+ ipFamilyPolicy: PreferDualStack # or RequireDualStack
+ ipFamilies:
+ - IPv4
+ - IPv6 # First family in the list is the primary
+```
+
+For more information about Kubernetes dual-stack networking, see:
diff --git a/charts/jellyfin/templates/NOTES.txt b/charts/jellyfin/templates/NOTES.txt
index 83dd7c5..4abcf3a 100644
--- a/charts/jellyfin/templates/NOTES.txt
+++ b/charts/jellyfin/templates/NOTES.txt
@@ -22,6 +22,24 @@ To access Jellyfin, you can use port-forwarding:
Then visit http://localhost:{{ .Values.service.port }} in your browser.
{{- end }}
+{{- if or .Values.service.ipFamilyPolicy .Values.service.ipFamilies }}
+
+Service IP Configuration:
+{{- if .Values.service.ipFamilyPolicy }}
+ IP Family Policy: {{ .Values.service.ipFamilyPolicy }}
+{{- end }}
+{{- if .Values.service.ipFamilies }}
+ IP Families: {{ .Values.service.ipFamilies | join ", " }}
+ {{- if eq (index .Values.service.ipFamilies 0) "IPv6" }}
+ ⚠ NOTE: IPv6 primary - ensure your probes use httpGet instead of tcpSocket for compatibility
+ {{- end }}
+ {{- if has "IPv6" .Values.service.ipFamilies }}
+ {{- if not .Values.service.ipFamilyPolicy }}
+ ⚠ WARNING: ipFamilies includes IPv6 but ipFamilyPolicy is not set
+ {{- end }}
+ {{- end }}
+{{- end }}
+{{- end }}
Deployment Configuration:
Revision History Limit: {{ .Values.revisionHistoryLimit }}
{{- $limit := int .Values.revisionHistoryLimit }}
diff --git a/charts/jellyfin/tests/service_ipv6_test.yaml b/charts/jellyfin/tests/service_ipv6_test.yaml
new file mode 100644
index 0000000..5dee731
--- /dev/null
+++ b/charts/jellyfin/tests/service_ipv6_test.yaml
@@ -0,0 +1,128 @@
+suite: test service ipv6 and dual-stack
+templates:
+ - service.yaml
+tests:
+ - it: should not set ipFamilyPolicy by default
+ asserts:
+ - isNull:
+ path: spec.ipFamilyPolicy
+
+ - it: should not set ipFamilies by default
+ asserts:
+ - isNull:
+ path: spec.ipFamilies
+
+ - it: should set ipFamilyPolicy when specified
+ set:
+ service.ipFamilyPolicy: PreferDualStack
+ asserts:
+ - equal:
+ path: spec.ipFamilyPolicy
+ value: PreferDualStack
+
+ - it: should support SingleStack policy
+ set:
+ service.ipFamilyPolicy: SingleStack
+ asserts:
+ - equal:
+ path: spec.ipFamilyPolicy
+ value: SingleStack
+
+ - it: should support RequireDualStack policy
+ set:
+ service.ipFamilyPolicy: RequireDualStack
+ asserts:
+ - equal:
+ path: spec.ipFamilyPolicy
+ value: RequireDualStack
+
+ - it: should set ipFamilies for IPv4 only
+ set:
+ service.ipFamilies:
+ - IPv4
+ asserts:
+ - equal:
+ path: spec.ipFamilies[0]
+ value: IPv4
+
+ - it: should set ipFamilies for IPv6 only
+ set:
+ service.ipFamilies:
+ - IPv6
+ asserts:
+ - equal:
+ path: spec.ipFamilies[0]
+ value: IPv6
+
+ - it: should set ipFamilies for dual-stack IPv4 primary
+ set:
+ service.ipFamilies:
+ - IPv4
+ - IPv6
+ asserts:
+ - equal:
+ path: spec.ipFamilies[0]
+ value: IPv4
+ - equal:
+ path: spec.ipFamilies[1]
+ value: IPv6
+
+ - it: should set ipFamilies for dual-stack IPv6 primary
+ set:
+ service.ipFamilies:
+ - IPv6
+ - IPv4
+ asserts:
+ - equal:
+ path: spec.ipFamilies[0]
+ value: IPv6
+ - equal:
+ path: spec.ipFamilies[1]
+ value: IPv4
+
+ - it: should work with PreferDualStack and both families
+ set:
+ service.ipFamilyPolicy: PreferDualStack
+ service.ipFamilies:
+ - IPv4
+ - IPv6
+ asserts:
+ - equal:
+ path: spec.ipFamilyPolicy
+ value: PreferDualStack
+ - equal:
+ path: spec.ipFamilies[0]
+ value: IPv4
+ - equal:
+ path: spec.ipFamilies[1]
+ value: IPv6
+
+ - it: should work with RequireDualStack and both families
+ set:
+ service.ipFamilyPolicy: RequireDualStack
+ service.ipFamilies:
+ - IPv6
+ - IPv4
+ asserts:
+ - equal:
+ path: spec.ipFamilyPolicy
+ value: RequireDualStack
+ - equal:
+ path: spec.ipFamilies[0]
+ value: IPv6
+ - equal:
+ path: spec.ipFamilies[1]
+ value: IPv4
+
+ - it: should work with SingleStack IPv6 only
+ set:
+ service.ipFamilyPolicy: SingleStack
+ service.ipFamilies:
+ - IPv6
+ asserts:
+ - equal:
+ path: spec.ipFamilyPolicy
+ value: SingleStack
+ - equal:
+ path: spec.ipFamilies[0]
+ value: IPv6
diff --git a/charts/jellyfin/values.yaml b/charts/jellyfin/values.yaml
index 9ea02d5..4ff8e53 100644
--- a/charts/jellyfin/values.yaml
+++ b/charts/jellyfin/values.yaml
@@ -91,8 +91,17 @@ service:
# -- Service type (ClusterIP, NodePort, or LoadBalancer).
type: ClusterIP
# -- Configure dual-stack IP family policy. See: https://kubernetes.io/docs/concepts/services-networking/dual-stack/
+ # Options: SingleStack, PreferDualStack, RequireDualStack
+ # For IPv6-only clusters, use "SingleStack" with ipFamilies: ["IPv6"]
+ # For dual-stack, use "PreferDualStack" or "RequireDualStack" with ipFamilies: ["IPv4", "IPv6"] or ["IPv6", "IPv4"]
ipFamilyPolicy: ""
# -- Supported IP families (IPv4, IPv6).
+ # Examples:
+ # IPv4 only: ["IPv4"]
+ # IPv6 only: ["IPv6"]
+ # Dual-stack (IPv4 primary): ["IPv4", "IPv6"]
+ # Dual-stack (IPv6 primary): ["IPv6", "IPv4"]
+ # Note: When using IPv6, ensure your health checks are compatible (consider using httpGet instead of tcpSocket)
ipFamilies: []
# -- Specific IP address for the LoadBalancer.
loadBalancerIP: ""
@@ -140,20 +149,24 @@ resources: {}
# memory: 128Mi
# -- Configure liveness probe for Jellyfin.
+# Uses httpGet for compatibility with both IPv4 and IPv6.
livenessProbe:
- initialDelaySeconds: 10
- tcpSocket:
+ httpGet:
+ path: /health
port: http
+ initialDelaySeconds: 10
# successThreshold: 1
# failureThreshold: 3
# timeoutSeconds: 1
# periodSeconds: 10
# -- Configure readiness probe for Jellyfin.
+# Uses httpGet for compatibility with both IPv4 and IPv6.
readinessProbe:
- initialDelaySeconds: 10
- tcpSocket:
+ httpGet:
+ path: /health
port: http
+ initialDelaySeconds: 10
# successThreshold: 1
# failureThreshold: 3
# timeoutSeconds: 1