Files
Robert Helewka e92ab80bbf feat(ansible): add Jellyfin service and improve deployment
- Add Jellyfin backend to HAProxy configuration on titania.incus
- Simplify deployment by using community.docker.docker_compose_v2 module
- Consolidate handlers and remove redundant Docker commands
- Update Jellyfin systemd service from oneshot to simple type
- Remove PUID/PGID environment variables from docker-compose template
2026-05-04 15:49:18 -04:00
..

# Jellyfin Deployment for Ouranos Jellyfin media server deployed on Rosalind Incus container. ## Overview Jellyfin is an open-source media server for organizing, streaming, and managing media content. This deployment includes: - Docker containerized deployment - NVIDIA GPU passthrough for hardware-accelerated transcoding - Prometheus metrics collection - Syslog integration with Grafana Alloy - Casdoor OIDC SSO support (via plugin) ## Deployment ### Prerequisites 1. Rosalind Incus container must be running with Docker installed 2. /mnt/media must be accessible from the Incus host 3. NVIDIA GPU must be passed through to the Rosalind container 4. Casdoor application must be configured for Jellyfin OIDC ### Installation bash # From ansible directory cd /home/robert/git/ouranos/ansible # Deploy Jellyfin to Rosalind ansible-playbook jellyfin/deploy.yml --limit rosalind.incus ### Updating bash # Update Jellyfin container ansible-playbook jellyfin/deploy.yml --limit rosalind.incus ## Configuration ### Variables | Variable | Description | Default | |----------|-------------|---------| | jellyfin_user | Service username | jellyfin | | jellyfin_group | Service group name | jellyfin | | jellyfin_uid | Service UID | 521 | | jellyfin_gid | Service GID | 521 | | jellyfin_directory | Base directory | /srv/jellyfin | | jellyfin_port | HTTP port | 22086 | | jellyfin_syslog_port | Syslog port | 51426 | | jellyfin_config_dir | Config directory | /srv/jellyfin/config | | jellyfin_cache_dir | Cache directory | /srv/jellyfin/cache | | jellyfin_media_dir | Media bind mount | /mnt/media | | jellyfin_published_server_url | External URL | https://jellyfin.ouranos.helu.ca | ### SSO Configuration Jellyfin uses the jellyfin-plugin-sso community plugin for Casdoor OIDC authentication: 1. Create Casdoor Application: - Application type: OIDC - Callback URL: https://jellyfin.ouranos.helu.ca/api/plugin/sso/callback - Enable PKCE 2. Plugin Configuration: - Install manifest in /config/plugins - Configure with Casdoor OIDC endpoints 3. Casdoor Endpoints: - Authorization: https://id.ouranos.helu.ca/oauth2/authorize - Token: https://id.ouranos.helu.ca/oauth2/token - Userinfo: https://id.ouranos.helu.ca/oauth2/userinfo ## Monitoring ### Prometheus Metrics Jellyfin exposes metrics at http://localhost:8096/metrics. These are collected by Prospero's Prometheus via: - cAdvisor container metrics - Process exporter ### Grafana Dashboard Add a new data source in Grafana: - Type: Prometheus - URL: http://prospero.incus:9090 ### Logs View Jellyfin logs: bash # Via Docker docker logs -f jellyfin # Via systemd journalctl -u jellyfin -f # Via Grafana Loki https://loki.ouranos.helu.ca/explore?orgId=1&left=%5B%22now-1h%22,%22now%22,%22jellyfin%22,%7B%22job%22%3A%22jellyfin%22%7D%5D ## Troubleshooting ### Container won't start bash # Check Docker status docker ps -a | grep jellyfin # Check logs docker logs jellyfin # Verify GPU passthrough ls -la /dev/dri/ ### Transcoding fails 1. Verify GPU is accessible: nvidia-smi 2. Check container has device access: docker inspect jellyfin | grep Devices 3. Review logs for transcoding errors ### SSO not working 1. Verify plugin is installed in /config/plugins 2. Check Casdoor application configuration 3. Verify redirect URLs match exactly 4. Browser console for OAuth errors ## Files | Path | Description | |------|-------------| | /srv/jellyfin/docker-compose.yml | Generated Docker Compose config | | /etc/systemd/system/jellyfin.service | Systemd wrapper service | | /srv/jellyfin/config | Jellyfin configuration | | /srv/jellyfin/cache | Transcode cache | | /srv/jellyfin/logs | Application logs (via syslog) | ## References - Jellyfin Official Docs - Jellyfin Docker Image - SSO Plugin GitHub