Merge pull request #330634 from r-ryantm/auto-update/circumflex
[NixPkgs.git] / pkgs / servers / mastodon / default.nix
blob9bc4dd29d6304e2ef0cf6099bccc313fe16ba2c6
1 { lib, stdenv, nodejs-slim, bundlerEnv, nixosTests
2 , yarn, callPackage, ruby, writeShellScript
3 , fetchYarnDeps, fixup-yarn-lock
4 , brotli
6   # Allow building a fork or custom version of Mastodon:
7 , pname ? "mastodon"
8 , version ? srcOverride.version
9 , patches ? []
10   # src is a package
11 , srcOverride ? callPackage ./source.nix { inherit patches; }
12 , gemset ? ./. + "/gemset.nix"
13 , yarnHash ? srcOverride.yarnHash
16 stdenv.mkDerivation rec {
17   inherit pname version;
19   src = srcOverride;
21   mastodonGems = bundlerEnv {
22     name = "${pname}-gems-${version}";
23     inherit version gemset ruby;
24     gemdir = src;
25   };
27   mastodonModules = stdenv.mkDerivation {
28     pname = "${pname}-modules";
29     inherit src version;
31     yarnOfflineCache = fetchYarnDeps {
32       yarnLock = "${src}/yarn.lock";
33       hash = yarnHash;
34     };
36     nativeBuildInputs = [ fixup-yarn-lock nodejs-slim yarn mastodonGems mastodonGems.wrappedRuby brotli ];
38     RAILS_ENV = "production";
39     NODE_ENV = "production";
41     buildPhase = ''
42       runHook preBuild
44       export HOME=$PWD
45       fixup-yarn-lock ~/yarn.lock
46       yarn config --offline set yarn-offline-mirror $yarnOfflineCache
47       yarn install --offline --frozen-lockfile --ignore-engines --ignore-scripts --no-progress
49       patchShebangs ~/bin
50       patchShebangs ~/node_modules
52       # skip running yarn install
53       rm -rf ~/bin/yarn
55       OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder \
56         rails assets:precompile
57       yarn cache clean --offline
58       rm -rf ~/node_modules/.cache
60       # Create missing static gzip and brotli files
61       gzip --best --keep ~/public/assets/500.html
62       gzip --best --keep ~/public/packs/report.html
63       find ~/public/assets -maxdepth 1 -type f -name '.*.json' \
64         -exec gzip --best --keep --force {} ';'
65       brotli --best --keep ~/public/packs/report.html
66       find ~/public/assets -type f -regextype posix-extended -iregex '.*\.(css|js|json|html)' \
67         -exec brotli --best --keep {} ';'
69       runHook postBuild
70     '';
72     installPhase = ''
73       runHook preInstall
75       mkdir -p $out/public
76       cp -r node_modules $out/node_modules
77       cp -r public/assets $out/public
78       cp -r public/packs $out/public
80       runHook postInstall
81     '';
82   };
84   propagatedBuildInputs = [ mastodonGems.wrappedRuby ];
85   nativeBuildInputs = [ brotli ];
86   buildInputs = [ mastodonGems nodejs-slim ];
88   buildPhase = ''
89     runHook preBuild
91     ln -s $mastodonModules/node_modules node_modules
92     ln -s $mastodonModules/public/assets public/assets
93     ln -s $mastodonModules/public/packs public/packs
95     patchShebangs bin/
96     for b in $(ls $mastodonGems/bin/)
97     do
98       if [ ! -f bin/$b ]; then
99         ln -s $mastodonGems/bin/$b bin/$b
100       fi
101     done
103     # Remove execute permissions
104     chmod 0444 public/emoji/*.svg
106     # Create missing static gzip and brotli files
107     find public -maxdepth 1 -type f -regextype posix-extended -iregex '.*\.(css|js|svg|txt|xml)' \
108       -exec gzip --best --keep --force {} ';' \
109       -exec brotli --best --keep {} ';'
110     find public/emoji -type f -name '.*.svg' \
111       -exec gzip --best --keep --force {} ';' \
112       -exec brotli --best --keep {} ';'
113     ln -s assets/500.html.gz public/500.html.gz
114     ln -s assets/500.html.br public/500.html.br
115     ln -s packs/sw.js.gz public/sw.js.gz
116     ln -s packs/sw.js.br public/sw.js.br
117     ln -s packs/sw.js.map.gz public/sw.js.map.gz
118     ln -s packs/sw.js.map.br public/sw.js.map.br
120     rm -rf log
121     ln -s /var/log/mastodon log
122     ln -s /tmp tmp
124     runHook postBuild
125   '';
127   installPhase = let
128     run-streaming = writeShellScript "run-streaming.sh" ''
129       # NixOS helper script to consistently use the same NodeJS version the package was built with.
130       ${nodejs-slim}/bin/node ./streaming
131     '';
132   in ''
133     runHook preInstall
135     mkdir -p $out
136     cp -r * $out/
137     ln -s ${run-streaming} $out/run-streaming.sh
139     runHook postInstall
140   '';
142   passthru = {
143     tests.mastodon = nixosTests.mastodon;
144     # run with: nix-shell ./maintainers/scripts/update.nix --argstr package mastodon
145     updateScript = ./update.sh;
146   };
148   meta = with lib; {
149     description = "Self-hosted, globally interconnected microblogging software based on ActivityPub";
150     homepage = "https://joinmastodon.org";
151     license = licenses.agpl3Plus;
152     platforms = [ "x86_64-linux" "i686-linux" "aarch64-linux" ];
153     maintainers = with maintainers; [ happy-river erictapen izorkin ghuntley ];
154   };