chromium,chromedriver: 129.0.6668.91 -> 129.0.6668.100
[NixPkgs.git] / pkgs / by-name / im / immich / package.nix
blobfe62f0ddc3545b1c5f120383365658245ce92ddf
2   lib,
3   stdenvNoCC,
4   buildNpmPackage,
5   fetchFromGitHub,
6   python3,
7   nodejs,
8   node-gyp,
9   runCommand,
10   nixosTests,
11   immich-machine-learning,
12   # build-time deps
13   glib,
14   pkg-config,
15   makeWrapper,
16   curl,
17   cacert,
18   unzip,
19   # runtime deps
20   ffmpeg-headless,
21   imagemagick,
22   libraw,
23   libheif,
24   vips,
25   perl,
27 let
28   buildNpmPackage' = buildNpmPackage.override { inherit nodejs; };
29   sources = lib.importJSON ./sources.json;
30   inherit (sources) version;
32   buildLock = {
33     sources =
34       builtins.map
35         (p: {
36           name = p.pname;
37           inherit (p) version;
38           inherit (p.src) rev;
39         })
40         [
41           imagemagick
42           libheif
43           libraw
44         ];
46     packages = [ ];
47   };
49   # The geodata website is not versioned, so we use the internet archive
50   geodata =
51     runCommand "immich-geodata"
52       {
53         outputHash = "sha256-imqSfzXaEMNo9T9tZr80sr/89n19kiFc8qwidFzRUaY=";
54         outputHashMode = "recursive";
55         nativeBuildInputs = [
56           cacert
57           curl
58           unzip
59         ];
61         meta.license = lib.licenses.cc-by-40;
62       }
63       ''
64         mkdir $out
65         url="https://web.archive.org/web/20240724153050/http://download.geonames.org/export/dump"
66         curl -Lo ./cities500.zip "$url/cities500.zip"
67         curl -Lo $out/admin1CodesASCII.txt "$url/admin1CodesASCII.txt"
68         curl -Lo $out/admin2Codes.txt "$url/admin2Codes.txt"
69         curl -Lo $out/ne_10m_admin_0_countries.geojson \
70           https://raw.githubusercontent.com/nvkelso/natural-earth-vector/ca96624a56bd078437bca8184e78163e5039ad19/geojson/ne_10m_admin_0_countries.geojson
72         unzip ./cities500.zip -d $out/
73         echo "2024-07-24T15:30:50Z" > $out/geodata-date.txt
74       '';
76   src = fetchFromGitHub {
77     owner = "immich-app";
78     repo = "immich";
79     rev = "v${version}";
80     inherit (sources) hash;
81   };
83   openapi = buildNpmPackage' {
84     pname = "immich-openapi-sdk";
85     inherit version;
86     src = "${src}/open-api/typescript-sdk";
87     inherit (sources.components."open-api/typescript-sdk") npmDepsHash;
89     installPhase = ''
90       runHook preInstall
92       npm config delete cache
93       npm prune --omit=dev --omit=optional
95       mkdir -p $out
96       mv package.json package-lock.json node_modules build $out/
98       runHook postInstall
99     '';
100   };
102   web = buildNpmPackage' {
103     pname = "immich-web";
104     inherit version;
105     src = "${src}/web";
106     inherit (sources.components.web) npmDepsHash;
108     preBuild = ''
109       rm node_modules/@immich/sdk
110       ln -s ${openapi} node_modules/@immich/sdk
111       # Rollup does not find the dependency otherwise
112       ln -s node_modules/@immich/sdk/node_modules/@oazapfts node_modules/
113     '';
115     installPhase = ''
116       runHook preInstall
118       cp -r build $out
120       runHook postInstall
121     '';
122   };
124   node-addon-api = stdenvNoCC.mkDerivation rec {
125     pname = "node-addon-api";
126     version = "8.0.0";
127     src = fetchFromGitHub {
128       owner = "nodejs";
129       repo = "node-addon-api";
130       rev = "v${version}";
131       hash = "sha256-k3v8lK7uaEJvcaj1sucTjFZ6+i5A6w/0Uj9rYlPhjCE=";
132     };
133     installPhase = ''
134       mkdir $out
135       cp -r *.c *.h *.gyp *.gypi index.js package-support.json package.json tools $out/
136     '';
137   };
139   vips' = vips.overrideAttrs (prev: {
140     mesonFlags = prev.mesonFlags ++ [ "-Dtiff=disabled" ];
141   });
143 buildNpmPackage' {
144   pname = "immich";
145   inherit version;
146   src = "${src}/server";
147   inherit (sources.components.server) npmDepsHash;
149   nativeBuildInputs = [
150     pkg-config
151     python3
152     makeWrapper
153     glib
154     node-gyp
155   ];
157   buildInputs = [
158     ffmpeg-headless
159     imagemagick
160     libraw
161     libheif
162     vips' # Required for sharp
163   ];
165   # Required because vips tries to write to the cache dir
166   makeCacheWritable = true;
168   preBuild = ''
169     cd node_modules/sharp
171     mkdir node_modules
172     ln -s ${node-addon-api} node_modules/node-addon-api
174     ${lib.getExe nodejs} install/check
176     rm -r node_modules
178     cd ../..
179     rm -r node_modules/@img/sharp*
180   '';
182   installPhase = ''
183     runHook preInstall
185     npm config delete cache
186     npm prune --omit=dev
188     mkdir -p $out/build
189     mv package.json package-lock.json node_modules dist resources $out/
190     ln -s ${web} $out/build/www
191     ln -s ${geodata} $out/build/geodata
193     echo '${builtins.toJSON buildLock}' > $out/build/build-lock.json
195     makeWrapper ${lib.getExe nodejs} $out/bin/admin-cli --add-flags $out/dist/main --add-flags cli
196     makeWrapper ${lib.getExe nodejs} $out/bin/server --add-flags $out/dist/main --chdir $out \
197       --set IMMICH_BUILD_DATA $out/build --set NODE_ENV production \
198       --suffix PATH : "${
199         lib.makeBinPath [
200           perl
201           ffmpeg-headless
202         ]
203       }"
205     runHook postInstall
206   '';
208   passthru = {
209     tests = {
210       inherit (nixosTests) immich;
211     };
213     machine-learning = immich-machine-learning;
215     inherit
216       src
217       sources
218       web
219       geodata
220       ;
221     updateScript = ./update.sh;
222   };
224   meta = {
225     description = "Self-hosted photo and video backup solution";
226     homepage = "https://immich.app/";
227     license = lib.licenses.agpl3Only;
228     maintainers = with lib.maintainers; [ jvanbruegge ];
229     platforms = lib.platforms.linux;
230     mainProgram = "server";
231   };