diff options
Diffstat (limited to 'nixpkgs/pkgs/servers/mastodon/default.nix')
-rw-r--r-- | nixpkgs/pkgs/servers/mastodon/default.nix | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/servers/mastodon/default.nix b/nixpkgs/pkgs/servers/mastodon/default.nix new file mode 100644 index 000000000000..8508fbe8f78b --- /dev/null +++ b/nixpkgs/pkgs/servers/mastodon/default.nix @@ -0,0 +1,112 @@ +{ lib, stdenv, nodejs-slim, mkYarnPackage, fetchFromGitHub, bundlerEnv +, yarn, callPackage, imagemagick, ffmpeg, file, ruby_2_7 + + # Allow building a fork or custom version of Mastodon: +, pname ? "mastodon" +, version ? import ./version.nix +, srcOverride ? null +, dependenciesDir ? ./. # Should contain gemset.nix, yarn.nix and package.json. +}: + +stdenv.mkDerivation rec { + inherit pname version; + + # Using overrideAttrs on src does not build the gems and modules with the overridden src. + # Putting the callPackage up in the arguments list also does not work. + src = if srcOverride != null then srcOverride else callPackage ./source.nix {}; + + mastodon-gems = bundlerEnv { + name = "${pname}-gems-${version}"; + inherit version; + ruby = ruby_2_7; + gemdir = src; + gemset = dependenciesDir + "/gemset.nix"; + # This fix (copied from https://github.com/NixOS/nixpkgs/pull/76765) replaces the gem + # symlinks with directories, resolving this error when running rake: + # /nix/store/451rhxkggw53h7253izpbq55nrhs7iv0-mastodon-gems-3.0.1/lib/ruby/gems/2.6.0/gems/bundler-1.17.3/lib/bundler/settings.rb:6:in `<module:Bundler>': uninitialized constant Bundler::Settings (NameError) + postBuild = '' + for gem in "$out"/lib/ruby/gems/*/gems/*; do + cp -a "$gem/" "$gem.new" + rm "$gem" + # needed on macOS, otherwise the mv yields permission denied + chmod +w "$gem.new" + mv "$gem.new" "$gem" + done + ''; + }; + + mastodon-js-modules = mkYarnPackage { + pname = "${pname}-modules"; + yarnNix = dependenciesDir + "/yarn.nix"; + packageJSON = dependenciesDir + "/package.json"; + inherit src version; + }; + + mastodon-assets = stdenv.mkDerivation { + pname = "${pname}-assets"; + inherit src version; + + buildInputs = [ + mastodon-gems nodejs-slim yarn + ]; + + # FIXME: "production" would require OTP_SECRET to be set, so we use + # development here. + RAILS_ENV = "development"; + + buildPhase = '' + # Support Mastodon forks which don't call themselves 'mastodon' or which + # omit the organization name from package.json. + if [ "$(ls ${mastodon-js-modules}/libexec/* | grep node_modules)" ]; then + cp -r ${mastodon-js-modules}/libexec/*/node_modules node_modules + else + cp -r ${mastodon-js-modules}/libexec/*/*/node_modules node_modules + fi + chmod -R u+w node_modules + rake webpacker:compile + ''; + + installPhase = '' + mkdir -p $out/public + cp -r public/assets $out/public + cp -r public/packs $out/public + ''; + }; + + passthru.updateScript = callPackage ./update.nix {}; + + buildPhase = '' + if [ "$(ls ${mastodon-js-modules}/libexec/* | grep node_modules)" ]; then + ln -s ${mastodon-js-modules}/libexec/*/node_modules node_modules + else + ln -s ${mastodon-js-modules}/libexec/*/*/node_modules node_modules + fi + ln -s ${mastodon-assets}/public/assets public/assets + ln -s ${mastodon-assets}/public/packs public/packs + + patchShebangs bin/ + for b in $(ls ${mastodon-gems}/bin/) + do + if [ ! -f bin/$b ]; then + ln -s ${mastodon-gems}/bin/$b bin/$b + fi + done + + rm -rf log + ln -s /var/log/mastodon log + ln -s /tmp tmp + ''; + propagatedBuildInputs = [ imagemagick ffmpeg file mastodon-gems.wrappedRuby ]; + installPhase = '' + mkdir -p $out + cp -r * $out/ + ''; + + meta = with lib; { + description = "Self-hosted, globally interconnected microblogging software based on ActivityPub"; + homepage = "https://joinmastodon.org"; + license = licenses.agpl3Plus; + platforms = [ "x86_64-linux" "i686-linux" ]; + maintainers = with maintainers; [ petabyteboy happy-river erictapen ]; + }; +} |