Migrate Jellyfin by assigning application state, media, cache, backups, and network access to explicit roles before choosing containers or a NAS.
A desktop usually bundles every role into one filesystem and one power path. An open-source media stack separates those roles, so the migration succeeds only when each path, UID/GID, service dependency, and restore action is mapped before the first container starts. Preserve the desktop as a rollback source until a clean restart and a real client test pass.
Map the desktop into service roles
Inventory the Jellyfin configuration and database, the media libraries, metadata and image cache, plugins, subtitle cache, users, and any reverse-proxy or DNS dependency. Mark each as persistent application state, irreplaceable media, rebuildable cache, backup copy, or recovery media. Do not copy a cache as if it were a database, and do not treat a mirrored media volume as a second backup.
The migration boundary is clear when every role has an owner, destination, access path, and restore action. If a role cannot be restored independently, keep it on the desktop until the stack design is revised.
Choose the target topology before selecting images
Use one service role for Jellyfin, one persistent data volume for its configuration and database, a media volume with stable paths, and a separate backup destination. Put reverse proxy, monitoring, and experimental services on their own paths or networks when failure coupling matters. A third-party migration tool demonstrates why path translation and database handling need an explicit plan rather than a blind folder copy (path-aware Jellyfin migration notes).
Preserve paths and permissions during the move
Stop the desktop service, make a copy of its persistent data, and verify the copy before transforming it. On the target, keep the media path inside the container identical to the path recorded in the database whenever possible. Set the container UID/GID to a principal that can read media and write only the required application directories. Test one library scan and one user login before importing plugins or adding automations.
The decision exit is PASS when Jellyfin can read every intended library, write its database, and restart without changing the path map. If permissions require broad write access to the media tree, split the data and application roles before proceeding.
Validate playback, users, and recovery in layers
Run local direct play, a representative transcode, subtitles, and a second user account. Then stop and recreate the stack from the compose or deployment definition, not from an interactive shell. Restore the application-data backup to a clean test location and confirm that watched state, users, and library paths are either preserved or intentionally rebuilt.
Only after those checks should you add remote access or extra services. A compact host such as ZimaCube 2 AI NAS can be considered when the neutral requirements—persistent storage, container headroom, and a separate backup path—already match the stack.
Set the expansion and stop boundaries
Expand by adding a storage tier, a transcode-capable compute node, or a separate network role; do not solve every new workload by enlarging one shared volume. Keep the desktop rollback copy when a plugin, path conversion, or user migration is unverified. The stack is ready when a documented rebuild produces the same library access and playback result without the original desktop running.
NAS & Server Setup
More to Read

How AI-Like Analysis and Automation Change Jellyfin Storage and Compute Needs
Automation and adjacent AI analysis add scans, derived data, CPU/GPU work, cache, scratch space, and background scheduling beyond ordinary Jellyfin playback.

How to Integrate Jellyfin Into a Small Apartment or Rental Network
Build a rental-friendly Jellyfin network around stable local addressing, minimal wiring, quiet hardware, CGNAT-aware remote access, and reversible changes.

How Many Users and Background Jobs Should One Jellyfin Host Support?
Treat Jellyfin users and background jobs as one shared workload budget; capacity ends when playback latency, queues, or resource pressure becomes repeatable.

