%global debug_package %{nil} Name: immich Version: 2.5.6 Release: %autorelease Summary: High performance self-hosted photo and video management solution License: AGPL-3.0 URL: https://github.com/immich-app/immich Source0: %{url}/archive/refs/tags/v%{version}.tar.gz Source1: %{name}.sysusers Source2: %{name}.service Source3: %{name}-service.preset Source4: %{name}-tmpfiles.conf Source5: %{name}-sysconfig.conf Source6: https://download.geonames.org/export/dump/cities500.zip Source7: https://download.geonames.org/export/dump/admin1CodesASCII.txt Source8: https://download.geonames.org/export/dump/admin2Codes.txt Source9: https://raw.githubusercontent.com/nvkelso/natural-earth-vector/v5.1.2/geojson/ne_10m_admin_0_countries.geojson Patch0: 0-backup.service.ts.patch Patch1: 1-nest-cli.json.patch Patch2: 2-sharp.patch ExclusiveArch: x86_64 aarch64 BuildRequires: nodejs BuildRequires: mise BuildRequires: git BuildRequires: unzip BuildRequires: systemd-rpm-macros BuildRequires: python3 BuildRequires: gcc BuildRequires: gcc-c++ BuildRequires: make BuildRequires: libjpeg-turbo-devel BuildRequires: zlib-ng-compat-devel BuildRequires: freetype-devel BuildRequires: lcms2-devel BuildRequires: libtiff-devel BuildRequires: libwebp-devel BuildRequires: vips-devel BuildRequires: vips-heif BuildRequires: vips-jxl %if 0%{?fedora} BuildRequires: openjpeg-devel BuildRequires: pnpm %else BuildRequires: openjpeg2-devel BuildRequires: nodejs-npm %endif %{?systemd_requires} %{?sysusers_requires_compat} Requires: nodejs Requires: curl Requires: (ffmpeg or ffmpeg-free) Requires: ImageMagick Requires: postgresql Requires: zlib-ng-compat Requires: glib2 Requires: expat Requires: librsvg2 Requires: libexif Requires: libwebp Requires: libjpeg-turbo Requires: libgsf Requires: libpng Requires: libheif Requires: lcms2 Requires: openexr Requires: liblqr-1 Requires: vips Requires: vips-heif Requires: vips-jxl Requires: openslide Requires: poppler-glib Requires: LibRaw Requires: libde265 Requires: dav1d Requires: brotli Requires: perl-IO-Compress-Brotli Requires: highway Requires: mimalloc Requires: libtool Recommends: (valkey or redis) %if 0%{?fedora} BuildRequires: openjpeg %else BuildRequires: openjpeg2 %endif %description %{summary}. %package cli Summary: Immich command-line client Requires: nodejs %description cli CLI client for interacting with an Immich server. %prep %autosetup -n immich-%{version} -N %autopatch -p1 -M 1 %build %if ! 0%{?fedora} # Global npm install is not writable in mock/COPR build roots. npm install -g --prefix "$HOME/.npm" pnpm@latest-10 export PATH="$HOME/.npm/bin:$PATH" %endif pnpm fetch --ignore-scripts pnpm install --filter immich --frozen-lockfile sharp_dir="$(pnpm patch sharp | sed -n '3p' | sed 's/^[[:space:]]*//')" pushd "${sharp_dir}" >/dev/null patch -p1 < "%{PATCH2}" popd >/dev/null pnpm patch-commit "${sharp_dir}" pushd web >/dev/null pnpm add "three@^0.179.0" popd >/dev/null # Prevent unattended build prompts from root mise config. rm -f mise.toml # Build server first, then full immich package. pushd server >/dev/null pnpm exec nest build --type-check popd >/dev/null pnpm --filter immich --frozen-lockfile build pnpm --filter immich --frozen-lockfile --prod --no-optional deploy output/server-pruned # Build shared SDK and the web frontend. NODE_OPTIONS="--max-old-space-size=4096" \ pnpm --filter @immich/sdk --filter immich-web --frozen-lockfile install NODE_OPTIONS="--max-old-space-size=4096" \ pnpm --filter @immich/sdk --filter immich-web build # Build core plugin metadata, JS artifacts, and wasm plugin payload. pushd plugins >/dev/null export MISE_TRUSTED_CONFIG_PATHS="$PWD/mise.toml" mise install mise run build popd >/dev/null # Build and prune CLI artifacts. pnpm install --filter @immich/cli --frozen-lockfile pnpm --filter @immich/cli build pnpm --filter @immich/cli --prod --no-optional deploy output/cli-pruned %install # Install server payload. install -d "%{buildroot}%{_libexecdir}/%{name}/server" cp -a output/server-pruned/. "%{buildroot}%{_libexecdir}/%{name}/server/" # Ensure CLI wrappers resolve sibling scripts when launched via /usr/bin symlinks. sed -i 's|^start\.sh |"$(dirname "$0")/start.sh" |' \ "%{buildroot}%{_libexecdir}/%{name}/server/bin/immich-admin" # Drop non-native prebuild binaries so auto-generated deps stay valid. find "%{buildroot}%{_libexecdir}/%{name}/server" -type f -name '*.musl.node' -delete find "%{buildroot}%{_libexecdir}/%{name}/server" -mindepth 1 \ \( -path '*linuxmusl*' -o -name '*musllinux*' \) \ -exec rm -rf {} + find "%{buildroot}%{_libexecdir}/%{name}/server" -xtype l -delete %ifarch x86_64 find "%{buildroot}%{_libexecdir}/%{name}/server" -type f \ \( -path '*/prebuilds/linux-arm/*' -o -path '*/prebuilds/linux-arm64/*' \) \ -delete %endif %ifarch aarch64 find "%{buildroot}%{_libexecdir}/%{name}/server" -type f \ \( -path '*/prebuilds/linux-arm/*' -o -path '*/prebuilds/linux-x64/*' \) \ -delete %endif install -d "%{buildroot}%{_libexecdir}/%{name}/build/www" cp -a web/build/. "%{buildroot}%{_libexecdir}/%{name}/build/www/" install -d "%{buildroot}%{_libexecdir}/%{name}/build/corePlugin/dist" cp -a plugins/dist/. "%{buildroot}%{_libexecdir}/%{name}/build/corePlugin/dist/" install -D -m 0644 plugins/manifest.json \ "%{buildroot}%{_libexecdir}/%{name}/build/corePlugin/manifest.json" install -d "%{buildroot}%{_libexecdir}/%{name}/build/geodata" unzip -p "%{SOURCE6}" cities500.txt > "%{buildroot}%{_libexecdir}/%{name}/build/geodata/cities500.txt" install -D -m 0644 "%{SOURCE7}" \ "%{buildroot}%{_libexecdir}/%{name}/build/geodata/admin1CodesASCII.txt" install -D -m 0644 "%{SOURCE8}" \ "%{buildroot}%{_libexecdir}/%{name}/build/geodata/admin2Codes.txt" install -D -m 0644 "%{SOURCE9}" \ "%{buildroot}%{_libexecdir}/%{name}/build/geodata/ne_10m_admin_0_countries.geojson" date -u +"%Y-%m-%dT%H:%M:%SZ" > "%{buildroot}%{_libexecdir}/%{name}/build/geodata/geodata-date.txt" install -d "%{buildroot}%{_libexecdir}/%{name}/cli" cp -a output/cli-pruned/. "%{buildroot}%{_libexecdir}/%{name}/cli/" install -d "%{buildroot}%{_bindir}" ln -s ../libexec/%{name}/server/bin/immich-healthcheck \ "%{buildroot}%{_bindir}/immich-healthcheck" ln -s ../libexec/%{name}/server/bin/immich-admin \ "%{buildroot}%{_bindir}/immich-admin" ln -s ../libexec/%{name}/cli/bin/immich \ "%{buildroot}%{_bindir}/immich" install -D --mode=0644 "%{SOURCE2}" %{buildroot}%{_unitdir}/%{name}.service install -D --mode=0644 "%{SOURCE3}" %{buildroot}%{_prefix}/lib/systemd/system-preset/90-%{name}.preset install -D --mode=0644 "%{SOURCE4}" %{buildroot}%{_tmpfilesdir}/%{name}.conf install -D --mode=0644 "%{SOURCE5}" %{buildroot}%{_sysconfdir}/sysconfig/%{name} install -D --mode=0644 "%{SOURCE1}" %{buildroot}%{_sysusersdir}/%{name}.conf %files %license LICENSE %doc README.md %{_libexecdir}/%{name}/server/ %{_libexecdir}/%{name}/build/ %{_bindir}/immich-healthcheck %{_bindir}/immich-admin %{_unitdir}/%{name}.service %{_prefix}/lib/systemd/system-preset/90-%{name}.preset %{_tmpfilesdir}/%{name}.conf %config(noreplace) %{_sysconfdir}/sysconfig/%{name} %{_sysusersdir}/%{name}.conf %files cli %{_libexecdir}/%{name}/cli/ %{_bindir}/immich %pre %sysusers_create_compat %{_sysusersdir}/%{name}.conf %post %systemd_post %{name}.service %preun %systemd_preun %{name}.service %postun %systemd_postun_with_restart %{name}.service %changelog %autochangelog