diff --git a/nixos/modules/services/web-apps/onlyoffice.nix b/nixos/modules/services/web-apps/onlyoffice.nix index 498aae2b29e2..10c0ed1b779c 100644 --- a/nixos/modules/services/web-apps/onlyoffice.nix +++ b/nixos/modules/services/web-apps/onlyoffice.nix @@ -101,6 +101,12 @@ in }; wopi = lib.mkEnableOption "Enable WOPI support"; + + loglevel = lib.mkOption { + type = lib.types.str; + default = "WARN"; + description = "Default loglevel to use for documentserver and converter"; + }; }; config = lib.mkIf cfg.enable { @@ -264,8 +270,15 @@ in "postgresql.target" ]; wantedBy = [ "multi-user.target" ]; + environment = { + NODE_CONFIG_DIR = "/run/onlyoffice/config"; + NODE_DISABLE_COLORS = "1"; + NODE_ENV = "production-linux"; + }; serviceConfig = { - ExecStart = "${cfg.package.fhs}/bin/onlyoffice-wrapper FileConverter/converter /run/onlyoffice/config"; + # needs to be ran wrapped in FHS for now + # because the default config refers to many FHS paths + ExecStart = "${cfg.package.fhs}/bin/onlyoffice-wrapper ${cfg.package.fileconverter}/bin/fileconverter /run/onlyoffice/config"; Group = "onlyoffice"; Restart = "always"; RuntimeDirectory = "onlyoffice"; @@ -326,6 +339,10 @@ in jq '.FileConverter.converter.x2tPath = "${cfg.x2t}/bin/x2t"' \ /run/onlyoffice/config/production-linux.json | sponge /run/onlyoffice/config/production-linux.json + chmod u+w /run/onlyoffice/config/log4js/production.json + jq '.categories.default.level = "${cfg.loglevel}"' \ + /run/onlyoffice/config/log4js/production.json | sponge /run/onlyoffice/config/log4js/production.json + if psql -d onlyoffice -c "SELECT 'task_result'::regclass;" >/dev/null; then psql -f ${cfg.package}/var/www/onlyoffice/documentserver/server/schema/postgresql/removetbl.sql psql -f ${cfg.package}/var/www/onlyoffice/documentserver/server/schema/postgresql/createdb.sql @@ -344,7 +361,7 @@ in requires = [ "postgresql.target" ]; wantedBy = [ "multi-user.target" ]; serviceConfig = { - ExecStart = "${cfg.package.fhs}/bin/onlyoffice-wrapper DocService/docservice /run/onlyoffice/config"; + ExecStart = "${cfg.package.fhs}/bin/onlyoffice-wrapper ${cfg.package.docservice}/bin/docservice /run/onlyoffice/config"; ExecStartPre = [ onlyoffice-prestart ]; Group = "onlyoffice"; Restart = "always"; diff --git a/pkgs/by-name/on/onlyoffice-documentserver/package.nix b/pkgs/by-name/on/onlyoffice-documentserver/package.nix index e55f0cfc5da9..59bf1a6b4483 100644 --- a/pkgs/by-name/on/onlyoffice-documentserver/package.nix +++ b/pkgs/by-name/on/onlyoffice-documentserver/package.nix @@ -1,78 +1,135 @@ { - lib, - stdenv, buildFHSEnv, + buildNpmPackage, corefonts, - dejavu_fonts, dpkg, + dejavu_fonts, + fetchFromGitHub, fetchurl, gcc-unwrapped, + lib, liberation_ttf_v1, - writeScript, - xorg, + lndir, nixosTests, + pkg-config, + stdenv, + vips, + writeScript, + x2t, }: let + version = "9.2.1"; + server-src = fetchFromGitHub { + owner = "ONLYOFFICE"; + repo = "server"; + tag = "v9.2.1.1"; + hash = "sha256-McG+PGL+ZmmnInuBhqVqMeX0o36/LbC0C5vQA1TDjO8="; + }; + common = buildNpmPackage (finalAttrs: { + name = "onlyoffice-server-Common"; + src = server-src; + sourceRoot = "${finalAttrs.src.name}/Common"; + npmDepsHash = "sha256-zFGqDtnNFzXCwp6uvK04GDMRG6BATv6ti3Wi8ikLjBU="; + dontNpmBuild = true; + postPatch = '' + # https://github.com/ONLYOFFICE/build_tools/blob/ef8153c053bed41909ceb0762b124f8fe7faa0a7/scripts/build_server.py#L34 + sed -e "s/^const buildVersion = '[0-9.]*'/const buildVersion = '${version}'/" -i sources/commondefines.js + ''; + postInstall = '' + ln -s $out/lib/node_modules/common $out/lib/node_modules/Common + ''; + }); + docservice = buildNpmPackage (finalAttrs: { + name = "onlyoffice-server-DocService"; + src = server-src; + sourceRoot = "${finalAttrs.src.name}/DocService"; + nativeBuildInputs = [ + pkg-config + ]; + buildInputs = [ + vips.dev + ]; + npmDepsHash = "sha256-4t3wrO+Tt3bTRzmvB+tbVr5D3fXpn7CCU7+dNRc7xEo="; + npmFlags = [ "--loglevel=verbose" ]; + dontNpmBuild = true; + postInstall = '' + # it would be neater if this were a 'ln -s', but this is not possible + # because common/sources/notificationService.js has a circular dependency + # back on DocService + cp -r ${common}/lib/node_modules/common $out/lib/node_modules/Common + ln -s $out/lib/node_modules/coauthoring $out/lib/node_modules/DocService + ''; + }); + fileconverter = buildNpmPackage (finalAttrs: { + name = "onlyoffice-server-FileConverter"; + src = server-src; + + sourceRoot = "${finalAttrs.src.name}/FileConverter"; + + npmDepsHash = "sha256-JKZqbpVBNe6dwxsTg8WqlJAlAqOYmqm+LyWgIxpRb8k="; + + dontNpmBuild = true; + + postInstall = '' + ln -s ${common}/lib/node_modules/common $out/lib/node_modules/Common + ln -s ${docservice}/lib/node_modules/coauthoring $out/lib/node_modules/DocService + ''; + }); # var/www/onlyoffice/documentserver/server/DocService/docservice - onlyoffice-documentserver = stdenv.mkDerivation rec { + onlyoffice-documentserver = stdenv.mkDerivation { pname = "onlyoffice-documentserver"; version = "9.2.1"; - src = fetchurl ( - { - "aarch64-linux" = { - url = "https://github.com/ONLYOFFICE/DocumentServer/releases/download/v${version}/onlyoffice-documentserver_arm64.deb"; - sha256 = "sha256-1hSGR68v2azRT2PsthXKjEekGekgAv0FFESrXK6vGs0="; - }; - "x86_64-linux" = { - url = "https://github.com/ONLYOFFICE/DocumentServer/releases/download/v${version}/onlyoffice-documentserver_amd64.deb"; - sha256 = "sha256-/H/x069JA9MtrfILos5KRT0IKOHKOuS7nI1ZspizvvA="; - }; - } - .${stdenv.hostPlatform.system} or (throw "unsupported system ${stdenv.hostPlatform.system}") - ); + src = fetchFromGitHub { + owner = "ONLYOFFICE"; + repo = "document-server-package"; + tag = "v9.2.1.13"; + hash = "sha256-jyXSYkWu63vdeWsRm1Pl/3p3jRjasj0whzN0CytdHks="; + }; - preferLocalBuild = true; - - unpackCmd = "dpkg -x $curSrc source"; - - nativeBuildInputs = [ - dpkg - ]; + buildPhase = '' + runHook preBuild + # nothing for now + runHook postBuild + ''; installPhase = '' - # replace dangling symlinks which are not copied into fhs with actually files - mkdir lib - for file in var/www/onlyoffice/documentserver/server/FileConverter/bin/*.so* ; do - ln -rs "$file" lib/$(basename "$file") - done + mkdir -p $out/etc/onlyoffice/documentserver/log4js + cp ${server-src}/Common/config/default.json $out/etc/onlyoffice/documentserver + cp ${server-src}/Common/config/production-linux.json $out/etc/onlyoffice/documentserver + cp ${server-src}/Common/config/log4js/production.json $out/etc/onlyoffice/documentserver/log4js - # NixOS uses systemd, not supervisor - rm -rf etc/supervisor + mkdir -p $out/var/www/onlyoffice/documentserver-example + cp -r common/documentserver-example/welcome $out/var/www/onlyoffice/documentserver-example - install -Dm755 usr/bin/documentserver-prepare4shutdown.sh -t $out/bin - # maintainer scripts which expect supervisorctl, try to write into the nix store or are handled by nixos modules - rm -rf usr/bin + mkdir -p $out/var/www/onlyoffice/documentserver + ln -s ${x2t.components.web-apps} $out/var/www/onlyoffice/documentserver/web-apps + # copying instead of linking for now because we want to inject + # AllFonts.js in here: + cp -r ${x2t.components.sdkjs} $out/var/www/onlyoffice/documentserver/sdkjs - # .deb default documentation - rm -rf usr/share + # we don't currently support sdkjs plugins in NixOS + # https://github.com/ONLYOFFICE/build_tools/blob/master/scripts/deploy_server.py#L130 + mkdir -p $out/var/www/onlyoffice/documentserver/sdkjs-plugins + echo "[]" > $out/var/www/onlyoffice/documentserver/sdkjs-plugins/plugin-list-default.json - # required for bwrap --bind - mkdir -p var/lib/onlyoffice/ var/www/onlyoffice/documentserver/fonts/ + mkdir -p $out/var/www/onlyoffice/documentserver/server/schema + cp -r ${server-src}/schema/* $out/var/www/onlyoffice/documentserver/server/schema + mkdir -p $out/var/www/onlyoffice/documentserver/server/FileConverter/bin - # see usr/bin/documentserver-flush-cache.sh - cp var/www/onlyoffice/documentserver/web-apps/apps/api/documents/api.js{.tpl,} - substituteInPlace var/www/onlyoffice/documentserver/web-apps/apps/api/documents/api.js \ - --replace-fail '{{HASH_POSTFIX}}' "$(basename $out | cut -d '-' -f 1)" - - mv * $out/ + ## required for bwrap --bind + chmod u+w $out/var + mkdir -p $out/var/lib/onlyoffice + chmod u+w $out/var/www/onlyoffice/documentserver + mkdir $out/var/www/onlyoffice/documentserver/fonts ''; # stripping self extracting javascript binaries likely breaks them dontStrip = true; passthru = { + inherit fileconverter common docservice; tests = nixosTests.onlyoffice; fhs = buildFHSEnv { name = "onlyoffice-wrapper"; @@ -85,6 +142,7 @@ let corefonts dejavu_fonts liberation_ttf_v1 + fileconverter ]; extraBuildCommands = '' @@ -105,7 +163,7 @@ let export NODE_DISABLE_COLORS=1 export NODE_ENV=production-linux - if [[ $1 == DocService/docservice ]]; then + if [[ $1 == *"docservice" ]]; then mkdir -p var/www/onlyoffice/documentserver/sdkjs/slide/themes/ # symlinking themes/src breaks discovery in allfontsgen rm -rf var/www/onlyoffice/documentserver/sdkjs/slide/themes/src @@ -114,14 +172,15 @@ let # onlyoffice places generated files in those directores rm -rf var/www/onlyoffice/documentserver/sdkjs/common/* - ${xorg.lndir}/bin/lndir -silent ${onlyoffice-documentserver}/var/www/onlyoffice/documentserver/sdkjs/common/ var/www/onlyoffice/documentserver/sdkjs/common/ + ${lndir}/bin/lndir -silent ${onlyoffice-documentserver}/var/www/onlyoffice/documentserver/sdkjs/common/ var/www/onlyoffice/documentserver/sdkjs/common/ rm -rf var/www/onlyoffice/documentserver/server/FileConverter/bin/* - ${xorg.lndir}/bin/lndir -silent ${onlyoffice-documentserver}/var/www/onlyoffice/documentserver/server/FileConverter/bin/ var/www/onlyoffice/documentserver/server/FileConverter/bin/ + ${lndir}/bin/lndir -silent ${onlyoffice-documentserver}/var/www/onlyoffice/documentserver/server/FileConverter/bin/ var/www/onlyoffice/documentserver/server/FileConverter/bin/ # https://github.com/ONLYOFFICE/document-server-package/blob/master/common/documentserver/bin/documentserver-generate-allfonts.sh.m4 + # TODO --use-system doesn't actually appear to make a difference? echo -n Generating AllFonts.js, please wait... - "var/www/onlyoffice/documentserver/server/tools/allfontsgen"\ - --input="${onlyoffice-documentserver}/var/www/onlyoffice/documentserver/core-fonts"\ + "${x2t.components.allfontsgen}/bin/allfontsgen"\ + --input="${x2t.components.core-fonts}"\ --allfonts-web="var/www/onlyoffice/documentserver/sdkjs/common/AllFonts.js"\ --allfonts="var/www/onlyoffice/documentserver/server/FileConverter/bin/AllFonts.js"\ --images="var/www/onlyoffice/documentserver/sdkjs/common/Images"\ @@ -130,21 +189,22 @@ let --use-system="true" echo Done + # TODO x2t brings its on DoctRenderer.config, so it wouldn't pick up the new fonts: echo -n Generating presentation themes, please wait... - "var/www/onlyoffice/documentserver/server/tools/allthemesgen"\ - --converter-dir="var/www/onlyoffice/documentserver/server/FileConverter/bin"\ + "${x2t.components.allthemesgen}/bin/allthemesgen"\ + --converter-dir="${x2t}/bin"\ --src="var/www/onlyoffice/documentserver/sdkjs/slide/themes"\ --output="var/www/onlyoffice/documentserver/sdkjs/common/Images" - "var/www/onlyoffice/documentserver/server/tools/allthemesgen"\ - --converter-dir="var/www/onlyoffice/documentserver/server/FileConverter/bin"\ + "${x2t.components.allthemesgen}/bin/allthemesgen"\ + --converter-dir="${x2t}/bin"\ --src="var/www/onlyoffice/documentserver/sdkjs/slide/themes"\ --output="var/www/onlyoffice/documentserver/sdkjs/common/Images"\ --postfix="ios"\ --params="280,224" - "var/www/onlyoffice/documentserver/server/tools/allthemesgen"\ - --converter-dir="var/www/onlyoffice/documentserver/server/FileConverter/bin"\ + "${x2t.components.allthemesgen}/bin/allthemesgen"\ + --converter-dir="${x2t}/bin"\ --src="var/www/onlyoffice/documentserver/sdkjs/slide/themes"\ --output="var/www/onlyoffice/documentserver/sdkjs/common/Images"\ --postfix="android"\ @@ -152,14 +212,13 @@ let echo Done fi - exec var/www/onlyoffice/documentserver/server/$1 + exec $1 ''; }; }; meta = { description = "ONLYOFFICE Document Server is an online office suite comprising viewers and editors"; - mainProgram = "documentserver-prepare4shutdown.sh"; longDescription = '' ONLYOFFICE Document Server is an online office suite comprising viewers and editors for texts, spreadsheets and presentations, fully compatible with Office Open XML formats: .docx, .xlsx, .pptx and enabling collaborative editing in real time. @@ -170,7 +229,6 @@ let "x86_64-linux" "aarch64-linux" ]; - sourceProvenance = [ lib.sourceTypes.binaryNativeCode ]; maintainers = with lib.maintainers; [ raboof ]; }; }; diff --git a/pkgs/by-name/x2/x2t/package.nix b/pkgs/by-name/x2/x2t/package.nix index 3519c6886459..8bb46f0acc87 100644 --- a/pkgs/by-name/x2/x2t/package.nix +++ b/pkgs/by-name/x2/x2t/package.nix @@ -9,6 +9,7 @@ harfbuzz, libheif, nixosTests, + optipng, x265, libde265, icu, @@ -119,7 +120,9 @@ let qmakeFlags = [ ]; dontStrip = false; - # Revisions that correspond to onlyoffice-documentserver 9.2.1 + # x2t is not 'directly' versioned, so we version it after the version + # of documentserver it's pulled into as a submodule + version = "9.2.1"; core-rev = "a22f0bfb6032e91f218951ef1c0fc29f6d1ceb36"; core = fetchFromGitHub { owner = "ONLYOFFICE"; @@ -155,14 +158,23 @@ let autoconf automake grunt-cli + optipng ]; dontNpmBuild = true; + preBuild = '' + export PRODUCT_VERSION=${version} + ''; + postBuild = '' chmod u+w .. mkdir ../deploy chmod u+w -R ../apps + + mkdir -p ./node_modules/optipng-bin/vendor + ln -s ${optipng}/bin/optipng ./node_modules/optipng-bin/vendor/optipng + grunt --force ''; @@ -171,6 +183,11 @@ let cp -r ../deploy/web-apps $out + ## see usr/bin/documentserver-flush-cache.sh + chmod u+w $out/apps/api/documents + substituteInPlace $out/apps/api/documents/api.js \ + --replace-fail '{{HASH_POSTFIX}}' "$(basename $out | cut -d '-' -f 1)" + runHook postInstall ''; }); @@ -719,6 +736,32 @@ let runHook postInstall ''; }; + allthemesgen = buildCoreComponent "DesktopEditor/allthemesgen" { + buildInputs = [ + unicodeConverter + kernel + graphics + network + doctrenderer + docxrenderer + pdffile + xpsfile + djvufile + ]; + qmakeFlags = qmakeFlags ++ icuQmakeFlags; + preConfigure = '' + source ${fixIcu} + ''; + dontStrip = true; + installPhase = '' + runHook preInstall + + mkdir -p $out/bin + cp $BUILDRT/build/bin/*/* $BUILDRT/build/bin/*/*/* $out/bin + + runHook postInstall + ''; + }; core-fonts = fetchFromGitHub { owner = "ONLYOFFICE"; repo = "core-fonts"; @@ -741,9 +784,7 @@ let in buildCoreComponent "X2tConverter/build/Qt" { pname = "x2t"; - # x2t is not 'directly' versioned, so we version it after the version - # of documentserver it's pulled into as a submodule - version = "9.2.1"; + inherit version; buildInputs = [ unicodeConverter @@ -794,7 +835,7 @@ buildCoreComponent "X2tConverter/build/Qt" { mkdir -p $out/bin find $BUILDRT/build -type f -exec cp {} $out/bin \; - mkdir -p $out/etc + mkdir $out/etc cat >$out/etc/DoctRenderer.config < ${sdkjs}/common/Native/native.js @@ -806,6 +847,11 @@ buildCoreComponent "X2tConverter/build/Qt" { EOF + # TODO when allthemesgen invokes x2t as the converter, it + # hard-codes expecting DoctRenderer.config in the same dir + # the x2t binary is located: + ln -s $out/etc/DoctRenderer.config $out/bin/DoctRenderer.config + runHook postInstall ''; passthru.tests = { @@ -824,7 +870,9 @@ buildCoreComponent "X2tConverter/build/Qt" { passthru.components = { inherit allfontsgen + allthemesgen allfonts + core-fonts unicodeConverter kernel graphics