NODED.CLOUD/Blog/Immich on a VPS: Self-Hosted Photo Backup, Sized Honestly

Immich on a VPS: Self-Hosted Photo Backup, Sized Honestly

15 Oct 2026 · Mario Marin

Immich on a VPS works for the app and a modest library; disk is the limit. Verified requirements, storage maths, EU prices, CPU-only machine learning and backups.

Moving a family's photos off Google Photos or iCloud usually stalls on one question: where does the library live instead? A NAS in the hallway is one answer, with its power cuts, dying disks and a home upload link that crawls when you are away. The other is an Immich VPS in an EU data centre. Immich is a self-hosted Google Photos alternative with phone apps that back up in the background, a timeline, face grouping and smart search, here on a machine you control, in a country you chose.

This post covers what Immich needs (checked against its docs for the 3.3 release, October 2026), the storage maths, what it costs with us, CPU-only machine learning, a short install and backup outline, and where a VPS is the wrong product. Short version: Immich hosting on a VPS works for the app and a modest library, and the constraint is disk, not memory.

Immich server requirements, and whether a VPS meets them

From the official requirements page:

  • RAM: minimum 6 GB, recommended 8 GB. A 4 GB system can run Immich only with machine learning switched off.
  • CPU: minimum 2 cores, recommended 4. Since v3 the machine-learning container on amd64 needs an x86-64-v2 CPU, which covers most chips since about 2012; in a virtual machine the virtual CPU has to expose it too, so check first with /lib64/ld-linux-x86-64.so.2 --help | grep x86-64-v2, which should report it as supported.
  • Linux, Docker Engine and the Compose plugin. Docker Compose is the recommended production install.
  • Postgres on SSD, never a network share. The database is typically 1–3 GB. The compose file ships Immich's own Postgres image with the VectorChord extension; pgvecto.rs support was dropped in 3.0.

Our VPS III (8 GB, 2 vCPU) meets the recommended memory and the minimum CPU; VPS IV (16 GB, 4 vCPU) meets both recommendations. Each VPS has its own virtual disk on enterprise SSD (SATA in our European locations), not a network share. Immich alone outgrows the budget in what fits on a 4 GB VPS, so nothing here starts below 8 GB. Disk is the real limit: one VPS tops out at 270 GB.

Immich storage requirements: the maths

Three things share the disk: your originals, which Immich never modifies; generated content (thumbnails, previews, transcoded video), which the docs put at 10–20% of the library on average; and everything else, meaning the OS, Docker images, model cache, Postgres and Immich's own database dumps. Budget about 20 GB for that last group.

The table works backwards: subtract 20 GB, keep 10% free so Postgres never meets a full disk, divide by 1.2 for the top of the overhead range. Photos assume about 3 MB each, video about 100 MB per minute of phone footage. Rough planning estimates, not measurements.

Usable diskOriginals (rough)≈ photos only≈ or video only
60 GB (VPS III alone)30 GB10,0005 hours
210 GB (VPS III + 150 GB)140 GB46,00023 hours
230 GB (VPS IV + 150 GB)155 GB51,00025 hours
270 GB (VPS VI + 150 GB)185 GB61,00030 hours

Real libraries mix the two: 30,000 photos (about 90 GB) plus six hours of video (about 36 GB) is roughly 126 GB, which fits the 210 GB configuration. Video is what eats the ceiling. Your Google or iCloud storage page shows the library's size today; after the first import, du -sh ./library/* in the Immich directory shows what Immich added.

Sizing and prices

ConfigurationRAM / vCPU / diskBucharestWarsawSofia
VPS III + 150 GB8 GB / 2 / 210 GB€22€26€28
VPS IV + 150 GB16 GB / 4 / 230 GB€28€36€38
VPS VI + 150 GB32 GB / 8 / 270 GB€70€86€90

Prices are monthly; Vienna, when it has stock, costs the same as Sofia. Extra storage is €4 a month per 50 GB, at most three increments; a smaller library can take fewer, so VPS III with one is 110 GB for €14 in Bucharest. No plan has a transfer quota; VPS III is rate-limited at 180 Mbps and VPS IV at 220 Mbps, in and out.

VPS IV matches Immich's recommendation and suits a family or small team. VPS III suits one or two people who can wait out the first import; you can upgrade from the panel later. VPS VI is there for the 270 GB maximum.

Immich machine learning on CPU, with no GPU

None of our VPS plans has a GPU, the same trade-off our Jellyfin post covers for media servers. Immich's FAQ calls the initial backup the most intensive phase: thumbnails, Smart Search and Face Detection for every asset, plus video transcoding. On CPU that is slow but it finishes, and afterwards only new uploads are processed. We have not benchmarked it, so start a large import in the evening and watch Administration → Job Queues. If it drags:

  • Keep job concurrency at or below your core count, as the docs advise, so the apps stay responsive.
  • Borrow a home machine. With remote machine learning you run the immich-machine-learning container on a desktop (port 3003) and use Add URL in Machine Learning Settings; the VPS's own container stays as the fallback. Image previews are sent to that machine and the container has no security of its own, so reach it over a WireGuard tunnel, never an open port.
  • Lighten the load. The FAQ suggests the buffalo_s face model instead of buffalo_l. Smart search, faces or machine learning as a whole can be switched off, but search and Explore get much worse.

Hardware transcoding in Immich means NVENC, Quick Sync, VAAPI or RKMPP, all needing a GPU or a specific chip, so video is software-encoded. The defaults are modest: only video outside the accepted formats is transcoded, to 720p, with the ultrafast preset. The Don't transcode any videos policy saves CPU and disk, at the cost of some files not playing in a browser.

Install outline: Docker Compose, TLS, firewall

On a Debian or Ubuntu LTS image with Docker Engine from Docker's own repository, the official steps are:

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
# edit .env and the ports line first, then:
docker compose up -d
  • .env: point UPLOAD_LOCATION at the space, use only letters and digits in DB_PASSWORD, uncomment TZ, and pin IMMICH_VERSION to an exact release.
  • docker-compose.yml: change '2283:2283' to '127.0.0.1:2283:2283'. Docker's documentation says published ports bypass ufw, so binding to localhost is the simple way to keep 2283 off the internet. Then open only SSH, 80 and 443.

Immich must sit on the root of a (sub)domain, not a sub-path. Caddy fetches the certificate itself:

photos.example.org {
    reverse_proxy http://127.0.0.1:2283
}

With nginx, copy the docs' example: client_max_body_size 50000M, request buffering off, 600-second timeouts. Without it, nginx's default 1 MB body limit rejects any upload over 1 MB, which means most photos and every video.

The phone apps upload new photos when opened and periodically in the background, on Wi-Fi only by default (iOS needs Background App Refresh). For an archive on a computer, the Immich CLI (immich upload --recursive) is quicker.

Backups: the database and the files, somewhere else

Immich keeps file paths and metadata in Postgres and does not rescan the library folder, so the database is half of any backup. It dumps the database daily at 02:00 into UPLOAD_LOCATION/backups and keeps 14, but the backup docs are explicit: those dumps contain no photos, and Immich does not back up your files. Originals live in library, upload and profile; thumbs and encoded-video can be regenerated, but on CPU that means rerunning the slowest jobs, so copy them too. Database first, files second:

# 1. database first
mkdir -p ~/immich-db
docker exec -t immich_postgres pg_dump --clean --if-exists \
  --dbname=immich --username=postgres | gzip > ~/immich-db/dump.sql.gz
# 2. then the files (your UPLOAD_LOCATION), to another machine
restic -r sftp:backup@backup-host:/srv/restic/immich backup \
  ~/immich-db ~/immich-app/library

The cheap target is a small second VPS in another EU country running restic or Borg; our backup-target post covers sizing and hardening. Our VPS plans have no client snapshots. Own-image capture (up to three images per account, €0.06 per GB a month) suits a configured base system, not a versioned copy of a photo library.

Immich EU hosting: where the photos sit

Pick Bucharest, Sofia or Warsaw (Vienna, Frankfurt and Amsterdam when the order page shows stock) and the library stays in the EU; Ashburn is in the United States. Our data processing agreement says content stays in the chosen location and EU-located servers are administered only by EU staff; it names one non-EEA sub-processor for control-panel and console traffic. The EU data residency page has the details, and our Nextcloud post covers self-hosted file storage. Keep the backup copy and any remote machine-learning box in the EU as well. A practical note, not legal advice.

Where a VPS stops being the answer

  • Disk. By our rough estimate, about 185 GB of originals is the most one VPS holds comfortably. Past 150 GB and growing, or with a lot of 4K video, a dedicated server with its own disks is the right product.
  • No GPU. Machine learning and transcoding are CPU-only; remote machine learning helps but adds a machine to maintain.
  • You run it. Immich ships often: read the release notes, back up before upgrading, and update a remote ML container with the server. Nobody at Noded watches your instance. Immich's own FAQ notes that self-hosting rarely saves money once backups and your time are counted.

How Noded Can Help

Test first: create an hourly VPS III in Bucharest (€0.0139 an hour), install Immich, upload a month of photos and some long videos, and watch the job queues, the du figures and the machine-learning log. Three hours costs about €0.04; hourly machines need €5 of account credit and bill while powered off, so destroy it afterwards. Then order the monthly shape from the VPS hosting page with the storage increments your estimate calls for, and set up the backup in another country the same week.

FAQ

How much RAM does Immich need?

The docs say 6 GB minimum and 8 GB recommended, with 4 GB workable only if machine learning is disabled, which is why we start at VPS III.

Can Immich machine learning run on a CPU without a GPU?

Yes, CPU is the default. The first import is slow because every photo goes through Smart Search and Face Detection; after that only new uploads are processed.

How much storage does Immich need?

Your originals plus 10–20% for thumbnails and transcoded video, the database (typically 1–3 GB) and the system. One VPS holds at most 270 GB, roughly 185 GB of originals by our estimate.

Where are my photos stored?

In the location you order. Bucharest, Sofia and Warsaw (or Vienna, Frankfurt and Amsterdam when the order page shows stock) keep them in the EU; Ashburn is in the United States.

Do I still need backups if Immich is my photo backup?

Yes. The server needs its own off-site copy of the database and the files; our VPS plans have no client snapshots, so use restic or Borg to a second machine.

← All posts

Related services

Run this on NODED.CLOUD.

Keep reading

More from the NOC.

06 Aug 2026·Mario Marin

Nextcloud Hosting on a VPS in the EU

Self-hosting Nextcloud on an EU VPS keeps your files under GDPR without the Dropbox or Google Drive data-residency guesswork. Here's how to size the right tier and test it hourly before committing.

Read post
14 Aug 2026·Mario Marin

Archiving Twitch VODs on a Storage VPS

Twitch VODs expire fast: as little as 7 days by default, up to 60 for Partners. Here's how we set up an automated pull-and-archive pipeline onto a storage VPS so your back catalog of streams and clips never disappears.

Read post

Like the way we run things? Spin up a server in 60 seconds.