App Guides

Immich on a Seedbox: Self-Host Your Photos Without a Home Server

Immich is the self-hosted Google Photos replacement everyone wants, and photo libraries eat storage. An appbox gives you terabytes of included space, and this exact setup is tested end to end on our platform.

Why Immich on an Appbox

Immich is the most popular self-hosted photo backup around, a full Google Photos replacement with mobile auto-upload, face recognition, and search. The catch when people try to run it on a cheap VPS is always the same: photo libraries are huge, and VPS storage is billed per gigabyte. A family library of a few hundred gigabytes quickly costs more in disk than the server itself.

An appbox flips that around. Storage is included, from 500 GB up to many terabytes, there is no per-gigabyte billing, and every container you run gets automatic HTTPS on its own subdomain. You do not need a home server, port forwarding, or a domain.

This guide is the exact setup we run ourselves, tested end to end on our platform. Everywhere below, replace USERNAME with your panel username in lowercase and SERVER with your server name; your appbox page shows both. If you have never run a container on your appbox before, skim Run Your Own Docker Containers on a Seedbox first.

What You Need

The Setup

Create the folder and the two files:

mkdir -p ~/apps/immich
cd ~/apps/immich

First ~/apps/immich/.env:

UPLOAD_LOCATION=./library
DB_DATA_LOCATION=./postgres
TZ=Europe/Amsterdam
IMMICH_VERSION=v3
DB_PASSWORD=pick-a-long-random-password-here
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

Set your own timezone and make the database password long and random (it never leaves the box, you will not have to type it again).

Then ~/apps/immich/docker-compose.yml. This is the official Immich compose file with three changes for the appbox: no published ports (the proxy handles the web route), the server joined to your proxy network with routing labels, and everything set to restart automatically:

name: immich

services:
  immich-server:
    container_name: immich-server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    volumes:
      - ${UPLOAD_LOCATION}:/data
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    networks:
      - default
      - traefik_USERNAME
    labels:
      - traefik.enable=true
      - traefik.docker.network=traefik_USERNAME
      - traefik.http.routers.immich.rule=Host(`immich.USERNAME.SERVER.bysh.me`)
      - traefik.http.routers.immich.entrypoints=web
      - traefik.http.services.immich.loadbalancer.server.port=2283
    depends_on:
      - redis
      - database
    restart: unless-stopped
    healthcheck:
      disable: false

  immich-machine-learning:
    container_name: immich-machine-learning
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    volumes:
      - model-cache:/cache
    env_file:
      - .env
    restart: unless-stopped
    healthcheck:
      disable: false

  redis:
    container_name: immich-redis
    image: docker.io/valkey/valkey:9@sha256:8e8d64b405ce18f41b8e5ee20aa4687a8ed0022d1298f2ce31cdcf3a76e09411
    healthcheck:
      test: redis-cli ping || exit 1
    restart: unless-stopped

  database:
    container_name: immich-postgres
    image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      POSTGRES_INITDB_ARGS: '--data-checksums'
    volumes:
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    shm_size: 128mb
    restart: unless-stopped
    healthcheck:
      disable: false

volumes:
  model-cache:

networks:
  traefik_USERNAME:
    external: true

Start it:

docker compose up -d

The first start downloads about 4.3 GB of images, which takes a couple of minutes on our network. One thing not to worry about: the database container shows health: starting for a full five minutes after boot. That is just its slow health check timer; Immich works fine during that window.

First Run

Open https://immich.USERNAME.SERVER.bysh.me. The first visitor gets the admin registration screen, so create your account right away. Then install the Immich app on your phone, point it at that same URL as the server address, and turn on auto backup.

That is the whole thing. Your photos land in ~/apps/immich/library on your appbox, visible to your other apps too.

Good to Know

If you would rather manage all of this from a web UI, see Portainer on a Seedbox. And if you get stuck anywhere, open a ticket; this stack is one we know well.

15+ years of seedbox hosting 4.9/5 Trustpilot (301 reviews) 78+ one-click apps

Ready to Get Started?

Set up your own media server in under two minutes.