If you’ve ever paused before uploading a photo to Google Photos, wondering who else might see it someday, you’re not alone. That hesitation is exactly why Immich exists. It’s a self-hosted photo and video platform that gives you the same convenience — automatic phone backup, face recognition, fast search — without handing your memories to a company that monetizes them.
This guide walks through how to self-host Immich from a blank server to a working backup pipeline on your phone. No fluff, no guessing. Just what actually works, based on Immich’s own documentation and real deployment behavior.
What Immich Is and Who It’s For
Immich is an open-source, self-hosted photo and video management platform. You run it on your own hardware — a home server, a NAS, a mini PC, or a cheap VPS — and it behaves a lot like Google Photos: a mobile app quietly backs up your camera roll in the background, and a web app lets you browse, search, and organize everything afterward.
It’s a strong fit if you’re a developer comfortable with Docker, a student who wants free unlimited storage on hardware you already own, a privacy-conscious person tired of cloud scanning, or a homelabber looking for a genuinely useful project. It’s a poor fit if you don’t want to maintain a server at all — Immich needs occasional updates, backups, and a bit of babysitting. If that sounds like a chore rather than a hobby, a paid cloud service is honestly the better trade.
What Your Server or NAS Can Handle
Before picking a deployment, be honest about your hardware. Immich isn’t a single lightweight app — it runs four core services together: the main server, a machine-learning container for face detection and smart search, PostgreSQL, and Redis (or Valkey) for job queuing.
According to Immich’s official requirements, the practical baseline is 6GB RAM minimum, 8GB recommended, and 2 CPU cores minimum, 4 recommended. Machine-learning features are the biggest resource consumer — if you disable them, you can get away with less.
| Hardware | Safe Use Class | Recommended Deployment | Performance Expectation |
|---|---|---|---|
| Raspberry Pi / low-power NAS (2–4GB RAM) | Small library, no ML | NAS app or lightweight Compose | Slow thumbnail generation, laggy search |
| Mini PC (8GB RAM, 4 cores) | Medium personal library | Docker Compose on Linux | Smooth day-to-day use |
| Home server / used enterprise box (16GB+, GPU) | Large library, multi-user | Docker Compose with hardware acceleration | Fast face detection, quick imports |
| VPS (4–8GB RAM) | Small-to-medium library, remote-first | Docker Compose + reverse proxy | Good, but storage cost adds up fast |
Treat this table as a practical starting point, not a guarantee — actual performance depends heavily on library size and how many people are uploading at once.
Best Deployment Options in 2026
You’ve got a few realistic paths:
- Docker Compose on Linux — the officially recommended method, and the one this guide focuses on.
- NAS deployment (Synology, Unraid, TrueNAS) — Immich has documented community and semi-official paths here, often using Unraid’s Docker Compose Manager plugin or similar tooling.
- Mini PC home server — great balance of cost, power draw, and performance.
- VPS with remote access — works, but you’re paying for storage by the gigabyte, which adds up for photo libraries fast.
- Windows via Docker Desktop or WSL2 — technically possible, but Immich’s own docs are blunt about it: non-Linux operating systems provide a noticeably worse experience, and official support for troubleshooting on them is limited.
If you’re unsure where to start, a small Linux VM or a spare mini PC running Docker Compose is the least painful entry point.
Install Immich Step by Step
This is the core workflow for Linux (the officially supported path).
1. Verify Docker is correct. Immich requires the docker compose plugin command — not the older, deprecated docker-compose binary. Check with:
docker compose version
If that fails, install Docker using the official installation script for your distribution rather than your distro’s default package, since older packaged versions commonly cause permission and compatibility errors.
2. Create a working directory.
mkdir -p /opt/immich && cd /opt/immich
3. Download the compose and environment files.
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
4. Edit .env. Set UPLOAD_LOCATION to a directory with plenty of free space, set a database password, and optionally set your timezone. A minimal relevant snippet:
yaml
UPLOAD_LOCATION=./library
DB_DATA_LOCATION=./postgres
TZ=Etc/UTC
5. Start the stack.
docker compose up -d
This pulls four services: immich-server (API and app logic), immich-machine-learning (face detection, smart search), postgres (Immich uses PostgreSQL 14 with vector extensions), and redis/valkey for job queuing. First run takes a few minutes while images download.
6. Verify.
docker compose ps
All containers should show as “Up.” If one has exited, check docker compose logs <service-name> to see why.
7. Register the admin account. Open http://<server-ip>:2283 in a browser. The first account created automatically becomes the admin.
Add Your First Photos and Enable Mobile Backup
Upload a test photo from the web UI first, just to confirm the pipeline works end to end. Then install the mobile app (available for iOS and Android, and via Obtainium on Android using a config link from your server’s Utilities page). Log in with your server address, open the backup screen from the cloud icon, and enable automatic backup.
If uploads don’t start: double-check the app can actually reach your server’s address (this is the single most common failure), confirm background app permissions are enabled on the phone, and check that the album you expect to back up is actually selected in the app’s backup settings.
Use Immich Remotely and Securely
Don’t expose port 2283 directly to the internet. Put a reverse proxy — Nginx or Traefik — in front of it with HTTPS, or use a Cloudflare Tunnel to avoid opening any inbound ports at all. Direct exposure without HTTPS or authentication in front of it is a real security risk, since it puts your admin login and photo library directly on the open internet.
Immich vs. Other Photo Tools
| Tool | Self-Hosted | Mobile Backup | Best For |
|---|---|---|---|
| Immich | Yes | Strong, automatic | Google Photos-style experience, privacy |
| Google Photos | No | Yes | Zero setup, easiest option |
| PhotoPrism | Yes | Limited | Power users focused on library/tagging |
| Nextcloud Photos | Yes | Via Nextcloud app | Already using Nextcloud for other files |
| Synology Photos | Yes (Synology only) | Yes | Existing Synology NAS owners |
Fix Common Problems
- Immich is slow: Usually machine learning running on underpowered hardware. Enable hardware acceleration in
docker-compose.yml(tags like-cuda,-openvino,-rknn) if you have compatible hardware. - Mobile backup not working: Check network reachability first, then app permissions, then the selected backup album.
- Remote access fails: Confirm your reverse proxy config and DNS are pointing correctly, and check container logs for TLS errors.
- Storage filling up fast: Video transcoding and thumbnails add real overhead — budget extra space beyond your raw library size.
- Containers won’t start: Run
docker compose logs. A common cause is a Docker Engine version too old to supporthealthcheck.start_interval— comment that line out in the compose file as a workaround.
FAQ
Key Takeaways
Self-hosting Immich is genuinely achievable in an afternoon if you’re comfortable with basic terminal commands. Match your hardware to your library size, use Docker Compose on Linux for the smoothest ride, and never skip the reverse proxy step if you plan to access it remotely.

No comments yet. Be the first to share your thoughts!