Design Jellyfin as six separate roles: boot, application state, media, cache, backup, and recovery, then expand only the role approaching its limit.
A small installation may place several roles on one machine, but it should not blur their lifecycles. Keep mutable state easy to snapshot, media behind stable logical paths, cache disposable, and at least one recovery copy outside the active failure domain. Prove the design by restoring onto a clean target before automating retention or adding disks.
Map Six Data Roles Before Choosing Disks
Start with outcomes, not drive bays. Boot and runtime files must be reproducible; Jellyfin's database, settings, users, watch history, and curated metadata are persistent state; media is bulky user data; transcodes and image caches are rebuildable; backups are recovery inputs; and the recovery target is where those inputs are proven.
This separation prevents two expensive mistakes: backing up terabytes of disposable cache as often as a changing database, or protecting the database while leaving irreplaceable home videos with no second copy. The independent Ubuntu and Docker restore walkthrough likewise distinguishes persistent configuration from rebuildable cache.| Role | Typical content | Design rule |
|---|---|---|
| Boot/system | OS, packages, runtime definition | Document or image it; assume rebuild is possible |
| Application state | Database, users, settings, metadata | Fast local storage plus coherent backups |
| User media | Movies, music, family files | Stable paths and separate protection policy |
| Cache | Transcodes, resized images, temporary work | Place for throughput; allow rebuild |
| Backup | Versioned recovery copies | Keep outside the active failure domain |
| Recovery | Clean test host or isolated namespace | Use it to prove restore, not store production |
Stop here if any plugin, certificate, subtitle, or custom asset still has no owner. An unclassified persistent path becomes the file discovered only after the original server is gone.
Keep State Local and Media Paths Stable
Place application state on dependable local SSD storage with monitored free space. Mount media separately at logical paths that can survive a disk, enclosure, or pool change. The Jellyfin service should see the same path before and after expansion even if the storage layer behind it changes.
Treat cache as a throughput consumer, not a recovery dependency. It may share the system SSD for a light workload or move to a dedicated fast volume when writes, capacity, or wear become measurable problems. Do not move the database and cache together simply because both are small.
Before every boot, require media and state mounts to be present and writable by the runtime identity. A missing network mount that silently becomes an empty local directory can trigger scans or writes against the wrong path. The related permission and identity recovery guide covers the ownership boundary after path changes.Build Backup Around Recovery Objects
Back up application state as one coherent recovery object. For the simplest installation, stop Jellyfin for the short copy window; storage snapshots are acceptable only when they capture every state component at one recoverable point. Record the Jellyfin version beside each checkpoint because a database migration can make a casual image downgrade unsafe.
Protect media on a different cadence. Purchased media may be reproducible from source; family recordings may not be. Classify those subsets before choosing replication, offline copies, or off-site storage. The retention and recovery-window guide is the next step for deciding how many state generations to keep.At least one usable copy must survive loss or corruption of the active host and its attached storage. A mirrored pool improves availability after a device failure, but a synchronized deletion or database corruption can reach every mirror; redundancy and backup answer different failures.
Rehearse a Clean Restore Before Automating
Restore onto an isolated machine, VM, or container with the same Jellyfin version that created the checkpoint. Reproduce runtime identity and logical mounts, start without exposing the new server to production clients, then confirm an administrator login, user history, library counts, artwork, one Direct Play item, and one representative transcode.
The point is not that the dashboard loads. A recent TrueNAS migration case shows how application state, chart generations, and a new container route can collide; a clean rehearsal surfaces those dependencies while the old instance still exists.- Record source version, runtime identity, mount map, and backup checksum.
- Restore state onto a clean isolated target.
- Verify users, libraries, metadata, and representative playback.
- Restart once and repeat the core checks.
- Time the procedure and update the runbook with every manual dependency.
Fail the drill if it needs an undocumented secret, path rewrite, or live production file. Automation comes after this manual sequence succeeds twice, not before.
Expand Capacity Without Renaming Libraries
Choose an expansion threshold early enough to copy and validate data without emergency pressure. Sustained utilization around three quarters of the usable pool is a planning signal, not a universal law; use your ingest rate, rebuild time, backup duration, and free-space alert history to set the actual trigger.
Expand behind the existing logical media path when possible. Stage the new device or pool, validate health and write behavior, copy rather than move the first representative set, compare counts or hashes, and test a library scan and playback before admitting the new capacity to normal writes.
If expansion also requires a new filesystem, host, share protocol, or mount path, split it into separate changes. The compute, storage, and backup topology helps decide when capacity growth justifies separating roles rather than enlarging one box.Validate the Whole Topology and Its Limits
Run the design as a system: cold-start after a controlled shutdown, start with one dependency unavailable, fill a test volume to its alert threshold, restore a state checkpoint, and read media from the expanded path. Record what fails closed, what degrades, and what requires operator action.
Keep multiple roles on one host while their combined load, cabling, power, and recovery time stay inside your targets. Split media storage, backup, or recovery only when a measured capacity, maintenance, or failure-domain limit appears; extra machines create their own network and lifecycle dependencies.
The final rule is simple: preserve stable logical paths, protect non-rebuildable state independently, and prove recovery after every topology change. Capacity that cannot be restored is not finished capacity.
NAS & Server Setup
More to Read

How to Separate Home Assistant App Data, Cache, and Backups
Keep authoritative app state persistent, prove cache is disposable before moving it, and store tested backups outside the Home Assistant failure domain.

How to Adapt a Home Assistant Setup for Remote and Local Users
Keep local Home Assistant control independent of the remote edge, then add secure remote access with predictable DNS, identity, and network-switching behavior.

How to Move Home Assistant From a Single Container to a Resilient Service Stack
Preserve working state first, then separate data, dependencies, health, resources, and recovery so one service failure does not take down Home Assistant.

