---
title: "Jellyfin Setup on ubuntu-manticore"
description: "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."
type: guide
domain: media-servers
tags: [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`

```yaml
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 **Dashboard** → **Playback** → **Transcoding**
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:
```bash
# Packages currently held (as of 2026-02-05):
nvidia-driver-570
nvidia-kernel-common-570
nvidia-dkms-570
```

**Verify held packages:**
```bash
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:**
```bash
python3 /home/cal/scripts/nvidia_update_checker.py --check --discord-alerts
```

**Test Discord integration:**
```bash
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:**
   ```bash
   sudo apt-mark unhold nvidia-driver-570
   ```

2. **Update drivers:**
   ```bash
   sudo apt update && sudo apt upgrade nvidia-driver-570
   ```

3. **Reboot immediately** (driver changes require reboot):
   ```bash
   sudo reboot
   ```

4. **Verify after reboot:**
   ```bash
   nvidia-smi
   docker exec jellyfin nvidia-smi
   ```

5. **Re-hold packages:**
   ```bash
   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
```bash
# Verify GPU access in container
docker exec jellyfin nvidia-smi
```

### Check Available Encoders
Container logs show available encoders on startup:
```bash
docker logs jellyfin 2>&1 | grep -i "available encoders"
```

### Transcoding Failures
Check Jellyfin logs in Dashboard → Logs or:
```bash
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
```bash
sudo reboot
```

## Related Documentation
- 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`
