Jellyfin currently has no way to limit the maximum ABI version. This means that people can install incompatible versions of a plugin. Unfortunately, the error is only visible after restarting Jellyfin. The average user expects to be offered only working and compatible versions.
The easiest method of self-hosting is to use Caddy, which is how we currently deploy on DigitalOcean. See the docker-compose.yaml and Caddyfile for reference.
We switched to jsDelivr in oder to serve manifest and logo requests in without hitting GitHub API limits. Caddyfile Updater always serves the current version by updating the Caddyfile and reloading Caddy without any downtime.
Almost all webhosters have Apache mod_rewrite enabled. PHP always has restrictions and is not needed anyway.
Caution
Some countries block Cloudflare
Instead of spending money for a webhoster you can connect a domain to cloudflare and use domain redirect rules.
Rules -> Redirect Rules
All rules are Custom filter expressions
| Field | Operator | Value | URL redirect Type | URL | Status code |
|---|---|---|---|---|---|
| User Agent | strict wildcard | Jellyfin-Server/10.11.* | Static | https://raw.githubusercontent.com/intro-skipper/manifest/refs/heads/main/10.11/manifest.json | 302 |
| User Agent | strict wildcard | Jellyfin-Server/10.10.* | Static | https://raw.githubusercontent.com/intro-skipper/manifest/refs/heads/main/10.10/manifest.json | 302 |
| User Agent | strict wildcard | Jellyfin-Server/10.9.* | Static | https://raw.githubusercontent.com/intro-skipper/manifest/refs/heads/main/10.9/manifest.json | 302 |
| User Agent | strict wildcard | Jellyfin-Server/10.8.* | Static | https://raw.githubusercontent.com/intro-skipper/manifest/refs/heads/main/10.8/manifest.json | 302 |
Inspired by DigitalOcean Docs Enable Reserved IPv6
Our script generates and implements a permanent network plan.
curl -fsSL https://raw.githubusercontent.com/intro-skipper/server_configs/refs/heads/main/set_reserved_ipv6.sh | bash