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
- Create an account at hetzner.com/cloud
- 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
- 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:
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-upgradesfor 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
- Optimize your library for Direct Play - encode everything to H.264 or H.265 with compatible audio (AAC/EAC3)
- Use Tdarr to pre-convert your library to universally compatible formats before uploading
- Set remote bitrate limits - force lower quality for bandwidth-constrained clients
- 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)
| Resource | Free Allocation |
|---|---|
| CPU | Up to 4 ARM Ampere cores (shared across instances) |
| RAM | Up to 24 GB (shared across instances) |
| Storage | 200 GB block volume total |
| Bandwidth | 10 TB/month outbound |
| Public IP | 1 reserved IP included |
| GPU | None |
| Regions | Limited availability (often sold out) |
Oracle Free vs Hetzner CX32 Comparison
| Criteria | Oracle Free (ARM A1.Flex) | Hetzner CX32 (~8 EUR/month) |
|---|---|---|
| CPU | 4 ARM cores (Ampere A1) | 4 x86 cores (AMD EPYC) |
| RAM | 24 GB | 8 GB |
| Storage | 200 GB (slow block volume) | 80 GB (fast NVMe) |
| Bandwidth | 10 TB/month | 20 TB/month |
| Network speed | Variable (shared, can be throttled) | Consistent 1 Gbps |
| Availability | Hard to get (capacity limits) | Always available |
| Support | Community only (free tier) | Ticket support included |
| Reliability | Instances can be reclaimed if idle | Guaranteed uptime SLA |
| Docker images | ARM64 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)
| Component | Provider | Cost/month |
|---|---|---|
| VPS (2 vCPU, 4 GB RAM) | Hetzner CX22 | 4.50 EUR |
| Storage (500 GB) | Hetzner Storage Box | 3.80 EUR |
| Domain | Cloudflare (free DNS) | 0 EUR |
| Total | ~8.30 EUR/month |
Scenario 2: Family Server, Medium Library (200-500 movies)
| Component | Provider | Cost/month |
|---|---|---|
| VPS (4 vCPU, 8 GB RAM) | Hetzner CX32 | 7.50 EUR |
| Storage (2 TB) | Hetzner Storage Box | 7.60 EUR |
| Domain (.app or .com) | ~1 EUR/month amortized | 1 EUR |
| Backups (automated) | Hetzner Snapshots | 1.50 EUR |
| Total | ~17.60 EUR/month |
Scenario 3: Shared Server, Large Library (500+ movies, 5-10 users)
| Component | Provider | Cost/month |
|---|---|---|
| VPS (8 vCPU, 16 GB RAM) | Hetzner CX42 | 15.50 EUR |
| Storage (5 TB) | Hetzner Storage Box | 12.50 EUR |
| Domain + Cloudflare Pro | 2 EUR | |
| Backups | Hetzner Snapshots | 3 EUR |
| Total | ~33 EUR/month |
Scenario 4: Maximum Value (Contabo)
| Component | Provider | Cost/month |
|---|---|---|
| VPS (6 vCPU, 16 GB, 400 GB SSD) | Contabo Cloud VPS M | 12 EUR |
| Additional storage (800 GB HDD VPS) | Contabo Storage VPS | 4 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) | |
|---|---|---|
| Hardware | 0 EUR | ~180 EUR |
| Storage (4 TB HDD) | 0 EUR | ~100 EUR |
| Monthly cost | 15 EUR | ~5 EUR (electricity) |
| 3-year total | 540 EUR | ~460 EUR |
| Upload speed | 1 Gbps | Depends on ISP (10-100 Mbps) |
| Maintenance | Provider handles hardware | You handle everything |
| Public IP | Always included | May 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
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.
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