immich
| Version | 2026.144.1531 |
| Repo | superproject |
Immich self-hosted photo and video management server on port 2283. Builds the Immich Node server from source with pnpm into /opt/immich/server, installs a PostgreSQL-aware startup wrapper and an idempotent DB-migration wrapper, and seeds Postgres with the vector / vchord / earthdistance extensions before serving the photo+video API on port 2283. Library, cache, import and external media live under ~/.immich. The behaviour is verifiable as the built server bundle, the installed wrappers, the image-codec toolchain, the seeded init SQL, and a live /api/server/ping response.
Services
Section titled “Services”immich-db-initimmich-server
Acceptance plan
Section titled “Acceptance plan”This candy’s plan: — the runnable spec charly check executes against a live deployment. check: steps are idempotent probes; run: steps change state.
| Intent | Step |
|---|---|
run |
command=curl -fL –retry 3 –retry-delay 2 “https://github.com/immich-app/immich/archive/refs/tags/${IMMICH_VERSION}.tar.gz” | tar xz -C /tmp mv /tmp/immich-$(echo ${IMMICH_VERSION} | sed ‘s/^v//’) /tmp/immich |
run |
command=cd /tmp/immich && npm_config_cache=/tmp/npm-root-cache pnpm install –frozen-lockfile cd /tmp/immich && npm_config_cache=/tmp/npm-root-cache pnpm –filter immich build cd /tmp/immich && npm_config_cache=/tmp/npm-root-cache pnpm –filter immich deploy –prod /opt/immich/server |
run |
command=mkdir -p /build/geodata cd /build/geodata curl -fsSL –retry 3 –retry-delay 2 https://download.geonames.org/export/dump/admin1CodesASCII.txt -o admin1CodesASCII.txt curl -fsSL –retry 3 –retry-delay 2 https://download.geonames.org/export/dump/admin2Codes.txt -o admin2Codes.txt curl -fsSL –retry 3 –retry-delay 2 https://download.geonames.org/export/dump/cities500.zip -o cities500.zip && unzip -o cities500.zip && rm cities500.zip curl -fsSL –retry 3 –retry-delay 2 “https://raw.githubusercontent.com/nvkelso/natural-earth-vector/master/geojson/ne_10m_admin_0_countries.geojson” -o ne_10m_admin_0_countries.geojson date -I > geodata-date.txt echo ‘{}’ > /build/build-lock.json mkdir -p /build/corePlugin cp /tmp/immich/plugins/manifest.json /build/corePlugin/manifest.json |
run |
command=cd /tmp/immich && npm_config_cache=/tmp/npm-root-cache pnpm –filter @immich/sdk –filter immich-web build cp -r /tmp/immich/web/build /build/www |
run |
command=EXTISM_JS_VERSION=1.6.0 BINARYEN_VERSION=124 ARCH=$(uname -m) curl -sL “https://github.com/extism/js-pdk/releases/download/v${EXTISM_JS_VERSION}/extism-js-${ARCH}-linux-v${EXTISM_JS_VERSION}.gz” | gunzip > /usr/local/bin/extism-js chmod +x /usr/local/bin/extism-js curl -sL “https://github.com/WebAssembly/binaryen/releases/download/version_${BINARYEN_VERSION}/binaryen-version_${BINARYEN_VERSION}-${ARCH}-linux.tar.gz” | tar xz -C /tmp cp /tmp/binaryen-version_${BINARYEN_VERSION}/bin/* /usr/local/bin/ rm -rf /tmp/binaryen-version_${BINARYEN_VERSION} cd /tmp/immich/plugins npm_config_cache=/tmp/npm-root-cache pnpm install –frozen-lockfile npm_config_cache=/tmp/npm-root-cache pnpm run build mkdir -p /build/corePlugin/dist cp -r dist/* /build/corePlugin/dist/ rm -f /usr/local/bin/extism-js /usr/local/bin/wasm-opt /usr/local/bin/wasm-merge /usr/local/bin/wasm-as /usr/local/bin/wasm-dis /usr/local/bin/wasm-ctor-check /usr/local/bin/wasm-emscripten-finalize /usr/local/bin/wasm-metadce /usr/local/bin/wasm-reduce /usr/local/bin/wasm-shell /usr/local/bin/wasm-split /usr/local/bin/wasm2js |
run |
command=rm -rf /tmp/immich |
run |
write=/docker-entrypoint-initdb.d/01-immich-extensions.sql |
run |
write=/usr/local/bin/immich-db-migrate.sh |
run |
write=/usr/local/bin/immich-server-start.sh |
run |
mkdir=${HOME}/.immich/library |
run |
mkdir=${HOME}/.immich/cache |
run |
mkdir=${HOME}/.immich/import |
run |
mkdir=${HOME}/.immich/external |
check |
the Immich Node server bundle is built into /opt/immich/server |
check |
the PostgreSQL-aware server startup wrapper is installed and executable |
check |
the idempotent DB-migration wrapper is installed and executable |
check |
the libvips image-processing library is installed for thumbnailing and transcoding |
check |
the Postgres init script seeds the pgvector extension Immich requires |
check |
the running Immich API answers its health ping on port 2283 |
agent-check |
the web UI presents a usable first-run / login experience |
check |
file=/docker-entrypoint-initdb.d/01-immich-extensions.sql |
check |
file=${HOME}/.immich/library |
check |
service=immich-server |
check |
addr=127.0.0.1:${HOST_PORT:2283} |
check |
http=http://127.0.0.1:${HOST_PORT:2283}/api/server/ping |