Why Immich Is Worth the Setup Time
Google Photos changed how people think about photo storage – automatic backups, face recognition, and search that actually works. But Google’s decision to end unlimited free storage pushed a lot of users to look elsewhere. Immich fills that gap almost exactly, offering a self-hosted photo and video library with face detection, album sharing, mobile backup, and a web interface that looks remarkably close to what you’d expect from a polished commercial product.
The trade-off is real: you need a server, a domain or local network, and about an hour of setup time. If you already run Docker on a home server or a VPS, that hour is well spent. Immich handles RAW files, videos, and Live Photos, and its mobile apps for Android and iOS support background sync. For anyone serious about owning their media library, it’s the most complete open-source option available right now.

What You Need Before You Start
Immich runs on Docker, so the first requirement is a machine with Docker and Docker Compose installed. A Raspberry Pi 4 with 4GB of RAM can handle it for a small library, but a proper x86 machine or a cloud VPS with at least 4 CPU cores and 8GB of RAM will give you faster thumbnail generation and machine learning features without constant lag. Storage is the bigger consideration – plan for at least twice the size of your current photo library, since Immich generates thumbnails and previews alongside originals.
You also need a place to put the stack. A local machine works fine for home use, but if you want mobile backup from outside your network, you’ll need to expose Immich to the internet through a reverse proxy and a domain name. Caddy or Nginx Proxy Manager both handle this cleanly with automatic HTTPS. If you’re already running other self-hosted services and want a central place to organize access, Flame as a self-hosted start page lets you keep Immich alongside your other tools from one dashboard.
Setting Up the Docker Stack
Start by creating a project directory. On your server, run mkdir immich && cd immich. Immich’s official documentation provides a docker-compose.yml and a .env file that you download directly from their GitHub releases page. Use wget or curl to pull both files into your directory. Avoid copying compose files from third-party tutorials – Immich updates frequently and outdated configs break things in ways that are hard to diagnose.
Open the .env file and set three values: UPLOAD_LOCATION pointing to wherever you want photos stored on disk, DB_PASSWORD set to a strong random string, and IMMICH_VERSION which should match the latest stable release tag from the GitHub releases page. Everything else in the default config works out of the box for most setups. Don’t skip setting a real database password – the default is a placeholder that should never run in production.
Once the env file is configured, run docker compose up -d from the project directory. Docker will pull all the required images – the main Immich server, the microservices container that handles machine learning, PostgreSQL with the pgvecto.rs extension, and Redis. The first pull takes several minutes depending on your connection speed. When it finishes, Immich will be accessible on port 2283 of your server’s local IP address.
Open a browser and navigate to http://your-server-ip:2283. The first time you visit, Immich walks you through creating an admin account. Set a strong password here – this account has full control over the instance, including the ability to create additional user accounts for family members. After the admin setup completes, you land directly in the main photo library interface. It’s empty at this point, which is expected.

Importing Your Existing Library
Immich has two ways to get photos in: upload through the web interface or mobile apps, or use the built-in CLI tool for bulk imports. For anyone migrating from Google Photos, the CLI is the right choice. Download your Google Takeout archive, extract it, and use the immich-cli tool with the command immich upload –recursive /path/to/takeout/folder. The CLI reads the JSON metadata files that Google exports alongside each photo and preserves original creation dates, which is the part that most other migration tools get wrong.
Machine learning features – specifically face detection and CLIP-based search – run as a background job after upload. Expect the first processing pass to take hours or even days for a large library. The microservices container handles this work asynchronously, so Immich remains usable while it runs. You can monitor job progress under Administration > Jobs in the web interface, where each queue shows processed versus pending counts in real time.
Mobile Backup and Day-to-Day Use
Install the Immich app on your phone and enter your server URL along with your credentials. If you’re accessing Immich from outside your home network, use your domain name with HTTPS. The app’s backup settings let you choose which albums sync automatically, set whether to upload over cellular or Wi-Fi only, and schedule background sync intervals. On iOS, background app refresh needs to be enabled for automatic uploads to work without opening the app manually.
The search feature is where Immich genuinely surprises people. Because it uses CLIP embeddings rather than just filename and tag matching, you can search for “beach sunset” or “dog running in snow” and get accurate results even for photos that have never been tagged. Face recognition groups people automatically, and you can name each cluster from the People view. Albums work the same way they do in Google Photos – you create them manually or share them with other users on the same instance.
One thing worth setting up early is external library support. If you have a large existing photo collection stored on a NAS or external drive, Immich can index that location without copying files into its upload folder. Under Administration > External Libraries, you define a path that maps to a mounted volume in the Docker compose file. This keeps your originals exactly where they are while making them searchable through the Immich interface – no duplication required.

Keeping Immich Running Reliably
Immich releases updates frequently, and some updates include database migrations that can’t be skipped. The safest update process is to run docker compose pull followed by docker compose up -d from your project directory. Before any update, back up the PostgreSQL database using docker exec -t immich_postgres pg_dumpall -c -U postgres > immich_backup.sql. If an update breaks something, this dump is what gets you back to a working state without losing metadata, albums, or face tags.
For storage redundancy, the upload folder itself should be on a RAID array or backed up to a separate location – ideally offsite. Immich does not handle storage redundancy on its own. The database backup covers all the metadata and organizational structure, but the actual photo files need their own backup strategy. A simple cron job that rsyncs the upload directory to a second drive or a cloud storage bucket covers the gap. What you don’t want is a single-disk failure wiping both the photos and the Immich database at the same time.
The machine learning container can be disabled entirely if your hardware can’t handle it – face detection and smart search will stop working, but basic upload, albums, and search by date or filename continue without it. Set IMMICH_MACHINE_LEARNING_ENABLED=false in the env file and remove the machine learning service from the compose file. On low-power hardware running a modest library for one person, skipping ML is often the right call to keep the rest of the stack responsive.





