Add networkPolicy section to values.yaml with comprehensive configuration options:
- enabled: boolean flag to enable/disable NetworkPolicy (default: false)
- policyTypes: configure Ingress and/or Egress policies
- ingress: control which pods/namespaces can access Jellyfin
- allowExternal: permit access from any namespace (default: true)
- podSelector/namespaceSelector: restrict access to specific pods/namespaces
- customRules: advanced ingress rules for complex scenarios
- egress: control outbound connections from Jellyfin
- allowDNS: permit DNS resolution (default: true, required)
- allowAllEgress: permit all internet access (default: true)
- restrictedEgress: high-security mode with HTTPS-only metadata access
- customRules: advanced egress rules
- metrics: automatic Prometheus integration configuration
All parameters include detailed documentation explaining:
- Purpose and usage
- Default values and recommended settings
- Examples for common scenarios
- Security implications
The configuration supports use cases from simple deployments to
zero-trust environments while maintaining sensible defaults.
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
Add comprehensive NetworkPolicy support for Jellyfin pod with:
- Ingress rules: configurable external access or namespace/pod selectors
- Egress rules: DNS resolution, metadata providers, custom rules
- Automatic Prometheus integration when metrics are enabled
- DLNA/hostNetwork detection with fail-safe error message
- Support for restrictedEgress mode for high-security environments
The NetworkPolicy is disabled by default to maintain backward compatibility.
When enabled, it provides fine-grained control over network traffic:
- Who can access Jellyfin (ingress)
- What external connections Jellyfin can make (egress)
NetworkPolicy requires CNI plugin support (Calico, Cilium, etc.) and
cannot be used with hostNetwork mode (DLNA). The template includes
validation to prevent misconfiguration.
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
Add support for loading environment variables from ConfigMap or Secret
resources using envFrom field, following Kubernetes best practices for
configuration management.
Changes:
- Add jellyfin.envFrom parameter in values.yaml
- Add envFrom section in deployment.yaml template (before env)
- Provide comprehensive documentation with examples
- Bump chart version 2.5.0 -> 2.6.0 (minor - new feature)
- Add changelog annotation for Artifact Hub
Use cases:
- Load multiple environment variables from ConfigMap without defining each one
- Load secrets from external secret management systems
- Separate configuration from chart values (12-factor app pattern)
- Simplify configuration for complex deployments
Example usage:
jellyfin:
envFrom:
- configMapRef:
name: jellyfin-config
- secretRef:
name: jellyfin-secrets
Follows standard Kubernetes patterns used by most community Helm charts.
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
BREAKING CHANGE: The 'initContainers' parameter is now deprecated in favor
of 'extraInitContainers' for naming consistency with 'extraContainers'.
Both parameters will work until 2030 for backward compatibility.
The previous implementation used '.Values.initContainers' in the template
but 'extraInitContainers' was defined in values.yaml, causing the feature
to be completely non-functional.
Changes:
- Fix extraInitContainers not working (was referencing wrong parameter)
- Add deprecated 'initContainers' parameter to values.yaml with @deprecated tag
- Update deployment.yaml to support both parameters with OR logic
- Add TODO comment to remove initContainers support after 2030
- Create NOTES.txt with:
- Deprecation warning when using initContainers
- Post-installation instructions for accessing Jellyfin
- Persistence status information
- Links to documentation
- Improve extraInitContainers documentation with usage example
- Bump chart version 2.5.0 -> 3.0.0 (major due to deprecation)
- Add comprehensive changelog to artifacthub.io/changes
Migration guide:
Old: initContainers: [...]
New: extraInitContainers: [...]
The old parameter will continue to work but users will see a deprecation
warning in NOTES.txt after installation.
Follows best practices from community charts (Prometheus, Elastic, etc.)
where 'extra*' prefix indicates user-provided extension points.
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
Add startupProbe to give Jellyfin sufficient time to start, especially
with large media libraries or slow storage. This prevents Kubernetes
from killing the pod during initial startup phase.
Changes:
- Add startupProbe configuration in values.yaml with sensible defaults
- failureThreshold: 30 (allows up to 5 minutes for startup)
- periodSeconds: 10
- Uses tcpSocket check on http port
- Update deployment.yaml to include startupProbe from values
- Bump chart version 2.5.0 -> 2.5.1
- Add changelog annotation for Artifact Hub
Benefits:
- Prevents pod restarts during slow initial startup (large media libraries)
- Liveness and readiness probes remain responsive after successful startup
- Fully configurable and can be disabled by setting startupProbe: null
- No breaking changes, backward compatible
The startup probe gives Jellyfin up to 5 minutes (30 attempts * 10 seconds)
to complete initialization. After the first success, liveness and readiness
probes take over with their normal timing.
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
Add comprehensive troubleshooting documentation for inotify instance limit
errors that cause Jellyfin crashes in environments with many containers.
Changes:
- Add Troubleshooting section to README with inotify limits explanation
- Document proper solution: increase kernel limits via sysctl
- Provide workaround for managed clusters: DOTNET_USE_POLLING_FILE_WATCHER
- Add commented example in values.yaml for easy copy-paste
- Update Chart version from 2.5.0 to 2.5.1
- Add Artifact Hub changelog annotation
The proper solution is to increase inotify limits on Kubernetes nodes:
```bash
sysctl -w fs.inotify.max_user_instances=512
```
For managed Kubernetes where node access is restricted, users can use the
polling workaround (less efficient but functional):
```yaml
jellyfin:
env:
- name: DOTNET_USE_POLLING_FILE_WATCHER
value: "1"
```
This addresses the crash issue mentioned in #64.
Fixes: #64
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
Add dedicated cache volume configuration to reduce wear on SD cards and improve
performance by allowing cache to be stored on separate storage.
Changes:
- Add persistence.cache configuration in values.yaml with support for:
- PVC (default type when enabled)
- hostPath for direct host mount
- emptyDir (default when disabled)
- Add cache volume mount at /cache in deployment
- Add cache PersistentVolumeClaim template
- Support for existing PVC via existingClaim
- Configurable size (default 10Gi), accessMode, storageClass, and annotations
- Update Chart version from 2.5.0 to 2.5.1
- Add Artifact Hub changelog annotation
The cache volume is disabled by default to maintain backward compatibility.
Users can enable it via:
```yaml
persistence:
cache:
enabled: true
type: pvc
size: 10Gi
```
This addresses the use case mentioned in #62 where users want to avoid SD card
wear by storing cache on separate persistent storage.
Fixes: #62
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
Change default health probes from tcpSocket to httpGet to fix issue #68
where pods fail to start in IPv6-only clusters due to incompatible health checks.
Changes:
- Change default livenessProbe and readinessProbe to use httpGet with /health endpoint
- Add comprehensive IPv6 and dual-stack configuration documentation
- Document ipFamilyPolicy options (SingleStack, PreferDualStack, RequireDualStack)
- Document ipFamilies configuration for IPv4-only, IPv6-only, and dual-stack setups
- Add IPv6 Configuration section to README with examples
- Update Chart version from 2.5.0 to 2.5.1
The httpGet probe works with both IPv4 and IPv6 out of the box, while tcpSocket
may fail in IPv6-only environments. Jellyfin's /health endpoint is specifically
designed for health checks and verifies both HTTP and database connectivity.
Fixes: #68
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
Add support for Kubernetes Gateway API HTTPRoute resource as a modern
alternative to Ingress. The implementation follows the same pattern as
the existing Ingress template.
Changes:
- Add HTTPRoute template with configurable parentRefs, hostnames, and rules
- Add httpRoute section to values.yaml with generic examples
- Update Chart version from 2.5.0 to 2.6.0
- Add Artifact Hub changelog annotation
- Add HTTPRoute documentation to README
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>