Key Takeaway
- 🎬 Two services, one box, one bill: the Jellyfin Immich media stack unites your family’s movies (Jellyfin) and photos (Immich) on a single Hostinger KVM — no per-device subscriptions, no third-party albums, no ads ever shown to your mother.
- 🧩 One compose file does it: both containers share one network, one storage tree, and one reverse proxy — the stack in this guide deploys in about 35 minutes with every command written out.
- 📸 The killer loop: family phones auto-upload to Immich → albums update → Jellyfin’s “Home Videos” library picks them up for TV-night — the two products are stronger as one stack than either is alone.
- 💰 The plan math: KVM 2 is the sweet spot (~$7–9/mo); the full plan-decision table is inside, sized by how much your family actually streams.
This Jellyfin Immich media stack guide exists because your family already pays for this three times over: the streaming subscription for the shows, the cloud subscription for the photos, and the quiet tax of ads and algorithm on both. The Jellyfin Immich media stack on a Hostinger KVM ends the third one and gives the first two an address you own — one box in a professional datacenter carrying every movie, every series, every photo, and every family video, streamed to any device, at any relative’s house, without asking a platform’s permission. This guide builds it end to end: what to order, the exact compose file, the mobile auto-upload wiring, and the TV-night loop that makes grandparents cry happy tears.
What the Jellyfin Immich Media Stack Actually Is
The Jellyfin Immich media stack is two open-source products sharing one mission. Jellyfin is the media server: it organizes your movies, series, and music into a Netflix-shaped interface your family already understands, streams to TVs, phones, and browsers, and serves every format without transcoding drama when devices support Direct Play. Immich is the photo vault: mobile apps auto-upload every camera roll shot, faces get recognized and grouped, albums assemble themselves, and the timeline feels exactly like the one Google Photos taught everyone to love — except the storage is your disk, not an ad platform’s data lake. Neither product appeared on this site’s how-to shelf by accident: Jellyfin got its standalone build guide in September, and Immich followed the same week. This guide is the third act — running both as one coordinated stack on one KVM plan, where each strengthens the other.

Why One Box Beats Two (and Why VPS Beats Pi-at-Home)
The instinct is to split the Jellyfin Immich media stack across two machines — and for tinkerers, fine. For a family, one stack wins on every axis that matters. One bill, one maintenance window, one set of monitoring dashboards, and one shared storage tree where Immich’s uploads and Jellyfin’s library live a folder apart instead of on two machines that drift apart. And the VPS-vs-Pi-at-home argument has already been settled by every remote-Filipino family that lived through a brownout silencing its home server: the KVM box in a datacenter keeps serving while the neighborhood generator coughs. If your home box is part of the plan (a Zigbee coordinator here, a Frigate camera brain there — How-To #22 covers that brain), this stack is the cloud half it talks to.
The Plan-Decision Table: Which KVM for Your Family
Size the Jellyfin Immich media stack properly: pick the plan by what the family actually does, not by marketing courage. Current anchors verified this month: KVM 1 runs ~$6.49/month at intro pricing, KVM 2 lands in the ~$7–9 band, and KVM 4 spans ~$26–43 depending on term — check the current KVM plans before ordering because promotions move weekly.
- KVM 1 (photos-first households): Immich’s mobile auto-upload plus a small Jellyfin library (home videos and kids’ shows, no transcoding). Immich’s machine-learning face recognition runs but expects patience on first indexing.
- KVM 2 (the sweet spot for the Jellyfin Immich media stack): both services comfortably, ML indexing at civilized speed, and 1–2 CPU-transcoded streams when a device insists on it. This is the plan this guide assumes.
- KVM 4 (the household server): stacks this pair with Frigate and Home Assistant Container on one metal — the full home-away nervous system in a single monthly invoice.
VPS transcode honesty: cloud KVM has no GPU, so 4K HDR will never transcode gracefully. Keep devices Direct-Play-capable (install the right client apps) and the stack never breaks a sweat. The one genuine rule of thumb: photos scale infinitely, transcoded video does not — spend your plan budget on RAM for Immich’s ML, and your bandwidth budget on clients that Direct Play.
Step 0 — Prerequisites
- A Hostinger KVM VPS (Ubuntu 24.04 LTS) with Docker + Compose installed — How-To #21’s base setup covers this in full.
- A subdomain pair pointed at the box:
watch.yourdomain.com(Jellyfin) andphotos.yourdomain.com(Immich). - About 35 focused minutes, and the family photo library wherever it currently lives (Google Takeout, an old drive, a laptop).
Step 1 — The Directory and Storage Skeleton
One storage tree serves both services. Build it first:
mkdir -p /opt/mediastack/{jellyfin/config,jellyfin/cache,immich/db,immich/upload,immich/profile,library/movies,library/shows,library/homevideos}
chown -R 472:472 /opt/mediastack/jellyfin
chmod -R 750 /opt/mediastackThe rule that makes the stack sing: immich/upload holds raw phone uploads (private), while library/homevideos holds curated family folders (shared to Jellyfin). Curate by moving, not duplicating — one copy on disk, two services presenting it.
Step 2 — The compose.yml (Whole File, Ready to Paste)
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
ports:
- "8096:8096"
volumes:
- /opt/mediastack/jellyfin/config:/config
- /opt/mediastack/jellyfin/cache:/cache
- /opt/mediastack/library:/media:ro
environment:
- JELLYFIN_PublishedServerUrl=https://watch.yourdomain.com
networks:
- media
immich_server:
image: ghcr.io/immich-app/immich-server:release
container_name: immich_server
restart: unless-stopped
depends_on:
- immich_db
ports:
- "2283:2283"
volumes:
- /opt/mediastack/immich/upload:/usr/src/app/upload
- /opt/mediastack/library/homevideos:/usr/src/app/external/homevideos
environment:
- DB_HOSTNAME=immich_db
- DB_USERNAME=immich
- DB_PASSWORD=CHANGE_ME_LONG
- DB_DATABASE_NAME=immich
- IMMICH_MACHINE_LEARNING_URL=http://immich_ml:3003
networks:
- media
immich_ml:
image: ghcr.io/immich-app/immich-machine-learning:release
container_name: immich_ml
restart: unless-stopped
volumes:
- /opt/mediastack/immich/profile:/config
networks:
- media
immich_db:
image: tensorchord/pgvecto-rs:pg16-v0.2.0
container_name: immich_db
restart: unless-stopped
environment:
- POSTGRES_PASSWORD=CHANGE_ME_LONG
- POSTGRES_USER=immich
- POSTGRES_DB=immich
volumes:
- /opt/mediastack/immich/db:/var/lib/postgresql/data
networks:
- media
networks:
media:That is the complete Jellyfin Immich media stack compose file. Change the two CHANGE_ME_LONG values, then docker compose up -d. Both UIs come alive on their ports; the reverse proxy (Caddy from earlier guides, or your choice) fronts watch. and photos. with TLS in three lines each.
Step 3 — Jellyfin First-Run and Library Wiring
Bring the Jellyfin Immich media stack online piece by piece, Jellyfin first. Walk watch.yourdomain.com‘s setup wizard: name the server, add your admin user, then add three libraries — Movies → /media/movies, Shows → /media/shows, Home Videos → /media/homevideos. Enable real-time monitoring on Home Videos: when Immich’s export lands new curated files in that tree, Jellyfin notices within seconds, no restart. Create one user per family member (kids with no-delete profiles), and the household cinema opens its doors.
Step 4 — Immich First-Run and the Family Auto-Upload
Now the second half of the Jellyfin Immich media stack. Walk photos.yourdomain.com: create the admin account, confirm the ML service shows healthy (the compose file wires it). Then issue one account per family member and have each install the Immich mobile app, sign in, enable backup, and choose Wi-Fi-only or always. From that moment the roll uploads itself: faces group, albums build, and the vault fills. Set the server’s backup policy in the Immich admin panel — for the Philippines’ mobile data economics, default phones to Wi-Fi-only and the upload never eats a load allowance.
Step 5 — The TV-Night Loop (Where the Stack Becomes Magic)
Curate monthly-ish: from Immich’s albums, export chosen albums to the external library path, or simply drop camera folders into /opt/mediastack/library/homevideos/YYYY-month/. Jellyfin’s real-time monitoring picks them up as “Home Videos” — newest at the top. The loop that makes this stack beloved: phone shots of the birthday → auto-uploaded by every guest’s phone → one folder move → playing on the family TV in Bacolod the same weekend, with no subscription and no logo but yours. (Power-users: Immich can automate the move with its external-library feature pointing at the shared tree — the compose file above already mounts it.)
Step 6 — Backups Without Rituals
The Jellyfin Immich media stack copies originals from family phones — that IS the backup copy for the photos (phones keep theirs until user intervention). For the server, two moves make it durable: nightly pg_dump of the Immich database to /opt/mediastack/ plus a weekly volume snapshot via the Hostinger panel; and for the curated library/ tree, an off-server copy — cheap object storage or a rotating external drive at your own desk — because the curated tree is the irreplaceable layer. Immich’s restore-from-upload path also means the worst case (VPS dies) recovers every photo from the phones that produced them — an honest limit worth knowing before you need it.
The Maintenance Drill (Monthly, Fifteen Minutes)
The Jellyfin Immich media stack maintenance drill: docker compose pull && docker compose up -d refreshes both products (both products release actively — follow the official Jellyfin release notes and official Immich documentation); glance at docker stats once a month for the RAM envelope (Immich ML is the hungry one); spot-check the reverse proxy’s TLS dates; and ask the family one question: does the TV still open Home Videos happily? — the entire support department for this stack is that conversation.
What This Means for the Family That’s Far
The deepest product of the Jellyfin Immich media stack isn’t media serving — it’s presence. The stack quietly ends the sentence every overseas Filipino knows: “I saw your photos on Facebook already.” Now the answer is: the album updated itself the moment the shot was taken, the TV already has it, and the family movie night opens with last Sunday’s video of the kids — uploaded from your side of the ocean, served by a box that never blinks, owned by no algorithm. One KVM plan, zero subscriptions, no third party between this camera roll and that living room. That is sovereignty in the shape of an app your mother can actually use.
Frequently Asked Questions
Can the Jellyfin Immich media stack run on KVM 1?
Yes for photos-first use — Immich alone plus a light Jellyfin library fits in 4GB-class VMs. Expect slower first-pass face indexing and keep expectations modest on transcoding; if the family streams alongside the photo vault, step to KVM 2.
How big a disk does a Jellyfin Immich media stack need?
Photos: roughly 3–5 GB per person per year of typical phone shooting. Video libraries dominate — a modest family cinema (200 films, 30 series) wants 1–2 TB, which outgrows most VPS NVMe tiers; the honest architecture is curated favorites on the VPS plus bulk libraries on cheap external storage, or Immich on the VPS and the big video library at the (reliable) home box.
Can a Jellyfin Immich media stack share storage without duplicating files?
Yes — shared storage is the point of the external-library mount in this Jellyfin Immich media stack design: curated Immich albums and the Jellyfin Home Videos library read the same physical tree, so a file moved (not copied) is available to both. The official Immich external-library documentation covers external-library sync semantics in detail.
Do phones need to be on the same network to upload?
No — apps talk to photos.yourdomain.com over TLS from any internet. That is the whole design: a mother in Batangas and an engineer in Riyadh upload to the same vault from anywhere on earth.
What happens when two family members upload the same group photo?
Immich de-duplicates by content hash — the second upload registers as “already exists.” No double storage, no duplicate timeline entries.
Is Jellyfin really free forever, no catch?
The Jellyfin project is community-owned with no premium tier, no telemetry requirement, and no paywall — its funding model is donations, not locks. That is precisely why it survives where ad-funded “free” streaming doesn’t: there is no revenue machine that needs to own your family’s viewing data.
Go deeper along the same shelf: pair this stack with the Frigate NVR camera brain for the front-door feed, the Home Assistant Container stack for the automations that announce birthdays on the TV, and the KVM plans to size the box before you build. One plan, the whole archive, no landlord in between.
Financial Disclaimer
General information only — not financial advice. Pricing references (plan tiers, intro rates) reflect figures published at writing and change without notice; verify current pricing before purchase. This article contains an affiliate link, which earns the publisher a commission at no additional cost to the reader and does not influence the technical guidance, which follows public project documentation and the author’s own deployment practice.






