Setting Up Jellyfin on a Spare Laptop Home Server

by · Saturday. Mar 14, 2026

Setting Up Jellyfin on a Spare Laptop Home Server

Hosting Jellyfin

In part 1 I get the laptop running as a basic server. In part 2 I set up /srv/media/, permissions, SSH keys, and some power tweaks.

This post is where I host my first service: Jellyfin. I plan on accessing it using only the local IP address (no domain name, no reverse proxy).

I wanted Jellyfin to be the first real app because it gives fast feedback. If it works, I can point a browser at the server, add a library, and immediately see whether my folder layout and permissions from part 2 were a good idea. If it does not work, the failure is usually visible: the service is down, the port is blocked, or Jellyfin cannot read the media folder.

The official Jellyfin docs are the best reference for package changes, especially if the repository setup changes after this post. I used their Debian installation guide as the source of truth and treated my commands below as my personal notes.

What this solves

  • Puts movies and TV in a local library instead of a streaming feed.
  • Uses the /srv/media/ layout from the base server setup.
  • Starts Jellyfin automatically after reboot.
  • Keeps playback available on the LAN without public exposure.

Media folder layout

My media lives under /srv/media/. My layout is simple:

/srv/media/
  movies/
  tv/
  music/

I like keeping it under /srv/ because it stays consistent for services and organized.

Before installing Jellyfin, I create the folders and make sure the shared media group owns them:

sudo mkdir -p /srv/media/movies /srv/media/tv /srv/media/music
sudo chgrp -R media /srv/media
sudo chmod -R g+rwX /srv/media

Then I test with one small file. It is easier to debug one known-good movie or episode than a giant messy library. Jellyfin’s own media organization docs explain the naming patterns it expects, but the short version is: clean folders and predictable filenames make scanning less annoying.

Install Jellyfin via apt

I installed Jellyfin through apt. I added Jellyfin’s repository key and then added the Jellyfin repo. After Jellyfin installs, I enabled it to start on boot.

sudo apt update
sudo apt install -y apt-transport-https ca-certificates gnupg curl

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key \
  | sudo gpg --dearmor -o /etc/apt/keyrings/jellyfin.gpg

echo "deb [signed-by=/etc/apt/keyrings/jellyfin.gpg] https://repo.jellyfin.org/debian $(lsb_release -cs) main" \
  | sudo tee /etc/apt/sources.list.d/jellyfin.list

sudo apt update
sudo apt install -y jellyfin
sudo systemctl enable --now jellyfin

After the install, I check the service before opening the web UI:

systemctl status jellyfin

If it is not running, I look at the recent logs:

journalctl -u jellyfin -n 100 --no-pager

This is a habit I’m trying to build with every service in this series: verify the systemd unit first, then debug the application. It keeps me from refreshing a browser tab when the real error is already sitting in the service logs.

First-run setup

I access Jellyfin using the server’s local IP and port 8096. The page loads and I get the Jellyfin UI, which prompts me to create an admin account. Once that’s done, I add libraries and point them at subfolders under /srv/media/.

For my LAN-only setup, the URL is:

http://<server-ip>:8096

During setup, I create an admin user, add a Movies library pointed at /srv/media/movies, and add a Shows library pointed at /srv/media/tv. I leave remote access alone because this server is not meant to be exposed to the public internet.

If Jellyfin cannot see the folders, the first thing I check is permissions:

namei -l /srv/media/movies
sudo -u jellyfin ls -lah /srv/media/movies

That second command is especially useful because it tests access as the actual jellyfin user instead of my admin account. If the command fails, the web UI will fail too.

A few settings I changed first

I kept the first pass minimal. The goal was not to tune every setting; it was to get a small library working reliably.

  • I disabled features I was not using yet, especially anything related to remote access.
  • I set the library scan schedule to something reasonable instead of constant manual rescans.
  • I checked playback from another device on the same network.
  • I added only a handful of files before importing the rest.

Jellyfin can do much more, including hardware acceleration, users, subtitles, and metadata plugins. I’m leaving most of that for later because the simplest version already solves the problem I had: movies and shows available on my LAN without opening a streaming app designed to keep me scrolling.

What “done” looked like

This post was successful once I could do three things: open Jellyfin from another device, play a test file, and reboot the server without manually starting anything.

sudo reboot

After the reboot, I waited a minute and checked:

systemctl is-active jellyfin

If that returns active, the service is doing what I need. The rest is library cleanup.