onlyoffice-documentserver: build from source instead of relying on .deb (#473316)
This commit is contained in:
@@ -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 ];
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user