Configure Jellyfin storage by separating durable state from rebuildable cache and bursty transcode temporary files; the database and config should have the most reliable local path.
On a home server, a fast SSD can host config, database, cache, and transcode scratch while bulk media stays on larger storage. Map each directory explicitly, check the container user and free-space floor, then restart and run a representative transcode before declaring the layout complete.
Map Durable, Rebuildable, and Temporary Paths
Jellyfin paths are on defaults or undocumented mounts. Begin with the least invasive check: Print effective data, config, cache, log, web, and transcode paths, then label each durable, rebuildable, or temporary.
The useful observation is specific: durable paths on local SSD, temp on full root, cache on network share. Record the result before changing another variable. effective Jellyfin paths
Interpret the branch instead of guessing. If durable paths are local and reliable, keep them; if temp is constrained, move only temp; if database or config is remote, relocate them before tuning playback.
Configure the Paths and Container Permissions
Storage roles are selected. Begin with the least invasive check: Apply one path change at a time, inspect the mount table, and create a test file or scratch file as the Jellyfin user.
The useful observation is specific: write test passes, permission denied, path resolves to empty directory. Record the result before changing another variable. local mounted filesystem
Interpret the branch instead of guessing. If writes pass, continue; if permission fails, correct ownership without deleting data; if the path is empty, fix the mount target before rescanning.
Set a Free-Space Floor for Cache and Transcodes
Paths are configured and writable. Begin with the least invasive check: Run the hardest normal playback mix, record temp growth and write latency, and set an alert before the failure point.
The useful observation is specific: temp remains bounded, volume fills during burst, cache grows without eviction. Record the result before changing another variable. transcode free-space floor
Interpret the branch instead of guessing. If bounded, keep the floor and monitor; if it fills, move or enlarge temp before adding streams; if cache never evicts, inspect its path and maintenance task.
Restart and Replay a Representative Transcode
Storage paths and free-space floor are configured. Begin with the least invasive check: Restart Jellyfin once, confirm effective paths, play one Direct Play and one transcode with subtitles or scaling, then inspect temp cleanup.
The useful observation is specific: paths persist and playback passes, transcode falls back to CPU, temp writes fail. Record the result before changing another variable.
Interpret the branch instead of guessing. If paths and playback pass, stop; if accelerator fallback appears, diagnose mapping separately; if temp writes fail, restore the last working path and repair ownership.
Support & Tips
More to Read

Can Jellyfin Safely Share a GPU or Accelerator With Another Container?
GPU sharing is conditional: verify device visibility and driver support, then run both workloads and watch for software fallback.

How to Tell Whether a Jellyfin Error Comes From the Client or Server
A Jellyfin error belongs to the client when it follows one device; it belongs to the server when multiple clients fail under the same...

How to Prevent Jellyfin Backups From Capturing Inconsistent State
A complete file copy is not automatically consistent; freeze writes or snapshot atomically, capture all state paths, and prove the restore.

