onlyoffice-documentserver: build from source instead of relying on .deb (#473316)

This commit is contained in:
Arnout Engelen
2026-01-12 14:34:32 +00:00
committed by GitHub
3 changed files with 190 additions and 67 deletions
+19 -2
View File
@@ -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";
@@ -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 ];
};
};
+53 -5
View File
@@ -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 <<EOF
<Settings>
<file>${sdkjs}/common/Native/native.js</file>
@@ -806,6 +847,11 @@ buildCoreComponent "X2tConverter/build/Qt" {
</Settings>
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