# Self-host Jellyfin on a VPS

> Run your own Jellyfin media server on a VPS, with the admin account made for you, your media in /srv/media and HTTPS on your own domain.

Source: https://vpsnine.com/help/self-host-jellyfin · Updated: 2026-10-21

To self-host Jellyfin on a VPS, install it from Jellyfin's own repository, finish its setup wizard before anyone else can reach it, copy your media to the server and put it behind HTTPS on your own domain. On VPSNine the [Jellyfin one-click app](https://vpsnine.com/apps/jellyfin) does the install and the wizard for you, so you start at uploading media.

Be clear about one thing first: a VPS has no graphics card. Jellyfin works well when your apps play your files as they are (direct play), and poorly when it has to convert video on the fly.

## What you need

- The Standard plan (2 vCPU, 4 GB) or bigger. It's the smallest plan we offer Jellyfin on. Jellyfin's hardware guide says 4 GB may be enough on a Linux server without a desktop, recommends 8 GB, and says a server without a GPU isn't recommended for transcoding.
- Disk for your media. Standard has 80 GB and Extreme 160 GB; the [plans page](https://vpsnine.com/plans) has the rest of the specs. Disk is usually the limit you hit first.
- Apps that can play your files directly. If yours can't, keep copies in a widely supported format such as H.264. Converting even one video stream in software can take all of a plan's CPU.
- A domain or subdomain for HTTPS, like `media.example.com`.

## Install it with the one-click app

Order a server with the [Jellyfin app](https://vpsnine.com/apps/jellyfin). On Ubuntu and Debian it runs Jellyfin's own install script, checked against its published SHA-256, which adds Jellyfin's apt repository. On AlmaLinux, Rocky Linux and Fedora, where Jellyfin recommends containers, it runs the official `jellyfin/jellyfin` image.

Jellyfin's setup wizard gives the admin account to whoever finishes it first, so the installer keeps port 8096 closed to the internet, completes the wizard through Jellyfin's API with a generated password, and only then opens the port. When it's done:

1. Log in over SSH and read the admin password:

   ```bash
   cat /root/jellyfin-admin.txt
   ```

   Open `http://203.0.113.10:8096` (your server's IPv4) and log in as `admin`.

2. Copy your media into `/srv/media` from your computer. rsync resumes if the connection drops, which matters for large files:

   ```bash
   rsync -avP ~/Movies/ root@203.0.113.10:/srv/media/Movies/
   ```

   Then add a library for it in **Dashboard**, **Libraries**. On AlmaLinux, Rocky Linux and Fedora the folder is `/media` inside Jellyfin.

3. Set up HTTPS (next section).

4. Create a user for each person who watches instead of sharing the admin login.

To check Jellyfin is up from the server itself, `curl http://127.0.0.1:8096/health` should answer `Healthy`.

## Put it on your domain with HTTPS

Over plain HTTP your password crosses the network unencrypted, so use HTTPS. Point an `A` record for `media.example.com` at your server's IPv4, allow ports 80 and 443 in [the panel firewall](https://vpsnine.com/help/server-firewall), then run:

```bash
vps9-https media.example.com
```

It installs Caddy from Caddy's own packages, writes a Caddyfile that proxies your domain to Jellyfin on `127.0.0.1:8096`, and reloads Caddy, which gets and renews the certificate. It warns you if the domain doesn't point at the server yet. Run it again with another domain to move.

Then use `https://media.example.com` as the server address in Jellyfin's TV and phone apps. Port 8096 stays open until you close it; once every app you use connects through the domain, close 8096 in the panel firewall.

## Doing it by hand on another server

On Debian or Ubuntu, follow [Jellyfin's Linux install guide](https://jellyfin.org/docs/general/installation/linux). In short, download the install script and its checksum, check it, then run it:

```bash
curl -s https://repo.jellyfin.org/install-debuntu.sh -O
curl -s https://repo.jellyfin.org/install-debuntu.sh.sha256sum -O
sha256sum -c install-debuntu.sh.sha256sum
sudo bash install-debuntu.sh
```

`sha256sum` should print `install-debuntu.sh: OK` before you run anything. Jellyfin then listens on port 8096 with its setup wizard waiting. Since the first visitor to finish the wizard becomes the admin, keep 8096 closed to the internet until you've done it, for example by reaching it through an SSH tunnel (`ssh -L 8096:127.0.0.1:8096 root@203.0.113.10`, then `http://localhost:8096`). Put Caddy or nginx in front for HTTPS, as in [Serve a site with nginx and HTTPS](https://vpsnine.com/help/nginx-and-https).

## Updates and backups

On Ubuntu and Debian, Jellyfin updates with the system's packages from its repository:

```bash
apt update && apt upgrade
```

On the Red Hat family, pull the new image and re-create the container with the same folders and port as the one-click app set up:

```bash
docker pull jellyfin/jellyfin:latest
docker rm -f jellyfin
docker run -d --name jellyfin --restart unless-stopped -p 8096:8096 \
  -v /opt/jellyfin/config:/config:Z -v /opt/jellyfin/cache:/cache:Z \
  -v /srv/media:/media:z jellyfin/jellyfin:latest
```

The one-click app turns on the operating system's automatic security updates, which leave Jellyfin's own updates to you.

Jellyfin 10.11 has backups built in, under **Dashboard**, **Backups**. Copy those, and your media, off the server; a backup on the same disk doesn't survive the disk. [Backups you should run](https://vpsnine.com/help/backups-you-should-run) shows how to schedule copies.

## When it goes wrong

- **Playback buffers or stutters**: Jellyfin is almost certainly transcoding on the CPU. Check the playback info in the player, or the active sessions on the dashboard, to see whether a stream is being transcoded. Set the app's quality to the maximum or automatic so it doesn't ask for a lower bitrate than the file has, try another app that supports the file's format, or keep an H.264 copy. HEVC, AV1 and HDR tone mapping need a GPU to convert at a usable speed.
- **The apps can't connect over the domain**: DNS doesn't point at the server yet, or ports 80 and 443 are closed in the panel firewall. Check with `getent hosts media.example.com` on the server and run `vps9-https media.example.com` again once it resolves.
- **The disk is full**: media fills it fast. Check with `df -h /srv/media` and remove what you no longer watch, or move to a plan with more disk.

Stream files you have the right to use, for yourself and your household. Sharing copyrighted material you have no rights to breaks our [acceptable use policy](https://vpsnine.com/aup).
