---
title: Jellyfin
description: A free and open-source media system that lets you manage and stream your media library from your own server.
product: Marketplace
url: https://docs.digitalocean.com/products/marketplace/catalog/jellyfin/
last_updated: "2026-10-08"
---

> **For AI agents:** The documentation index is at [https://docs.digitalocean.com/llms.txt](https://docs.digitalocean.com/llms.txt). Markdown versions of pages use the same URL with `index.html.md` in place of the HTML page (for example, append `index.html.md` to the directory path instead of opening the HTML document).

# Jellyfin

Generated on 8 Oct 2026 from [the Jellyfin catalog page](https://marketplace.digitalocean.com/apps/jellyfin)

## Jellyfin 1-Click Application

Deploy [Jellyfin](https://jellyfin.org), a free and open-source media system that lets you manage and stream your media library from your own server.

## System Components

| Component | Details |
|---|---|
| Ubuntu | 24.04 LTS |
| Docker | Container runtime (`docker.io`) |
| Jellyfin | `jellyfin/jellyfin:10.11.11` |
| Caddy | Reverse proxy with automatic Let’s Encrypt TLS |
| UFW | Firewall (SSH 22, HTTP 80, HTTPS 443) |

## System Requirements

**Minimum Droplet size: `s-1vcpu-2gb` (2 GB RAM).** Jellyfin’s media transcoding benefits from additional CPU and memory for larger libraries or concurrent streams.

| Use case | Recommended |
|---|---|
| Light / small library | 2 GB RAM, 1 vCPU |
| Multiple streams / transcoding | 4 GB+ RAM, 2+ vCPU |

## Software Included

| Package | Version | License |
|---|---|---|
| Docker | 29.1.3 | [Apache License 2.0](https://github.com/moby/moby/blob/master/LICENSE) |
| Caddy | 2.11.4 | [Apache License 2.0 (GitHub)](https://github.com/caddyserver/caddy/blob/master/LICENSE) |

## Creating an App using the Control Panel

Click the **Deploy to DigitalOcean** button to create a Droplet based on this 1-Click App. If you aren’t logged in, this link will prompt you to log in with your DigitalOcean account.

[![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/droplets/new?onboarding_origin=marketplace&appId=241520840&image=jellyfin&activation_redirect=%2Fdroplets%2Fnew%3FappId%3D241520840%26image%3Djellyfin)

## Creating an App using the API

In addition to creating a Droplet from the Jellyfin 1-Click App using the control panel, you can also use the [DigitalOcean API](https://docs.digitalocean.com/reference/api). As an example, to create a 4GB Jellyfin Droplet in the SFO2 region, you can use the following `curl` command. You need to either save your [API access token](https://docs.digitalocean.com/reference/api/create-personal-access-token/index.html.md) to an environment variable or substitute it in the command below.

```shell
curl -X POST -H 'Content-Type: application/json' \
         -H 'Authorization: Bearer '$TOKEN'' -d \
        '{"name":"choose_a_name","region":"sfo2","size":"s-2vcpu-4gb","image":"jellyfin"}' \
        "https://api.digitalocean.com/v2/droplets"
```

## Getting Started After Deploying Jellyfin

## Getting Started

1. **Create a Droplet** from this 1-Click image (use at least **2 GB RAM**).
2. **SSH in once** — first login runs `/opt/claim-jellyfin-access.sh`, which enables Caddy and unlocks HTTPS. Until then, the setup wizard is not publicly reachable.
3. **Open Jellyfin** at `https://your-droplet-ip` and finish the setup wizard **immediately** to create your admin account.
4. **Add media** by uploading or mounting files under `/var/lib/jellyfin/media`, then configure libraries in the Jellyfin UI.

**Security note:** Public HTTPS stays disabled until the first SSH claim. After claim, complete the setup wizard right away — the first person to finish it gets full administrative access.

Jellyfin listens on `127.0.0.1:8096` only. Public access is through Caddy on ports 80/443 after claim.

### Custom Domain (Recommended)

1. Create a DNS A record pointing your domain to the Droplet IP.
2. SSH in and run:

```
sudo /opt/setup-jellyfin-domain.sh
```

3. Visit `https://your-domain` — Caddy obtains a Let’s Encrypt certificate automatically.

## Managing Jellyfin

### systemd

```
systemctl start jellyfin
systemctl stop jellyfin
systemctl restart jellyfin
systemctl status jellyfin
```

### Helper scripts

Helpers wrap `systemctl` so unit state stays consistent:

```
/opt/start-jellyfin.sh
/opt/stop-jellyfin.sh
/opt/restart-jellyfin.sh
/opt/status-jellyfin.sh
/opt/claim-jellyfin-access.sh
sudo /opt/update-jellyfin.sh 10.11.11
```

### Update

```
sudo /opt/update-jellyfin.sh <version>
```

This pulls the requested `jellyfin/jellyfin` image tag, recreates the container, and keeps data under `/var/lib/jellyfin`.

## Data Locations

| Path | Purpose |
|---|---|
| `/var/lib/jellyfin/config` | Server configuration |
| `/var/lib/jellyfin/cache` | Transcoding / metadata cache |
| `/var/lib/jellyfin/media` | Suggested media library root |

## Support

- [Jellyfin Documentation](https://jellyfin.org/docs/)
- [Jellyfin Docker Hub](https://hub.docker.com/r/jellyfin/jellyfin)
- [DigitalOcean Community](https://www.digitalocean.com/community)