Your Photos, Your Server, Your Rules
Google Photos is convenient until it isn’t. The moment Google announced the end of unlimited free storage in 2021, millions of users found themselves managing storage quotas, paying monthly subscription fees, or quietly watching their photo libraries get compressed and capped. For anyone who takes privacy seriously or simply refuses to pay for something they can run themselves, Immich has become the answer worth installing.
Immich is an open-source, self-hosted photo and video management platform that mirrors the Google Photos experience almost point for point – mobile apps, automatic backup, facial recognition, album creation, map view, and a timeline layout that feels immediately familiar. Running it on your own hardware means your photos never leave your network unless you want them to. The setup takes about an hour and requires only a basic comfort level with Docker and a machine to run it on.

What You Need Before You Start
The minimum viable setup for Immich is a machine running Linux – a Raspberry Pi 4 or 5, an old desktop, a NAS device with Docker support, or a VPS will all work. You need Docker and Docker Compose installed, at least 4GB of RAM for smooth operation, and enough storage space for your library. Immich itself is lightweight; the storage demand comes entirely from your photos and videos.
Before downloading anything, decide where your photos will live on disk. Immich uses a Docker volume for its upload directory, and you want that pointed at a real path on your storage drive from the beginning. Moving it later is possible but annoying. Create a folder like /mnt/photos/immich on whatever drive holds your media, and keep that path ready for the configuration step.
On the software side, your machine needs Docker Engine version 20.10 or later and Docker Compose v2. If you’re running a fresh Ubuntu or Debian install, both can be pulled directly from Docker’s official repository. Verify your versions with docker –version and docker compose version before proceeding. A common mistake is having the older standalone docker-compose binary instead of the integrated plugin – Immich’s official compose file expects the plugin syntax.
Installing Immich With Docker Compose
Immich’s installation is intentionally straightforward. Create a directory for the project – something like ~/immich-app – then download the official docker-compose.yml and .env example file directly from the Immich GitHub releases page using curl or wget. The compose file spins up several containers: the main Immich server, a microservices worker for background jobs, a machine learning container for facial recognition and smart search, a Redis instance, and a PostgreSQL database. You don’t need to configure most of this manually.
Open the .env file and set two things: UPLOAD_LOCATION to your chosen photo directory path, and DB_PASSWORD to a strong password of your choice. Everything else has sensible defaults. Run docker compose up -d from inside your project directory and Docker will pull the images and start all containers. The first launch takes a few minutes depending on your connection speed. Once running, Immich is accessible at http://your-server-ip:2283.

Configuring Immich and Migrating Your Library
The first time you hit the web interface, Immich prompts you to create an admin account. Do this immediately – the first account registered becomes the administrator and controls all server settings. After logging in, spend a few minutes in the Administration panel. Set your storage template under Settings so that uploaded files get organized into a folder structure like YYYY/MM/DD instead of sitting in a flat directory. This matters for long-term sanity if you ever need to access the files outside of Immich.
For migrating your existing Google Photos library, start by using Google Takeout to export your full library as a zip archive. Google Takeout bundles photos alongside JSON sidecar files that contain metadata like original capture dates, GPS coordinates, and descriptions. Immich has a dedicated CLI tool – the Immich CLI – designed exactly for this import scenario. Install it via npm (npm install -g @immich/cli), authenticate it against your server, then run immich upload –recursive /path/to/takeout-extracted-folder. The CLI reads Google’s sidecar JSON files and preserves the original dates rather than stamping everything with today’s import date, which is the detail that breaks most alternative import methods.
Facial recognition and object detection run automatically in the background after upload. The machine learning container processes images as a queue job, so depending on your library size and hardware it may take hours or days to complete. On a Raspberry Pi 5, expect roughly 300 to 500 photos processed per hour for face detection. A modern x86 machine with a decent CPU handles closer to 1,500 to 2,000 per hour. GPU acceleration is supported through CUDA for Nvidia cards and OpenVINO for Intel integrated graphics, and enabling it can push that number significantly higher. You configure hardware acceleration in the machine learning section of the Administration settings.
The mobile app – available for both iOS and Android – connects to your server using its local IP address or, if you have it set up, a domain name with HTTPS. Automatic backup works exactly like Google Photos: open the app, grant photo library permissions, and it backs up new photos silently in the background. The app supports background sync on Android natively. On iOS, background processes are more restricted by the operating system, so backups trigger when you open the app or via iOS Shortcuts automation if you want something more hands-free. One practical note: set the app to back up only on Wi-Fi unless you have an unlimited data plan, because the default setting allows cellular uploads.
Securing and Maintaining Your Setup
Running Immich purely on your local network is already a significant privacy upgrade over cloud storage, but most people eventually want remote access – to view photos while traveling or share albums with family. The right way to expose Immich externally is through a reverse proxy with HTTPS rather than opening port 2283 directly. Nginx Proxy Manager or Caddy work well for this and handle automatic SSL certificate renewal through Let’s Encrypt. Pair that with a dynamic DNS service if your home IP address changes regularly. If you already have AdGuard Home running as a local DNS filter, you can create a local DNS rewrite to give Immich a clean internal hostname like photos.home without touching external DNS at all.
Updates to Immich release frequently – the project is under active development and new features ship roughly every two weeks. The update process is simple: pull the new images with docker compose pull then restart with docker compose up -d. Immich handles database migrations automatically on startup. Back up your PostgreSQL database and your upload directory before major version updates, because the project is still pre-1.0 and breaking changes, while infrequent, do happen. A simple cron job that runs pg_dump nightly covers the database side.

The machine learning container is optional and can be disabled entirely in the compose file if your hardware is too limited to run it or you simply don’t want it. Everything else – timeline browsing, albums, sharing, mobile backup, map view – continues to work without it. That modularity is one of Immich’s quiet strengths: it doesn’t force features on hardware that can’t support them. Whether you’re still deciding how much to invest in your home server setup or running a full rack, Immich scales to fit what you actually have.
Frequently Asked Questions
Can Immich import photos from Google Takeout with correct dates?
Yes. The Immich CLI reads Google’s JSON sidecar files during import and preserves original capture dates and GPS metadata.
Does Immich work without the machine learning container?
Yes. Facial recognition and smart search require it, but all other features including mobile backup, albums, and timeline browsing work without it.





