Skip to content

Immich PostgreSQL Immich PostgreSQL

Description / nameInput element
Container Registry
Container Configuration Root Path
Immich PostgreSQL Host Port
Immich PostgreSQL /var/lib/postgresql/data Path

Build Status Last Commit sysvipc Required

PostgreSQL with pgvector and vectorchord extensions required by Immich for vector similarity search. Defaults to PostgreSQL 14 (:latest), PostgreSQL 18 available as :18.

Port 5432
Registry ghcr.io/daemonless/immich-postgres
Daemonless daemonless/immich-postgres
Source immich-app/immich
Website immich.app

Version Tags

Tag Description Best For
14 / 14-pkg / latest Upstream Binary. Built from official release. Most users — recommended.
18 / 18-pkg Upstream Binary. Built from official release. Alternative build.

Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions, including the security model for host vs. container privileges.

Deployment

services:
  immich-postgres:
    image: "ghcr.io/daemonless/immich-postgres:latest"
    container_name: immich-postgres
    environment:
      - POSTGRES_USER=postgres  # Database superuser (default: postgres)
      - POSTGRES_PASSWORD=postgres  # Database password (default: postgres)
      - POSTGRES_DB=immich  # Database name (default: immich)
      - POSTGRES_INITDB_ARGS=  # Additional initdb arguments
    volumes:
      - "/path/to/containers/immich-postgres:/var/lib/postgresql/data"
    ports:
      - "5432:5432"
    annotations:
      org.freebsd.jail.allow.sysvipc: "true"
    # always (not unless-stopped) so FreeBSD's podman rc.d auto-starts it at boot
    restart: always
1
2
3
4
5
6
7
8
9
podman run -d --name immich-postgres \
  -p 5432:5432 \
  --annotation 'org.freebsd.jail.allow.sysvipc=true' \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=postgres \
  -e POSTGRES_DB=immich \
  -e POSTGRES_INITDB_ARGS= \
  -v /path/to/containers/immich-postgres:/var/lib/postgresql/data \
  ghcr.io/daemonless/immich-postgres:latest
- name: Deploy immich-postgres
  containers.podman.podman_container:
    name: immich-postgres
    image: "ghcr.io/daemonless/immich-postgres:latest"
    state: started
    restart_policy: always
    env:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"
      POSTGRES_DB: "immich"
      POSTGRES_INITDB_ARGS: ""
    ports:
      - "5432:5432"
    volumes:
      - "/path/to/containers/immich-postgres:/var/lib/postgresql/data"
    annotation:
      org.freebsd.jail.allow.sysvipc: "true"
1
2
3
4
5
6
7
# .env

DIRECTOR_PROJECT=immich-postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=immich
POSTGRES_INITDB_ARGS=
# appjail-director.yml

options:
  - virtualnet: ':<random> default'
  - nat:
services:
  immich-postgres:
    name: immich_postgres
    options:
      - container: 'boot args:--pull'
      - expose: '5432:5432 proto:tcp'
      - template: !ENV '${PWD}/immich-postgres.conf'
    oci:
      user: root
      environment:
        - POSTGRES_USER: !ENV '${POSTGRES_USER}'
        - POSTGRES_PASSWORD: !ENV '${POSTGRES_PASSWORD}'
        - POSTGRES_DB: !ENV '${POSTGRES_DB}'
        - POSTGRES_INITDB_ARGS: !ENV '${POSTGRES_INITDB_ARGS}'
    volumes:
      - IMMICH_POSTGRES_DATA_PATH: /var/lib/postgresql/data
volumes:
  IMMICH_POSTGRES_DATA_PATH:
    device: '/path/to/containers/immich-postgres'
1
2
3
4
5
6
7
# Makejail

ARG tag=latest

OPTION overwrite=force
OPTION from=ghcr.io/daemonless/immich-postgres:${tag}
SET allow.sysvipc=1
appjail oci run -Pd \
  -o overwrite=force \
  -o container="args:--pull" \
  -o virtualnet=":<random> default" \
  -o nat \
  -o expose="5432:5432 proto:tcp" \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=postgres \
  -e POSTGRES_DB=immich \
  -e POSTGRES_INITDB_ARGS= \
  -o fstab="/path/to/containers/immich-postgres /var/lib/postgresql/data <pseudofs>" \
  ghcr.io/daemonless/immich-postgres:latest immich-postgres

Interactive Configuration

Parameters

Environment Variables

Variable Default Description
POSTGRES_USER postgres Database superuser (default: postgres)
POSTGRES_PASSWORD postgres Database password (default: postgres)
POSTGRES_DB immich Database name (default: immich)
POSTGRES_INITDB_ARGS `` Additional initdb arguments

Volumes

Path Description
/var/lib/postgresql/data Database data directory

Ports

Port Protocol Description
5432 TCP PostgreSQL Port

This image is part of the Immich Stack.

PostgreSQL version: :latest and :14 use PostgreSQL 14. :18 uses PostgreSQL 18. New installations should consider :18. If you are migrating an existing Immich instance, stay on :14 — PostgreSQL major version upgrades require a full pg_dumpall and restore. The default :latest tag will follow whatever version Immich recommends upstream.

PostgreSQL requires allow.sysvipc for shared memory. Create immich-postgres.conf alongside appjail-director.yml:

1
2
3
4
5
exec.start: "/bin/sh /etc/rc"
exec.stop: "/bin/sh /etc/rc.shutdown jail"
mount.devfs
persist
allow.sysvipc

Implementation Details

  • Architectures: amd64
  • User: postgres (UID/GID set via PUID/PGID). Defaults to 1000:1000.
  • Base: Built on ghcr.io/daemonless/base (FreeBSD 15.1).
  • sysvipc: Requires --annotation 'org.freebsd.jail.allow.sysvipc=true' (ocijail 0.5.0+)

Need help? Join our Discord community.