Leaving Google Photos and iCloud for Immich: Costs, Hardware and a Full Docker Setup

For years my photos lived in two clouds. Pictures from the Pixel went to Google Photos, pictures from the iPhone went to iCloud, and every few months I’d get the same email: storage almost full. Paying more was always one tap away, and that’s exactly the problem. The bill only ever goes up, and the library is never really mine.

Today every photo from both phones and my Fujifilm X-E5 lands in one place: Immich, running on my own server. This post is the guide I wish I’d had when I started. It covers what Immich needs, what the hardware actually costs in India right now, whether it really saves money, and every step to install it with Docker and move your existing library out of Google Photos or iCloud.

What is Immich?

Immich is a free, open-source, self-hosted photo and video backup app. If you’ve used Google Photos, you’ll feel at home in about five minutes: a timeline, albums, a map, shared albums, face recognition, and smart search where you type “dog on a beach” and it finds the dog on the beach. The difference is that all of this runs on a computer you own, and your photos never leave your house unless you want them to.

There are apps for Android and iOS that back up your camera roll automatically in the background, and a web app for browsing on a laptop. Immich is licensed under the GNU AGPL v3. There is an optional paid supporter licence at buy.immich.app, but nothing is locked behind it.

Immich requirements

These are the current official numbers from the Immich requirements page, which was last updated in October 2026:

MinimumRecommended
Operating system64-bit Linux (Ubuntu, Debian etc.). Windows and macOS work through Docker Desktop but are strongly discouraged.
RAM6 GB8 GB
CPU2 cores4 cores
Architectureamd64 or arm64. On amd64, the machine learning container needs an x86-64-v2 CPU (most CPUs from around 2012 onwards).
StorageA Unix-style filesystem (EXT4, ZFS, Btrfs, XFS, APFS). Plan for your library size plus 10–20% for thumbnails and transcoded videos.
DatabaseTypically 1–3 GB. It should live on a local SSD, never on a network share.
SoftwareDocker with the Docker Compose plugin (the docker compose command; the old docker-compose is no longer supported).

Two things are worth calling out. First, RAM matters more than CPU. Immich can run on 4 GB, but only with the machine learning features (face recognition and smart search) turned off, and those are half the reason to use it. Second, keep the database on an SSD. Your photos can sit on a big hard drive, but the database is what makes the timeline feel fast.

Choosing hardware

You don’t need a rack in a cupboard. There are three sensible routes:

  • Reuse an old laptop or desktop. Any 64-bit machine with 8 GB of RAM and an SSD will do. This is the cheapest way in, and a laptop even comes with its own battery backup.
  • Buy a mini PC. An Intel N150 box with 16 GB of RAM and a 512 GB SSD is the sweet spot. It’s quiet, sips power, has four cores, and its integrated graphics can help with video transcoding.
  • Use a NAS you already own. Immich has community install guides for Synology, QNAP, Unraid and TrueNAS. Check that your model meets the RAM requirement first; many entry-level NAS boxes ship with 2 GB.

For storage, use a hard drive built for always-on use, such as a NAS drive with CMR recording, and buy two: one for Immich and one for backups. A single drive is not a backup, and moving off the cloud means backups are now your job.

What it costs, and when it saves money

Here’s where I want to be honest, because a lot of self-hosting posts skip this part. All prices below are in India as of October 2026.

The cloud bill

PlanPrice5 years10 years
Google One Premium, 2 TB₹650/month or ₹6,500/year₹32,500₹65,000
iCloud+ 2 TB₹749/month₹44,940₹89,880
iCloud+ 6 TB₹2,999/month₹1,79,940₹3,59,880

Google One totals assume the annual plan at the regular price. Taxes and limited-time offers are not included.

The self-hosted bill

ItemApproximate price
Intel N150 mini PC, 16 GB RAM, 512 GB SSD₹19,000–35,000 (I’ve used ₹25,000 below)
4 TB NAS hard drive (WD Red Plus class)₹20,000–24,000 each
USB enclosures or a dock for the drivesAbout ₹4,000 for two
Electricity for a mini PC and a drive (about 20 W, around the clock, at ₹8 per unit)About ₹1,400/year

Put together for a 2 TB library:

SetupUpfront5 years
Immich on an old PC you already own (2 × 4 TB drives)₹48,000About ₹58,500
Immich on a new mini PC (2 × 4 TB drives)₹73,000About ₹80,000
iCloud+ 2 TB₹0₹44,940
Google One 2 TB₹0₹32,500

The old-PC row assumes about 30 W of power draw. Your electricity rate depends on your state and slab.

So, at 2 TB and with 2026 drive prices, self-hosting is not the cheaper option. Hard drive and memory prices have risen sharply this year; one price tracker I checked shows the 4 TB WD Red Plus selling well above its long-term average. If your whole family fits comfortably inside Google’s 2 TB plan, the cloud wins on money alone.

The maths flips in a few situations:

  • Your library outgrows 2 TB. Cloud pricing jumps in big steps. On iCloud, the next tier is 6 TB at ₹2,999 a month, which is ₹1,79,940 over five years. A mini PC with two 6 TB drives costs roughly ₹92,000 to buy, plus about ₹7,000 of electricity over the same period. That’s a saving of around ₹80,000 in five years, and it grows every year after.
  • You shoot with a real camera. RAW files and 4K video fill 2 TB much faster than phone photos. My X-E5 files are the reason my library grew as fast as it did.
  • The server does more than photos. The same box runs Nextcloud and Paperless-ngx for me, which replaces other paid storage I’d otherwise need.
  • You think in decades. Hardware is a one-time cost with the occasional drive replacement. A subscription is forever, and prices tend to only go up.

Money is also only half the story. You keep full-quality originals, you choose who can see them, nobody trains anything on them, and a policy change at Google or Apple can’t touch your library.

Installing Immich with Docker

Docker Compose is the method the Immich team recommends for production. I’m using a fresh install of Ubuntu Server here, but any modern Debian-based distro works the same way. The screenshots below are from the official Immich documentation.

Step 1: Install Docker Engine

Don’t install the docker.io package from Ubuntu’s own repository. The Immich docs specifically warn that older distro packages cause errors. Use Docker’s official install script instead:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Let your user run Docker without sudo (log out and back in afterwards)
sudo usermod -aG docker $USER
# Check that the Compose plugin is installed
docker compose version

Step 2: Prepare the photo drive

Format your big drive as EXT4 and mount it somewhere permanent, for example /mnt/photos. Find the drive’s UUID with lsblk -f and add it to /etc/fstab so it mounts on every boot:

sudo mkdir -p /mnt/photos
lsblk -f # note the UUID of your photo drive
# Add a line like this to /etc/fstab (use your own UUID)
UUID=your-drive-uuid /mnt/photos ext4 defaults,nofail 0 2
sudo mount -a
df -h /mnt/photos

Step 3: Download the Immich files

Create a folder for Immich on the SSD and download the two files it needs:

mkdir ./immich-app
cd ./immich-app
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

Step 4: Edit the .env file

Open .env with nano .env and change three things: where photos are stored, your timezone, and the database password. Leave the database itself on the SSD.

# Photos and videos go on the big drive
UPLOAD_LOCATION=/mnt/photos/immich
# Database stays on the local SSD
DB_DATA_LOCATION=./postgres
# Your timezone
TZ=Asia/Kolkata
# Immich version
IMMICH_VERSION=v3
# Use letters and numbers only, no symbols or spaces
DB_PASSWORD=ReplaceWithALongRandomPassword
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

For the password, the Immich docs ask for letters and numbers only. You can generate one with openssl rand -hex 24.

Step 5: Start Immich

docker compose up -d
# Check that every container is running
docker compose ps

The first start takes a few minutes while Docker downloads the images. If you see an error about healthcheck.start_interval, your Docker version is older than v25; update Docker, or comment out the start_interval line in the database section of docker-compose.yml.

Step 6: Create the admin account

Open http://<your-server-ip>:2283 in a browser and click Getting Started. The first account you create becomes the admin.

Immich admin registration form asking for email, password and name
Registering the admin user. Screenshot: Immich documentation.

Step 7: Turn on the storage template

By default, Immich stores uploads in folders named after random IDs. I strongly recommend enabling the storage template before you upload anything, so files on disk are organised by date. It makes your backups readable even without Immich. Go to Administration → Settings → Storage Template and switch it on.

Immich storage template settings with the enable toggle
Enabling the storage template. Screenshot: Immich documentation.

The default pattern is Year/Year-Month-Day/Filename.Extension, which is a good choice. You can build your own from the variables Immich offers:

Immich storage template builder showing a preview of the folder structure
Customising the template. Screenshot: Immich documentation.

Step 8: Add your family (optional)

Each person should have their own account so their libraries stay separate. Go to Administration → Users and click Create user.

Immich user management page with the Create user button
The Users page. Screenshot: Immich documentation.
Immich create user dialog with email, password, name and quota fields
You can set a storage quota per person. Screenshot: Immich documentation.

Step 9: Set up the phone app

Install Immich from the Play Store or the App Store. On the login screen, enter your server URL, http://<your-server-ip>:2283, and sign in.

Immich mobile app sign-in screen with a server URL field
Signing in on the phone. Screenshot: Immich documentation.

Tap the cloud icon at the top right, choose the albums you want to back up (usually Camera or Recents), then tap Enable Backup.

Immich mobile app backup screen with album selection
Choosing which albums to back up. Screenshot: Immich documentation.

Moving your existing library

The phone app handles new photos. Years of old photos need a one-time import. For this, the Immich docs recommend immich-go, a community-built command-line tool that understands Google and Apple exports and keeps dates and albums intact.

Download the build for your computer from the immich-go releases page, then create an API key in Immich: click your profile picture, open Account Settings → API Keys, and create a new key. Copy it somewhere safe; Immich only shows it once.

From Google Photos

  1. Go to takeout.google.com, click Deselect all, then tick only Google Photos.
  2. Choose Export once, file type .zip, and the largest file size so you have fewer archives to deal with.
  3. Wait for Google’s email, then download every archive into one folder. Don’t unzip them.
  4. Run immich-go against the whole set:
./immich-go upload from-google-photos \
--server=http://<your-server-ip>:2283 \
--api-key=YOUR_API_KEY \
/path/to/takeout-*.zip

Pass all the archives in a single run. Google splits a photo and its metadata file across different archives, and immich-go needs to see all of them to put each date and album back together.

From iCloud Photos

There are two ways, and the easy one is surprisingly good.

The easy way: let the iPhone do it. If your iPhone has enough free space, go to Settings → Photos and pick Download and Keep Originals. Once the full library is on the phone, the Immich app backs up the whole library the same way it handles new photos.

The thorough way: an export from Apple. Go to privacy.apple.com, choose Request a copy of your data, select iCloud Photos and submit. Apple can take several days to prepare it. Download and extract the files into one folder, then run:

./immich-go upload from-icloud \
--server=http://<your-server-ip>:2283 \
--api-key=YOUR_API_KEY \
/path/to/icloud-export

immich-go reads the CSV files in Apple’s export to restore capture dates and album names.

From anywhere else

OneDrive, Amazon Photos, an old external drive, a folder of camera exports: download everything into a folder and use from-folder:

./immich-go upload from-folder \
--server=http://<your-server-ip>:2283 \
--api-key=YOUR_API_KEY \
/path/to/photos

Don’t cancel the subscription yet

Compare the photo and video counts in Immich with the counts in Google Photos or iCloud. Spot-check a few old albums and videos. Then keep both running side by side for a month. Only cancel once your backups (next section) are working and you’ve confirmed you can restore from them.

Accessing Immich away from home

At this point Immich only works on your home Wi-Fi. Please don’t solve that by forwarding port 2283 on your router to the open internet. I use Tailscale, which puts my phones and the server on a private network that works from anywhere. Install it on the server and on each phone, then use the server’s Tailscale address in the Immich app. If you prefer your own domain, the Immich docs have a reverse proxy guide.

Backups: the part you can’t skip

Google and Apple were quietly keeping redundant copies for you. Now that’s your job. The Immich team recommends the 3-2-1 rule: three copies of your data, on two different devices, with one copy off-site.

  • The database is backed up automatically. Immich saves a database dump every day at 2:00 AM into UPLOAD_LOCATION/backups and keeps the last 14. You can change this under Administration → Settings → Database Dump Settings.
  • The photos are not. Copy the whole UPLOAD_LOCATION folder to your second drive on a schedule, using a tool like rsync, restic or Borg. At the very least, back up library, upload and profile, since those hold your originals.
  • Back up the database before the files. If the two get out of step, this order means the worst case is a few files the database doesn’t know about, rather than database entries pointing at missing photos.
  • Keep one copy outside the house. A drive at a family member’s place that you swap every few months is enough.

Restoring is built into the web app now, under Administration → Maintenance. Try it once on a spare machine so you know it works before you need it.

Keeping Immich updated

Immich moves fast. Before updating, read the release notes for breaking changes, then run:

cd ./immich-app
docker compose pull
docker compose up -d

The upsides and the downsides

What you gain: full-resolution originals with no “storage saver” compression, one library for Android and iPhone together, no monthly bill that grows with your library, storage that grows by adding a drive instead of jumping a tier, private face recognition and search that run on your own hardware, and the freedom to switch phones or platforms without migrating anything.

What you take on: a real upfront cost, especially with 2026 drive prices; backups, updates and drive health become your responsibility; there’s no support line when something breaks; and a power cut or a dead drive at home is now your problem, not a data centre’s.

Is it worth it?

If your library is small and the cloud never bothers you, stay where you are. It’s cheaper in the short term and it’s one less thing to look after.

But if you’re about to jump to a bigger storage tier, if you shoot with a camera, if your family is split across Android and iPhone, or if you just want your memories to belong to you, Immich is the best self-hosted photo app I’ve used. It took me an evening to set up and a weekend to import everything. Since then, the only thing I’ve had to think about is which photos to take.