Why Google Photos Keeps Getting Harder to Trust
Google Photos is convenient until it isn’t. Storage caps, privacy concerns, and the general unease of handing your entire personal photo library to an ad-supported platform have pushed a growing number of people toward self-hosted alternatives. Immich – an open-source photo and video management application – fills that gap with a polished interface, mobile apps, and a feature set that rivals what Google offers, without the subscription fees or the data harvesting.
Setting up Immich takes roughly an hour if you have a Linux server or home lab already running. If you are starting from scratch, you will need a machine with at least 4GB of RAM, Docker and Docker Compose installed, and enough storage to house your library. A dedicated NAS, an old PC, or a cloud VPS all work. The guide below walks through the full process from installation to mobile sync.

Installing Immich with Docker Compose
Immich runs as a stack of containers – the main server, a microservices worker, a machine learning container for facial recognition and smart search, a Redis cache, and a PostgreSQL database. Docker Compose manages all of them together, which means the setup stays repeatable and upgrades are straightforward. Start by creating a dedicated directory on your server: mkdir /opt/immich && cd /opt/immich. From there, pull the official compose file and environment template directly from the Immich GitHub repository using wget https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml and wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env.
Open the .env file in your editor of choice. The three variables you must set before anything else are UPLOAD_LOCATION (the path on your host where photos will be stored), DB_PASSWORD (set a strong unique password here), and IMMICH_VERSION (use release to always pull the latest stable build). The UPLOAD_LOCATION path needs to exist before you start the stack, so create it now with mkdir -p /mnt/photos/immich or whatever path fits your storage layout. Once the env file is saved, run docker compose up -d from the /opt/immich directory. The first pull takes a few minutes depending on your connection speed. When all containers show as healthy in docker compose ps, Immich is running.
First Login, Admin Setup, and Storage Configuration
Open a browser and navigate to http://your-server-ip:2283. The first user to register automatically becomes the admin account, so complete that step immediately before exposing the port to any network. Set a strong password – this account controls user management, library settings, and storage configuration for the entire instance.
After logging in, head to Administration > Storage Template. Immich uses a templating system to organize uploaded files into folder structures on disk, which matters if you ever want to access your files outside of Immich itself. A sensible default is {{y}}/{{MM}}/{{dd}}/{{filename}}, which sorts photos by year, month, and day. You can also include album names or camera model in the path. Think through this before bulk importing – changing the template later does not retroactively reorganize files already on disk.
External library support is one of Immich’s most useful features for people with existing photo archives. Rather than re-uploading everything through the web interface, you can point Immich at a folder already on your server and it will index the files without copying them. Go to Administration > External Libraries, add a new library, and specify the path. Immich will scan it and make the photos browsable without moving or duplicating anything. Scheduled rescans keep the library in sync as new files land in that folder.
For users running Immich on a machine with limited resources, the machine learning container is the first thing worth tuning. Facial recognition and CLIP-based smart search are impressive, but they are computationally expensive. In the .env file, you can disable the ML container entirely by setting IMMICH_MACHINE_LEARNING_ENABLED=false, or you can let it run and simply adjust the job concurrency under Administration > Jobs so it processes in the background without saturating the CPU.

Reverse Proxy and HTTPS Access
Accessing Immich over plain HTTP on a local IP is fine for initial testing, but for remote access or mobile sync over the internet, you need HTTPS. The standard approach is to put Nginx or Caddy in front of Immich as a reverse proxy and terminate TLS there. If you are already running a home server with services exposed through a reverse proxy, adding Immich is a matter of creating a new server block pointing to port 2283. If this is your first time setting up a reverse proxy on a home lab, the Proxmox VE home server guide covers the broader infrastructure context that makes this kind of self-hosting sustainable.
Caddy is the faster option for most people because it handles certificate provisioning automatically through Let’s Encrypt. A minimal Caddyfile entry looks like this: photos.yourdomain.com { reverse_proxy localhost:2283 }. Point your domain’s DNS A record to your server’s public IP, open ports 80 and 443 on your router, and Caddy takes care of the rest. For those on a home network without a static IP, a free dynamic DNS service like Duck DNS keeps the domain pointed at the right address as your ISP rotates IPs. Immich itself has no built-in TLS support, so the reverse proxy layer is not optional for secure remote access.
Mobile App Setup and Auto-Backup
Immich publishes official iOS and Android apps that handle automatic photo backup from your phone. After installing the app, enter your Immich server URL – use the HTTPS address if you have set it up, or the local IP for LAN-only access – and log in with your credentials. The backup configuration under Settings > Backup in the app controls which albums sync, whether videos are included, and whether backup runs only on Wi-Fi. For most people, Wi-Fi-only backup is the right default to avoid burning mobile data on large video files.
The app mirrors the Google Photos experience more closely than most self-hosted alternatives manage to. Timeline browsing, album creation, face albums (once the ML container has processed your library), map view, and search all work from mobile. Shared albums let multiple users on the same Immich instance share photos with each other, which makes it practical for households or small groups. Each user gets their own library with separate storage, and the admin can set per-user storage quotas under Administration > Users.
One area where Immich still requires some patience is the initial bulk import. Uploading tens of thousands of photos through the web interface or mobile app works, but the Immich CLI tool is faster for large archives. Install it with npm install -g @immich/cli, then run immich upload –recursive /path/to/your/photos after authenticating with your server credentials. The CLI preserves original filenames and metadata, respects duplicate detection, and can resume interrupted uploads – which matters a lot when moving a 200GB library.

Keeping Immich Updated and Backed Up
Immich releases updates frequently – sometimes weekly – and the project explicitly warns against running old versions due to breaking database changes between releases. Updating is simple: from the /opt/immich directory, run docker compose pull && docker compose up -d. The containers are replaced with the new versions and the database migrations run automatically on startup. Watch the logs with docker compose logs -f immich-server during the first boot after an update to confirm the migration completes cleanly.
Backing up Immich requires two separate concerns: the PostgreSQL database and the uploaded files. The database holds all metadata – albums, faces, tags, user accounts – without which the photo files are just a folder of images. Back it up with docker exec immich_postgres pg_dumpall -U postgres > immich_backup.sql on a scheduled cron job. The upload directory can be handled by whatever backup strategy you already use for your server – rsync to a secondary drive, Backblaze B2, or a local NAS snapshot. Running Immich without an offsite backup of at least the database is a risk that tends to announce itself at the worst possible moment.
Worth watching as the project matures: Immich has added video transcoding, partner sharing, and memory features at a pace that most open-source projects do not sustain. The roadmap still lists native iOS widget support and improved map clustering as pending. Whether the small core team can keep that pace while handling a rapidly growing user base is the real open question for anyone deciding to migrate their primary photo archive here.





