Run Jellyfin on a VPS for Free (Almost): Hetzner €4.50/month vs Contabo vs Oracle Free Tier (2026)

Run Jellyfin on a VPS for Free (Almost): Hetzner €4.50/month vs Contabo vs Oracle Free Tier (2026)

Run Jellyfin on a VPS in 2026: Hetzner, Contabo, and Budget Cloud Server Setup

Not everyone wants to run a server at home. Maybe your ISP has terrible upload speed. Maybe you are behind CGNAT with no public IP. Maybe you travel frequently and want a server that is always online, always accessible, with zero dependency on your home network.

A VPS (Virtual Private Server) solves all of this. For $5-15/month, you get a dedicated machine in a datacenter with a public IP, fast bandwidth, and 24/7 uptime.

This guide covers the most popular VPS providers for Jellyfin in 2026, deployment with Docker, storage strategies, and the honest limitations.


Why a VPS for Jellyfin?

Advantages over a home server:

  • Upload speed: 1 Gbps+ (vs 10-50 Mbps at home)
  • Public IP: always included (no CGNAT issues)
  • Uptime: 99.9% SLA (vs depends on your power/internet)
  • Noise/heat: in a datacenter, not your living room
  • Privacy: provider has physical access to the hardware

Trade-offs:

  • No GPU on most VPS plans (no hardware transcoding)
  • Storage is expensive compared to local HDDs
  • Less hardware control than a dedicated machine

The key trade-off: VPS bandwidth is excellent but storage is expensive. This shapes your entire strategy.


Best VPS Providers for Jellyfin in 2026

Hetzner (Best Value in Europe)

Hetzner is the community favorite for self-hosting in Europe. Excellent price-to-performance, German datacenter quality, and generous bandwidth.

Recommended plans:

  • CX22 - 2 vCPU, 4 GB RAM, 40 GB, 20 TB bandwidth - ~4.50 EUR/month
  • CX32 - 4 vCPU, 8 GB RAM, 80 GB, 20 TB bandwidth - ~8 EUR/month (sweet spot)
  • CX42 - 8 vCPU, 16 GB RAM, 160 GB, 20 TB bandwidth - ~16 EUR/month
  • CAX21 (ARM) - 4 vCPU, 8 GB RAM, 80 GB, 20 TB bandwidth - ~6 EUR/month

Recommendation: CX32 (4 vCPU, 8 GB RAM, 80 GB) is the sweet spot for Jellyfin. Add a Hetzner Storage Box for media files.

Hetzner Storage Box (network-attached storage):

  • 1 TB: ~3.80 EUR/month
  • 5 TB: ~12.50 EUR/month
  • 10 TB: ~23 EUR/month
  • Mountable via CIFS/SMB, SFTP, or WebDAV

Contabo (Most Storage per Dollar)

Contabo offers significantly more storage than Hetzner at the cost of slightly lower performance.

Recommended plans:

  • Cloud VPS S - 4 vCPU, 8 GB RAM, 200 GB SSD - ~6 EUR/month
  • Cloud VPS M - 6 vCPU, 16 GB RAM, 400 GB SSD - ~12 EUR/month
  • Cloud VPS L - 8 vCPU, 30 GB RAM, 800 GB SSD - ~18 EUR/month
  • Storage VPS - 2 vCPU, 4 GB RAM, 800 GB HDD - ~4 EUR/month

All Contabo plans include 32 TB/month bandwidth.

Recommendation: Cloud VPS M (400 GB SSD) can hold a modest library directly. For larger collections, use the Storage VPS as a media mount.


Other Providers Worth Considering

  • Netcup (Germany) - from ~3 EUR/month, good value
  • OVH/Kimsufi (France) - from ~5 EUR/month, dedicated servers available
  • Vultr (Global) - from ~$6/month, good US/Asia coverage
  • DigitalOcean (Global) - from ~$6/month, developer-friendly
  • Oracle Cloud (Global) - free ARM tier, see our dedicated Oracle guide

Step 1: Provision Your VPS

Hetzner Example

  1. Create an account at hetzner.com/cloud
  2. Create a new server:
    • Location: closest to your users (Falkenstein, Nuremberg, Helsinki, Ashburn)
    • Image: Ubuntu 24.04
    • Type: CX32 (4 vCPU, 8 GB RAM)
    • SSH Key: paste your public key
  3. Note the public IP address

Initial Server Setup

SSH into your new server and run the initial configuration:

ssh root@YOUR_VPS_IP

Update the system and create a non-root user:

apt update && apt upgrade -y
adduser jellyfin-admin
usermod -aG sudo jellyfin-admin

Secure SSH access by disabling root login:

sed -i "s/PermitRootLogin yes/PermitRootLogin no/" /etc/ssh/sshd_config
systemctl restart sshd

Install Docker:

curl -fsSL https://get.docker.com | sh
usermod -aG docker jellyfin-admin

Step 2: Mount External Storage

VPS local storage is limited and expensive. Mount external storage for your media files.

Option A: Hetzner Storage Box via CIFS

Install CIFS utilities and create the mount point:

apt install cifs-utils -y
mkdir -p /mnt/media

Create a credentials file:

cat > /root/.storage-credentials << EOF
username=YOUR_STORAGEBOX_USER
password=YOUR_STORAGEBOX_PASSWORD
EOF
chmod 600 /root/.storage-credentials

Add the mount to fstab and mount:

STORAGEBOX="//uXXXXXX.your-storagebox.de/backup"
OPTS="credentials=/root/.storage-credentials"
OPTS="$OPTS,uid=1000,gid=1000,_netdev"
echo "$STORAGEBOX /mnt/media cifs $OPTS 0 0" 
  >> /etc/fstab
mount -a

Option B: Rclone (Google Drive, Backblaze B2, S3)

Mount cloud storage directly:

apt install rclone -y
rclone config

Follow the wizard for your provider, then mount:

mkdir -p /mnt/media
rclone mount remote:jellyfin-media /mnt/media 
  --vfs-cache-mode full 
  --vfs-cache-max-size 20G 
  --allow-other 
  --daemon

Option C: SSHFS from Home NAS

Mount your home NAS over SSH:

apt install sshfs -y
mkdir -p /mnt/media
sshfs user@your.home.ip:/media /mnt/media 
  -o reconnect,ServerAliveInterval=15,IdentityFile=/root/.ssh/id_rsa

Your home upload speed becomes the bottleneck. 50 Mbps upload handles 1-2 simultaneous 4K streams.


Step 3: Deploy Jellyfin with Caddy

Create a docker-compose.yml file:

services:
  caddy:
    image: caddy:2-alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
    restart: unless-stopped

  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    volumes:
      - ./config:/config
      - ./cache:/cache
      - /mnt/media:/media:ro
    restart: unless-stopped

volumes:
  caddy_data:

Create the Caddyfile for automatic HTTPS:

jellyfin.yourdomain.com {
    reverse_proxy jellyfin:8096
}

Deploy the stack:

JellyWatchTry JellyWatch — Your Jellyfin companion, everywhere.
docker compose up -d

Caddy handles SSL automatically via Let's Encrypt. Your Jellyfin server is live at https://jellyfin.yourdomain.com.


Step 4: Security Hardening

A VPS is directly exposed to the internet. Security is not optional.

Firewall with UFW

ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

Fail2Ban for Brute-Force Protection

apt install fail2ban -y
systemctl enable --now fail2ban

Create /etc/fail2ban/jail.d/jellyfin.local:

[jellyfin]
enabled = true
filter = jellyfin
port = http,https
logpath = /path/to/jellyfin/config/log/log_*.log
maxretry = 5
bantime = 3600
findtime = 600

SSH Hardening Checklist

  • Disable password authentication (use SSH keys only)
  • Change SSH port from 22 to a non-standard port
  • Install unattended-upgrades for automatic security patches

The GPU Problem: No Hardware Transcoding

Most VPS providers do not offer GPU access. This means:

  • No hardware transcoding - all transcoding is software-only (CPU)
  • A single 4K software transcode can saturate 4-8 vCPU cores
  • Multiple simultaneous transcodes are impractical

Strategies to Avoid Transcoding on a VPS

  1. Optimize your library for Direct Play - encode everything to H.264 or H.265 with compatible audio (AAC/EAC3)
  2. Use Tdarr to pre-convert your library to universally compatible formats before uploading
  3. Set remote bitrate limits - force lower quality for bandwidth-constrained clients
  4. Educate your users - set client quality to "Maximum" or "Original" to avoid unnecessary transcoding

VPS Providers with GPU Access

Only a few providers offer GPU instances, and they are expensive:

  • Vultr - NVIDIA A40 at ~$90/month
  • Lambda - NVIDIA GPUs at ~$0.50/hour (on-demand)
  • Hetzner and Contabo do not offer GPU VPS plans

For most Jellyfin VPS setups, optimizing for Direct Play is more cost-effective than renting a GPU.


Bandwidth and Storage Math

Bandwidth

Streaming 4K at 25 Mbps for 4 hours/day uses roughly 36 GB/day or 1.1 TB/month per user.

  • 1 heavy user: ~1 TB/month - both Hetzner (20 TB) and Contabo (32 TB) handle this easily
  • 5 users: ~5 TB/month - no problem on either provider
  • 15 users: ~15 TB/month - tight on Hetzner, fine on Contabo
  • 20+ users: ~20 TB/month - consider Contabo or a dedicated server

Bandwidth is rarely the bottleneck on modern VPS plans.


Storage

  • 50 movies (1080p): ~250 GB - fits on Contabo M, needs Storage Box on Hetzner
  • 200 movies (1080p): ~1 TB - needs external storage on both
  • 500 movies (1080p): ~2.5 TB - needs a 5 TB Storage Box or cloud mount

Local VPS storage is for Jellyfin config and cache only. Media files belong on external storage.


Performance Without a GPU

  • Direct Play (any resolution): unlimited streams on any VPS
  • 1080p software transcode: 1 stream on 2 vCPU, 2-3 on 4 vCPU, 3-4 on 8 vCPU
  • 4K software transcode: not viable on 2 vCPU, barely 1 stream on 4-8 vCPU
  • Audio-only transcode: 5-15+ streams depending on CPU count

Direct Play is the only viable strategy for 4K content on a VPS without GPU.


Keeping Your VPS Secure and Updated

Automatic Docker Updates with Watchtower

services:
  watchtower:
    image: containrrr/watchtower:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true
    restart: unless-stopped

Watchtower checks for new Docker images daily at 4 AM and updates automatically.

Automatic OS Security Patches

apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades

FAQ

Can I run Jellyfin on a $5/month VPS? Yes, for 1-3 users with Direct Play content. Software transcoding will struggle on 2 vCPU.

Is Hetzner or Contabo better for Jellyfin? Hetzner for reliability and network quality. Contabo for raw storage per dollar. Both work well.

Can I use a VPS and a home server together? Yes. Run Jellyfin on the VPS for remote access, mount your home NAS via SSHFS for storage. The VPS acts as a relay with a public IP.

How do I upload my media to the VPS? Use rsync over SSH for initial upload. For ongoing sync, use Syncthing or rclone.

Is a VPS more secure than a home server? Different threat model. A VPS has a public IP by default (more exposed) but runs in a professional datacenter (better physical security). Proper firewall and Fail2Ban make it equally secure.

What about GDPR and data privacy on a VPS? Hetzner (Germany) and OVH (France) are GDPR-compliant. Your media files are stored on their infrastructure. Consider encryption for sensitive content.

Can I add a GPU later? Not on standard VPS plans. You would need to migrate to a dedicated server (Hetzner Robot) or a GPU cloud provider (Vultr, Lambda). Plan for Direct Play from the start.

What happens if my VPS provider goes down? Keep automated backups of your Jellyfin config folder. With a backup, you can redeploy on any provider in under 30 minutes.


Your VPS Jellyfin server is live. Monitor it from anywhere. Download JellyWatch on Google Play - real-time session monitoring, CPU alerts, and server health for your remote Jellyfin instance.

On Emby? Download EmbyWatch on Google Play - the same remote monitoring experience for Emby servers.


Oracle Cloud Free Tier vs Hetzner: The Free VPS Option

Oracle Cloud offers an Always Free ARM instance that many self-hosters use for Jellyfin. Here is how it compares to a paid Hetzner VPS.

Oracle Cloud Always Free Tier (2026)

ResourceFree Allocation
CPUUp to 4 ARM Ampere cores (shared across instances)
RAMUp to 24 GB (shared across instances)
Storage200 GB block volume total
Bandwidth10 TB/month outbound
Public IP1 reserved IP included
GPUNone
RegionsLimited availability (often sold out)

Oracle Free vs Hetzner CX32 Comparison

CriteriaOracle Free (ARM A1.Flex)Hetzner CX32 (~8 EUR/month)
CPU4 ARM cores (Ampere A1)4 x86 cores (AMD EPYC)
RAM24 GB8 GB
Storage200 GB (slow block volume)80 GB (fast NVMe)
Bandwidth10 TB/month20 TB/month
Network speedVariable (shared, can be throttled)Consistent 1 Gbps
AvailabilityHard to get (capacity limits)Always available
SupportCommunity only (free tier)Ticket support included
ReliabilityInstances can be reclaimed if idleGuaranteed uptime SLA
Docker imagesARM64 only (most Jellyfin images support it)AMD64 (universal support)
Price$0/month~8 EUR/month

When Oracle Free Tier Makes Sense

  • You are a single user or testing Jellyfin remotely
  • You want zero monthly cost and can tolerate occasional instability
  • You are comfortable with ARM architecture (most Docker images support it in 2026)
  • You managed to secure an instance (availability is limited)

When Hetzner is Worth Paying For

  • You share your server with 3+ users who expect reliability
  • You need consistent network performance (Oracle throttles free tier during peaks)
  • You want NVMe storage for fast library scanning and metadata
  • You need Storage Box integration for cheap bulk media storage
  • You cannot get an Oracle instance (capacity is often exhausted in popular regions)

The Oracle Free Tier Catch

Oracle reserves the right to reclaim idle Always Free instances. If your server has low CPU usage for an extended period, Oracle may terminate it. Mitigations:

  • Run a cron job that generates minimal CPU activity every few hours
  • Keep Jellyfin library scans scheduled regularly
  • Monitor uptime with an external tool (UptimeRobot, Gatus)

Verdict

Oracle Free Tier is excellent for experimentation and single-user setups. For a reliable server you share with others, spend the 8 EUR/month on Hetzner. The peace of mind and consistent performance are worth it.


Monthly Cost Calculator: VPS Jellyfin Setup

Here is what a realistic Jellyfin VPS setup costs per month depending on your library size and user count.

Scenario 1: Solo User, Small Library (< 100 movies)

ComponentProviderCost/month
VPS (2 vCPU, 4 GB RAM)Hetzner CX224.50 EUR
Storage (500 GB)Hetzner Storage Box3.80 EUR
DomainCloudflare (free DNS)0 EUR
Total~8.30 EUR/month

Scenario 2: Family Server, Medium Library (200-500 movies)

ComponentProviderCost/month
VPS (4 vCPU, 8 GB RAM)Hetzner CX327.50 EUR
Storage (2 TB)Hetzner Storage Box7.60 EUR
Domain (.app or .com)~1 EUR/month amortized1 EUR
Backups (automated)Hetzner Snapshots1.50 EUR
Total~17.60 EUR/month

Scenario 3: Shared Server, Large Library (500+ movies, 5-10 users)

ComponentProviderCost/month
VPS (8 vCPU, 16 GB RAM)Hetzner CX4215.50 EUR
Storage (5 TB)Hetzner Storage Box12.50 EUR
Domain + Cloudflare Pro2 EUR
BackupsHetzner Snapshots3 EUR
Total~33 EUR/month

Scenario 4: Maximum Value (Contabo)

ComponentProviderCost/month
VPS (6 vCPU, 16 GB, 400 GB SSD)Contabo Cloud VPS M12 EUR
Additional storage (800 GB HDD VPS)Contabo Storage VPS4 EUR
Total~16 EUR/month

Contabo gives you more raw storage per euro but with slightly less consistent network performance than Hetzner.

Cost Comparison: VPS vs Home Server (3-Year TCO)

VPS (Hetzner CX32 + 2TB)Home Server (N100 Mini PC)
Hardware0 EUR~180 EUR
Storage (4 TB HDD)0 EUR~100 EUR
Monthly cost15 EUR~5 EUR (electricity)
3-year total540 EUR~460 EUR
Upload speed1 GbpsDepends on ISP (10-100 Mbps)
MaintenanceProvider handles hardwareYou handle everything
Public IPAlways includedMay need DDNS or tunnel

Conclusion: A home server is cheaper long-term if you have good upload speed. A VPS wins on convenience, reliability, and bandwidth. Many users run both: home server for local playback, VPS as a remote relay.


Track your VPS costs against actual usage. Download JellyWatch on Google Play - monitor how many streams your VPS handles, CPU usage per transcode, and whether you need to scale up or down.

Comments 2

VPS_Hoster·

Running Jellyfin on a Hetzner CX32 with a 5TB Storage Box. Works perfectly for 3 remote users with Direct Play content. Total cost: under 12 EUR/month for everything including storage.

CloudAdmin·

The no-GPU reality is important to emphasize. I encoded my entire library to H.265 with dual audio (EAC3 + AAC) using Tdarr before uploading. Zero transcoding on the VPS now. Every stream is Direct Play.

Leave a comment

Never displayed publicly.
0 / 2000 · Supports limited Markdown: **bold**, *italic*, `code`, [link](url), lists, > quote.