claude-home/media-servers/jellyfin-ubuntu-manticore.md
Cal Corum 4b7eca8a46
All checks were successful
Reindex Knowledge Base / reindex (push) Successful in 3s
docs: add YAML frontmatter to all 151 markdown files
Adds title, description, type, domain, and tags frontmatter to every
doc for improved KB semantic search. The description field is prepended
to every search chunk, and domain/type/tags enable filtered queries.

Type values: context, guide, runbook, reference, troubleshooting
Domain values match directory structure (networking, docker, etc.)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 09:00:44 -05:00

6.8 KiB

title description type domain tags
Jellyfin Setup on ubuntu-manticore Complete Jellyfin deployment guide on ubuntu-manticore (10.10.0.226) with Docker Compose, NVIDIA GTX 1070 GPU transcoding, storage layout, driver management, and GPU health monitoring. guide media-servers
jellyfin
docker
nvidia
gpu
ubuntu-manticore
nvenc
driver-management
monitoring

Jellyfin Setup on ubuntu-manticore

Overview

Jellyfin media server deployed on ubuntu-manticore (10.10.0.226) with NVIDIA GTX 1070 for hardware-accelerated transcoding.

Date: 2025-12-04

Architecture

ubuntu-manticore (10.10.0.226)
└── jellyfin (container)
    ├── Web UI: http://10.10.0.226:8096
    ├── Discovery: UDP 7359
    ├── Config: ~/docker/jellyfin/config/
    ├── Cache: /mnt/NV2/jellyfin-cache (NVMe)
    ├── Media: /mnt/truenas/media (read-only)
    └── GPU: GTX 1070 (NVENC/NVDEC)

Docker Compose Configuration

Location: ~/docker/jellyfin/docker-compose.yml

services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/Chicago
      - NVIDIA_DRIVER_CAPABILITIES=all
      - NVIDIA_VISIBLE_DEVICES=all
    ports:
      - "8096:8096"      # Web UI
      - "7359:7359/udp"  # Client discovery
    volumes:
      - ./config:/config
      - /mnt/NV2/jellyfin-cache:/cache
      - /mnt/truenas/media:/media:ro
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

Storage Strategy

Path Location Purpose
/config ~/docker/jellyfin/config/ Database, settings (small, OS drive)
/cache /mnt/NV2/jellyfin-cache Transcoding temp, trickplay images (large, NVMe)
/media /mnt/truenas/media Media library (read-only, network)

Why NVMe for cache:

  • Trickplay (timeline thumbnails) can grow to several GB
  • Chapter images add up across large libraries
  • Transcoding temp files need fast I/O
  • Prevents filling up the boot drive

GPU Hardware Acceleration

Available Encoders

Encoder Status
h264_nvenc Working
hevc_nvenc Working
av1_nvenc Working

Available Decoders

Decoder Status
h264_cuvid Working
hevc_cuvid Working
av1_cuvid Working
vp8_cuvid Working
vp9_cuvid Working

Hardware Acceleration Types

  • CUDA
  • VAAPI
  • QSV (not applicable - Intel)
  • Vulkan
  • OpenCL

Configuring Hardware Transcoding

  1. Go to DashboardPlaybackTranscoding
  2. Select NVIDIA NVENC as the hardware acceleration
  3. Enable desired codecs for hardware decoding/encoding
  4. Save changes

Ports

Port Protocol Purpose
8096 TCP Web UI and API
7359 UDP Client auto-discovery on LAN

Initial Setup

  1. Access http://10.10.0.226:8096
  2. Complete the setup wizard:
    • Create admin account
    • Add media libraries (Movies: /media/Movies, TV: /media/TV)
    • Configure metadata providers
    • Skip NFO savers (not needed unless sharing with Kodi)
  3. Configure hardware transcoding in Dashboard

Resource Sharing with Tdarr

Both Jellyfin and Tdarr share the GTX 1070. To prevent conflicts:

  • Tdarr: Limited to 1 GPU worker
  • Jellyfin: Handles real-time transcoding on-demand
  • GTX 1070: Supports 2 concurrent NVENC sessions (consumer card limit)

Jellyfin transcodes are more latency-sensitive (users waiting for playback), so Tdarr yields priority by limiting concurrent jobs.

Watch History Sync (Future)

For syncing watch history between Plex and Jellyfin:

  • Use ghcr.io/arabcoders/watchstate
  • Syncs via API, not NFO files
  • NFO files don't store watch state

NVIDIA Driver Management

Auto-Update Prevention

Issue: NVIDIA driver auto-updates can cause driver/library version mismatches, breaking GPU access until the host is rebooted. This causes Jellyfin downtime.

Solution: Driver packages are held to prevent automatic updates:

# Packages currently held (as of 2026-02-05):
nvidia-driver-570
nvidia-kernel-common-570
nvidia-dkms-570

Verify held packages:

apt-mark showhold

Update Monitoring

A monitoring script checks for NVIDIA driver updates weekly and sends Discord alerts when new versions are available:

Script: /home/cal/scripts/nvidia_update_checker.py Schedule: Every Monday at 9 AM Logs: /home/cal/logs/nvidia-update-checker.log

Manual check:

python3 /home/cal/scripts/nvidia_update_checker.py --check --discord-alerts

Test Discord integration:

python3 /home/cal/scripts/nvidia_update_checker.py --discord-test

Planned Driver Updates

When Discord alerts about available updates, plan a maintenance window:

  1. Unhold packages:

    sudo apt-mark unhold nvidia-driver-570
    
  2. Update drivers:

    sudo apt update && sudo apt upgrade nvidia-driver-570
    
  3. Reboot immediately (driver changes require reboot):

    sudo reboot
    
  4. Verify after reboot:

    nvidia-smi
    docker exec jellyfin nvidia-smi
    
  5. Re-hold packages:

    sudo apt-mark hold nvidia-driver-570 nvidia-kernel-common-570 nvidia-dkms-570
    

GPU Health Monitoring

Jellyfin GPU access is monitored every 5 minutes:

Script: /home/cal/scripts/jellyfin_gpu_monitor.py Features:

  • Detects GPU access loss
  • Sends Discord alerts
  • Auto-restarts container (if GPU accessible)
  • Logs to /home/cal/logs/jellyfin-gpu-monitor.log

Note: Container restart cannot fix host-level driver issues. If Discord alerts show "Restart failed" with driver/library mismatch, a host reboot is required.

Troubleshooting

GPU Not Detected in Transcoding

# Verify GPU access in container
docker exec jellyfin nvidia-smi

Check Available Encoders

Container logs show available encoders on startup:

docker logs jellyfin 2>&1 | grep -i "available encoders"

Transcoding Failures

Check Jellyfin logs in Dashboard → Logs or:

docker logs jellyfin 2>&1 | tail -50

Driver/Library Version Mismatch

Symptoms:

  • nvidia-smi fails with "driver/library version mismatch"
  • Jellyfin container won't start with NVML error
  • GPU monitoring alerts show "Restart failed"

Cause: NVIDIA driver updated but kernel modules not reloaded

Solution: Reboot the host

sudo reboot
  • Server inventory: networking/server-inventory.md
  • Tdarr setup: tdarr/ubuntu-manticore-setup.md
  • GPU monitoring: monitoring/scripts/jellyfin_gpu_monitor.py
  • Update monitoring: monitoring/scripts/nvidia_update_checker.py