Self-hosted photo and video backup and management server with web UI, mobile sync, and shared albums.
| Port | 2283 |
| Registry | ghcr.io/daemonless/immich-server |
| Source | https://github.com/immich-app/immich |
| Website | https://immich.app/ |
| Tag | Description | Best For |
|---|---|---|
latest |
Upstream Binary. Built from official release. | Most users. Matches Linux Docker behavior. |
beta |
Beta release built from upstream v3.0.0-rc.2. | Alternative build. |
Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions.
services:
immich-server:
image: "ghcr.io/daemonless/immich-server:latest"
container_name: immich-server
environment:
- DB_HOSTNAME=immich-postgres # Postgres database hostname
- DB_USERNAME=postgres # Postgres database user
- DB_PASSWORD=postgres # Postgres database password
- DB_DATABASE_NAME=immich # Postgres database name
- REDIS_HOSTNAME=immich-redis # Redis hostname
- PUID=1000 # User ID for the application process
- PGID=1000 # Group ID for the application process
- TZ=UTC # Timezone for the container
- SKIP_CHOWN= # Skip the startup recursive chown of /config and /data (default false). Set true on a second container that shares the same /data mount, or once ownership is known-correct, to avoid a slow chown on every start.
volumes:
- "/path/to/containers/immich-server:/config"
- "/path/to/containers/immich-server/data:/data"
ports:
- "2283:2283"
restart: unless-stopped.env:
# .env
DIRECTOR_PROJECT=immich-server
DB_HOSTNAME=immich-postgres
DB_USERNAME=postgres
DB_PASSWORD=postgres
DB_DATABASE_NAME=immich
REDIS_HOSTNAME=immich-redis
PUID=1000
PGID=1000
TZ=UTC
SKIP_CHOWN=
appjail-director.yml:
# appjail-director.yml
options:
- virtualnet: ':<random> default'
- nat:
services:
immich-server:
name: immich_server
options:
- container: 'boot args:--pull'
- expose: '2283:2283 proto:tcp' \
oci:
user: root
environment:
- DB_HOSTNAME: !ENV '${DB_HOSTNAME}'
- DB_USERNAME: !ENV '${DB_USERNAME}'
- DB_PASSWORD: !ENV '${DB_PASSWORD}'
- DB_DATABASE_NAME: !ENV '${DB_DATABASE_NAME}'
- REDIS_HOSTNAME: !ENV '${REDIS_HOSTNAME}'
- PUID: !ENV '${PUID}'
- PGID: !ENV '${PGID}'
- TZ: !ENV '${TZ}'
- SKIP_CHOWN: !ENV '${SKIP_CHOWN}'
volumes:
- immich-server: /config
- immich-server_data: /data
volumes:
immich-server:
device: '/path/to/containers/immich-server'
immich-server_data:
device: '/path/to/containers/immich-server/data'Makejail:
# Makejail
ARG tag=latest
OPTION overwrite=force
OPTION from=ghcr.io/daemonless/immich-server:${tag}
Note: Exposing ports in AppJail means that your service can be reached from remote hosts. If that is not your intention, do not expose the ports and communicate with the service using the IPv4 address assigned by the virtual network.
podman run -d --name immich-server \
-p 2283:2283 \
-e DB_HOSTNAME=immich-postgres \
-e DB_USERNAME=postgres \
-e DB_PASSWORD=postgres \
-e DB_DATABASE_NAME=immich \
-e REDIS_HOSTNAME=immich-redis \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=UTC \
-e SKIP_CHOWN= \
-v /path/to/containers/immich-server:/config \
-v /path/to/containers/immich-server/data:/data \
ghcr.io/daemonless/immich-server:latestappjail oci run -Pd \
-o overwrite=force \
-o container="args:--pull" \
-o virtualnet=":<random> default" \
-o nat \
-o expose="2283:2283 proto:tcp" \
-e DB_HOSTNAME=immich-postgres \
-e DB_USERNAME=postgres \
-e DB_PASSWORD=postgres \
-e DB_DATABASE_NAME=immich \
-e REDIS_HOSTNAME=immich-redis \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=UTC \
-e SKIP_CHOWN= \
-o fstab="/path/to/containers/immich-server /config <pseudofs>" \
-o fstab="/path/to/containers/immich-server/data /data <pseudofs>" \
ghcr.io/daemonless/immich-server:latest immich-serverNote: Exposing ports in AppJail means that your service can be reached from remote hosts. If that is not your intention, do not expose the ports and communicate with the service using the IPv4 address assigned by the virtual network.
- name: Deploy immich-server
containers.podman.podman_container:
name: immich-server
image: "ghcr.io/daemonless/immich-server:latest"
state: started
restart_policy: always
env:
DB_HOSTNAME: "immich-postgres"
DB_USERNAME: "postgres"
DB_PASSWORD: "postgres"
DB_DATABASE_NAME: "immich"
REDIS_HOSTNAME: "immich-redis"
PUID: "1000"
PGID: "1000"
TZ: "UTC"
SKIP_CHOWN: ""
ports:
- "2283:2283"
volumes:
- "/path/to/containers/immich-server:/config"
- "/path/to/containers/immich-server/data:/data"| Variable | Default | Description |
|---|---|---|
DB_HOSTNAME |
immich-postgres |
Postgres database hostname |
DB_USERNAME |
postgres |
Postgres database user |
DB_PASSWORD |
postgres |
Postgres database password |
DB_DATABASE_NAME |
immich |
Postgres database name |
REDIS_HOSTNAME |
immich-redis |
Redis hostname |
PUID |
1000 |
User ID for the application process |
PGID |
1000 |
Group ID for the application process |
TZ |
UTC |
Timezone for the container |
SKIP_CHOWN |
`` | Skip the startup recursive chown of /config and /data (default false). Set true on a second container that shares the same /data mount, or once ownership is known-correct, to avoid a slow chown on every start. |
| Path | Description |
|---|---|
/config |
Configuration directory (unused but mounted) |
/data |
Media storage (photos, videos, thumbnails) |
| Port | Protocol | Description |
|---|---|---|
2283 |
TCP | Web UI/API |
This image is part of the Immich Stack.
Architectures: amd64
User: bsd (UID/GID via PUID/PGID, defaults to 1000:1000)
Base: FreeBSD 15.1
Need help? Join our Discord community.