summary refs log tree commit diff
path: root/pkgs/servers/peertube/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/servers/peertube/default.nix')
-rw-r--r--pkgs/servers/peertube/default.nix125
1 files changed, 125 insertions, 0 deletions
diff --git a/pkgs/servers/peertube/default.nix b/pkgs/servers/peertube/default.nix
new file mode 100644
index 00000000000..558c21c6cd1
--- /dev/null
+++ b/pkgs/servers/peertube/default.nix
@@ -0,0 +1,125 @@
+{ lib, stdenv, callPackage, fetchurl, fetchFromGitHub, buildGoModule, fetchYarnDeps, nixosTests
+, fixup_yarn_lock, jq, nodejs, yarn
+}:
+let
+  arch =
+    if stdenv.hostPlatform.system == "x86_64-linux" then "linux-x64"
+    else throw "Unsupported architecture: ${stdenv.hostPlatform.system}";
+
+  version = "4.1.1";
+
+  source = fetchFromGitHub {
+    owner = "Chocobozzz";
+    repo = "PeerTube";
+    rev = "v${version}";
+    sha256 = "sha256-yBRontvkcVU3BNUIB6WfH2a5blU9u3CNyHrou16h42s=";
+  };
+
+  yarnOfflineCacheServer = fetchYarnDeps {
+    yarnLock = "${source}/yarn.lock";
+    sha256 = "sha256-L1Nr6sGjYVm42OyeFOQeQ6WEXjmNkngWilBtfQJ6bPE=";
+  };
+
+  yarnOfflineCacheTools = fetchYarnDeps {
+    yarnLock = "${source}/server/tools/yarn.lock";
+    sha256 = "sha256-maPR8OCiuNlle0JQIkZSgAqW+BrSxPwVm6CkxIrIg5k=";
+  };
+
+  yarnOfflineCacheClient = fetchYarnDeps {
+    yarnLock = "${source}/client/yarn.lock";
+    sha256 = "sha256-cBa0lNq9JsYi34EJzl0pPbDXSYL9a8g6MmiL6Ge65ms=";
+  };
+
+  bcrypt_version = "5.0.1";
+  bcrypt_lib = fetchurl {
+    url = "https://github.com/kelektiv/node.bcrypt.js/releases/download/v${bcrypt_version}/bcrypt_lib-v${bcrypt_version}-napi-v3-${arch}-glibc.tar.gz";
+    sha256 = "3R3dBZyPansTuM77Nmm3f7BbTDkDdiT2HQIrti2Ottc=";
+  };
+
+in stdenv.mkDerivation rec {
+  inherit version;
+  pname = "peertube";
+  src = source;
+
+  nativeBuildInputs = [ fixup_yarn_lock jq nodejs yarn ];
+
+  buildPhase = ''
+    # Build node modules
+    export HOME=$PWD
+    fixup_yarn_lock ~/yarn.lock
+    fixup_yarn_lock ~/server/tools/yarn.lock
+    fixup_yarn_lock ~/client/yarn.lock
+    yarn config --offline set yarn-offline-mirror ${yarnOfflineCacheServer}
+    yarn install --offline --frozen-lockfile --ignore-engines --ignore-scripts --no-progress
+    cd ~/server/tools
+    yarn config --offline set yarn-offline-mirror ${yarnOfflineCacheTools}
+    yarn install --offline --frozen-lockfile --ignore-engines --ignore-scripts --no-progress
+    cd ~/client
+    yarn config --offline set yarn-offline-mirror ${yarnOfflineCacheClient}
+    yarn install --offline --frozen-lockfile --ignore-engines --ignore-scripts --no-progress
+
+    patchShebangs ~/node_modules
+    patchShebangs ~/server/tools/node_modules
+    patchShebangs ~/client/node_modules
+    patchShebangs ~/scripts
+
+    # Fix bcrypt node module
+    cd ~/node_modules/bcrypt
+    if [ "${bcrypt_version}" != "$(cat package.json | jq -r .version)" ]; then
+      echo "Mismatching version please update bcrypt in derivation"
+      exit
+    fi
+    mkdir -p ./lib/binding && tar -C ./lib/binding -xf ${bcrypt_lib}
+
+    # Return to home directory
+    cd ~
+
+    # Build PeerTube server
+    npm run tsc -- --build ./tsconfig.json
+    npm run resolve-tspaths:server
+    cp -r "./server/static" "./server/assets" "./dist/server"
+    cp -r "./server/lib/emails" "./dist/server/lib"
+
+    # Build PeerTube tools
+    cp -r "./server/tools/node_modules" "./dist/server/tools"
+    npm run tsc -- --build ./server/tools/tsconfig.json
+    npm run resolve-tspaths:cli
+
+    # Build PeerTube client
+    npm run build:client
+  '';
+
+  installPhase = ''
+    mkdir -p $out/dist
+    mv ~/dist $out
+    mv ~/node_modules $out/node_modules
+    mv ~/server/tools/node_modules $out/dist/server/tools/node_modules
+    mkdir $out/client
+    mv ~/client/{dist,node_modules,package.json,yarn.lock} $out/client
+    mv ~/{config,scripts,support,CREDITS.md,FAQ.md,LICENSE,README.md,package.json,tsconfig.json,yarn.lock} $out
+  '';
+
+  passthru.tests.peertube = nixosTests.peertube;
+
+  meta = with lib; {
+    description = "A free software to take back control of your videos";
+    longDescription = ''
+      PeerTube aspires to be a decentralized and free/libre alternative to video
+      broadcasting services.
+      PeerTube is not meant to become a huge platform that would centralize
+      videos from all around the world. Rather, it is a network of
+      inter-connected small videos hosters.
+      Anyone with a modicum of technical skills can host a PeerTube server, aka
+      an instance. Each instance hosts its users and their videos. In this way,
+      every instance is created, moderated and maintained independently by
+      various administrators.
+      You can still watch from your account videos hosted by other instances
+      though if the administrator of your instance had previously connected it
+      with other instances.
+    '';
+    license = licenses.agpl3Plus;
+    homepage = "https://joinpeertube.org/";
+    platforms = [ "x86_64-linux" ];
+    maintainers = with maintainers; [ immae izorkin matthiasbeyer mohe2015 stevenroose ];
+  };
+}