]> git.immae.eu Git - perso/Immae/Config/Nix.git/blobdiff - pkgs/webapps/mastodon/default.nix
Move mastodon to pkgs
[perso/Immae/Config/Nix.git] / pkgs / webapps / mastodon / default.nix
diff --git a/pkgs/webapps/mastodon/default.nix b/pkgs/webapps/mastodon/default.nix
new file mode 100644 (file)
index 0000000..0f936b5
--- /dev/null
@@ -0,0 +1,86 @@
+{ varDir ? "/var/lib/mastodon", mylibs,
+  stdenv, writeText, runCommand,
+  ruby_2_6, bundlerEnv, defaultGemConfig,
+  jq, protobuf, protobufc, pkgconfig, libidn, pam, nodejs, yarn }:
+let
+  gems = bundlerEnv {
+    name = "mastodon-env";
+    ruby = ruby_2_6;
+    gemset = ./gemset.nix;
+    gemdir = (mylibs.fetchedGithub ./mastodon.json).src;
+    groups = [ "default" "production" "test" "development" ];
+    gemConfig = defaultGemConfig // {
+      redis-rack = attrs: {
+        preBuild = ''
+          sed -i 's!s\.files.*!!' redis-rack.gemspec
+          '';
+      };
+      tzinfo = attrs: {
+        preBuild = ''
+          sed -i 's!s\.files.*!!' tzinfo.gemspec
+          '';
+      };
+      cld3 = attrs: {
+        buildInputs = [ protobuf protobufc pkgconfig ];
+      };
+      idn-ruby = attrs: {
+        buildInputs = [ libidn ];
+      };
+      rpam2 = attrs: {
+        buildInputs = [ pam ];
+      };
+    };
+  };
+  yarnModules = let
+    info = mylibs.fetchedGithub ./mastodon.json;
+    packagejson = runCommand "package.json" { buildInputs = [ jq ]; } ''
+      cat ${info.src}/package.json | jq -r '.version = "${info.version}"' > $out
+      '';
+  in
+    mylibs.yarn2nixPackage.mkYarnModules rec {
+      name = "mastodon-yarn";
+      pname = name;
+      version = info.version;
+      packageJSON = packagejson;
+      yarnLock = "${info.src}/yarn.lock";
+      yarnNix = ./yarn-packages.nix;
+      pkgConfig = {
+        all = {
+          buildInputs = [ mylibs.yarn2nixPackage.src ];
+        };
+        uws = {
+          postInstall = ''
+            npx node-gyp rebuild > build_log.txt 2>&1 || true
+            '';
+        };
+      };
+    };
+    mastodon_with_yarn = stdenv.mkDerivation (mylibs.fetchedGithub ./mastodon.json // rec {
+      installPhase = ''
+        cp -a . $out
+        cp -a ${yarnModules}/node_modules $out
+      '';
+      buildInputs = [ yarnModules ];
+    });
+in
+stdenv.mkDerivation {
+  name = "mastodon";
+  inherit mastodon_with_yarn;
+  builder = writeText "build_mastodon" ''
+      source $stdenv/setup
+      set -a
+      SECRET_KEY_BASE=Dummy
+      OTP_SECRET=Dummy
+      set +a
+      cp -a $mastodon_with_yarn $out
+      cd $out
+      chmod u+rwX . public
+      chmod -R u+rwX config/
+      sed -i -e 's@^end$@  config.action_mailer.sendmail_settings = { location: ENV.fetch("SENDMAIL_LOCATION", "/usr/sbin/sendmail") }\nend@' config/environments/production.rb
+      RAILS_ENV=production ${gems}/bin/rails assets:precompile
+      rm -rf tmp/cache
+      ln -sf ${varDir}/tmp/cache tmp
+  '';
+  buildInputs = [ gems gems.ruby nodejs yarn ];
+  passthru = { inherit gems varDir; };
+}