diff options
author | Aaron Andersen <aaron@fosslib.net> | 2019-12-22 20:26:57 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-12-22 20:26:57 -0500 |
commit | 086d1ad9062473766e7c320d03d6bfde85f263a8 (patch) | |
tree | 46643819a30462b603bc18c781f6c5c10f6b53fb | |
parent | e865acf44c70653a1c15da9bf70faf2c1c16d9d6 (diff) | |
parent | ebf3f1fe784c5475230fc1f99f4a716f2b6821ad (diff) | |
download | nixlib-086d1ad9062473766e7c320d03d6bfde85f263a8.tar nixlib-086d1ad9062473766e7c320d03d6bfde85f263a8.tar.gz nixlib-086d1ad9062473766e7c320d03d6bfde85f263a8.tar.bz2 nixlib-086d1ad9062473766e7c320d03d6bfde85f263a8.tar.lz nixlib-086d1ad9062473766e7c320d03d6bfde85f263a8.tar.xz nixlib-086d1ad9062473766e7c320d03d6bfde85f263a8.tar.zst nixlib-086d1ad9062473766e7c320d03d6bfde85f263a8.zip |
Merge pull request #75047 from kampka/trilium-server
Add trilium server and module
-rw-r--r-- | nixos/modules/module-list.nix | 1 | ||||
-rw-r--r-- | nixos/modules/services/web-apps/trilium.nix | 137 | ||||
-rw-r--r-- | nixos/tests/all-tests.nix | 1 | ||||
-rw-r--r-- | nixos/tests/trilium-server.nix | 53 | ||||
-rw-r--r-- | pkgs/applications/office/trilium/0001-Use-console-logger-instead-of-rolling-files.patch | 69 | ||||
-rw-r--r-- | pkgs/applications/office/trilium/default.nix | 129 | ||||
-rw-r--r-- | pkgs/top-level/all-packages.nix | 6 |
7 files changed, 355 insertions, 41 deletions
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 7650da89cbdd..cc5444dddfc6 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -815,6 +815,7 @@ ./services/web-apps/restya-board.nix ./services/web-apps/tt-rss.nix ./services/web-apps/trac.nix + ./services/web-apps/trilium.nix ./services/web-apps/selfoss.nix ./services/web-apps/shiori.nix ./services/web-apps/virtlyst.nix diff --git a/nixos/modules/services/web-apps/trilium.nix b/nixos/modules/services/web-apps/trilium.nix new file mode 100644 index 000000000000..6f47193c62b9 --- /dev/null +++ b/nixos/modules/services/web-apps/trilium.nix @@ -0,0 +1,137 @@ +{ config, lib, pkgs, ... }: + +let + cfg = config.services.trilium-server; + configIni = pkgs.writeText "trilium-config.ini" '' + [General] + # Instance name can be used to distinguish between different instances + instanceName=${cfg.instanceName} + + # Disable automatically generating desktop icon + noDesktopIcon=true + + [Network] + # host setting is relevant only for web deployments - set the host on which the server will listen + host=${cfg.host} + # port setting is relevant only for web deployments, desktop builds run on random free port + port=${toString cfg.port} + # true for TLS/SSL/HTTPS (secure), false for HTTP (unsecure). + https=false + ''; +in +{ + + options.services.trilium-server = with lib; { + enable = mkEnableOption "trilium-server"; + + dataDir = mkOption { + type = types.str; + default = "/var/lib/trilium"; + description = '' + The directory storing the nodes database and the configuration. + ''; + }; + + instanceName = mkOption { + type = types.str; + default = "Trilium"; + description = '' + Instance name used to distinguish between different instances + ''; + }; + + host = mkOption { + type = types.str; + default = "127.0.0.1"; + description = '' + The host address to bind to (defaults to localhost). + ''; + }; + + port = mkOption { + type = types.int; + default = 8080; + description = '' + The port number to bind to. + ''; + }; + + nginx = mkOption { + default = {}; + description = '' + Configuration for nginx reverse proxy. + ''; + + type = types.submodule { + options = { + enable = mkOption { + type = types.bool; + default = false; + description = '' + Configure the nginx reverse proxy settings. + ''; + }; + + hostName = mkOption { + type = types.str; + description = '' + The hostname use to setup the virtualhost configuration + ''; + }; + }; + }; + }; + }; + + config = lib.mkIf cfg.enable (lib.mkMerge [ + { + meta.maintainers = with lib.maintainers; [ kampka ]; + + users.groups.trilium = {}; + users.users.trilium = { + description = "Trilium User"; + group = "trilium"; + home = cfg.dataDir; + isSystemUser = true; + }; + + systemd.services.trilium-server = { + wantedBy = [ "multi-user.target" ]; + environment.TRILIUM_DATA_DIR = cfg.dataDir; + serviceConfig = { + ExecStart = "${pkgs.trilium-server}/bin/trilium-server"; + User = "trilium"; + Group = "trilium"; + PrivateTmp = "true"; + }; + }; + + systemd.tmpfiles.rules = [ + "d ${cfg.dataDir} 0750 trilium trilium - -" + "L+ ${cfg.dataDir}/config.ini - - - - ${configIni}" + ]; + + } + + (lib.mkIf cfg.nginx.enable { + services.nginx = { + enable = true; + virtualHosts."${cfg.nginx.hostName}" = { + locations."/" = { + proxyPass = "http://${cfg.host}:${toString cfg.port}/"; + extraConfig = '' + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + ''; + }; + extraConfig = '' + client_max_body_size 0; + ''; + }; + }; + }) + ]); +} diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index 6413895c4c5e..4d45dae7cd56 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -278,6 +278,7 @@ in tor = handleTest ./tor.nix {}; transmission = handleTest ./transmission.nix {}; trac = handleTest ./trac.nix {}; + trilium-server = handleTestOn ["x86_64-linux"] ./trilium-server.nix {}; trezord = handleTest ./trezord.nix {}; trickster = handleTest ./trickster.nix {}; udisks2 = handleTest ./udisks2.nix {}; diff --git a/nixos/tests/trilium-server.nix b/nixos/tests/trilium-server.nix new file mode 100644 index 000000000000..6346575b33da --- /dev/null +++ b/nixos/tests/trilium-server.nix @@ -0,0 +1,53 @@ +import ./make-test-python.nix ({ ... }: { + name = "trilium-server"; + nodes = { + default = { + services.trilium-server.enable = true; + }; + configured = { + services.trilium-server = { + enable = true; + dataDir = "/data/trilium"; + }; + }; + + nginx = { + services.trilium-server = { + enable = true; + nginx.enable = true; + nginx.hostName = "trilium.example.com"; + }; + }; + }; + + testScript = + '' + start_all() + + with subtest("by default works without configuration"): + default.wait_for_unit("trilium-server.service") + + with subtest("by default available on port 8080"): + default.wait_for_unit("trilium-server.service") + default.wait_for_open_port(8080) + # we output to /dev/null here to avoid a python UTF-8 decode error + # but the check will still fail if the service doesn't respond + default.succeed("curl --fail -o /dev/null 127.0.0.1:8080") + + with subtest("by default creates empty document"): + default.wait_for_unit("trilium-server.service") + default.succeed("test -f /var/lib/trilium/document.db") + + with subtest("configured with custom data store"): + configured.wait_for_unit("trilium-server.service") + configured.succeed("test -f /data/trilium/document.db") + + with subtest("nginx with custom host name"): + nginx.wait_for_unit("trilium-server.service") + nginx.wait_for_unit("nginx.service") + + nginx.succeed( + "curl --resolve 'trilium.example.com:80:127.0.0.1' http://trilium.example.com/" + ) + ''; +}) diff --git a/pkgs/applications/office/trilium/0001-Use-console-logger-instead-of-rolling-files.patch b/pkgs/applications/office/trilium/0001-Use-console-logger-instead-of-rolling-files.patch new file mode 100644 index 000000000000..1a4350ca71a1 --- /dev/null +++ b/pkgs/applications/office/trilium/0001-Use-console-logger-instead-of-rolling-files.patch @@ -0,0 +1,69 @@ +From 5be803a1171855f976a5b607970fa3949db72181 Mon Sep 17 00:00:00 2001 +From: Christian Kampka <christian@kampka.net> +Date: Mon, 9 Dec 2019 19:40:27 +0100 +Subject: [PATCH] Use console logger instead of rolling files + +--- + src/services/log.js | 26 +++----------------------- + 1 file changed, 3 insertions(+), 23 deletions(-) + +diff --git a/src/services/log.js b/src/services/log.js +index 1514c209..456c3749 100644 +--- a/src/services/log.js ++++ b/src/services/log.js +@@ -1,35 +1,15 @@ + "use strict"; + +-const fs = require('fs'); +-const dataDir = require('./data_dir'); +- +-if (!fs.existsSync(dataDir.LOG_DIR)) { +- fs.mkdirSync(dataDir.LOG_DIR, 0o700); +-} +- +-const logger = require('simple-node-logger').createRollingFileLogger({ +- errorEventName: 'error', +- logDirectory: dataDir.LOG_DIR, +- fileNamePattern: 'trilium-<DATE>.log', +- dateFormat:'YYYY-MM-DD' +-}); +- + function info(message) { + // info messages are logged asynchronously + setTimeout(() => { + console.log(message); +- +- logger.info(message); + }, 0); + } + + function error(message) { + message = "ERROR: " + message; + +- // we're using .info() instead of .error() because simple-node-logger emits weird error for showError() +- // errors are logged synchronously to make sure it doesn't get lost in case of crash +- logger.info(message); +- + console.trace(message); + } + +@@ -45,12 +25,12 @@ function request(req) { + if (req.url.includes(".js.map") || req.url.includes(".css.map")) { + return; + } +- +- logger.info(req.method + " " + req.url); ++ if(process.env.DEBUG) ++ console.log(req.method + " " + req.url); + } + + module.exports = { + info, + error, + request +-}; +\ No newline at end of file ++}; +-- +2.23.0 + diff --git a/pkgs/applications/office/trilium/default.nix b/pkgs/applications/office/trilium/default.nix index 877dfba88c06..d44b51861dc5 100644 --- a/pkgs/applications/office/trilium/default.nix +++ b/pkgs/applications/office/trilium/default.nix @@ -1,4 +1,4 @@ -{ stdenv, fetchurl, autoPatchelfHook, atomEnv, makeWrapper, makeDesktopItem, gtk3, wrapGAppsHook }: +{ stdenv, nixosTests, fetchurl, autoPatchelfHook, atomEnv, makeWrapper, makeDesktopItem, gtk3, wrapGAppsHook, zlib, libxkbfile }: let description = "Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases."; @@ -11,56 +11,105 @@ let categories = "Office"; }; -in stdenv.mkDerivation rec { - pname = "trilium"; - version = "0.33.6"; - - src = fetchurl { - url = "https://github.com/zadam/trilium/releases/download/v${version}/trilium-linux-x64-${version}.tar.xz"; - sha256 = "1sg6iqhpgyr8zr6w6dgs0ha0indb9vyp8vh2clj2fds5ahhlvf91"; + meta = with stdenv.lib; { + inherit description; + homepage = https://github.com/zadam/trilium; + license = licenses.agpl3; + platforms = [ "x86_64-linux" ]; + maintainers = with maintainers; [ emmanuelrosa dtzWill kampka ]; }; - # Fetch from source repo, no longer included in release. - # (they did special-case icon.png but we want the scalable svg) - # Use the version here to ensure we get any changes. - trilium_svg = fetchurl { - url = "https://raw.githubusercontent.com/zadam/trilium/v${version}/src/public/images/trilium.svg"; - sha256 = "1rgj7pza20yndfp8n12k93jyprym02hqah36fkk2b3if3kcmwnfg"; + version = "0.38.2"; + +in { + + trilium-desktop = stdenv.mkDerivation rec { + pname = "trilium-desktop"; + inherit version; + inherit meta; + + src = fetchurl { + url = "https://github.com/zadam/trilium/releases/download/v${version}/trilium-linux-x64-${version}.tar.xz"; + sha256 = "10f5zfqcfcjynw04d5xzrfmkbqpk85i4mq7njhkibx2f1m0br2qa"; + }; + + # Fetch from source repo, no longer included in release. + # (they did special-case icon.png but we want the scalable svg) + # Use the version here to ensure we get any changes. + trilium_svg = fetchurl { + url = "https://raw.githubusercontent.com/zadam/trilium/v${version}/src/public/images/trilium.svg"; + sha256 = "1rgj7pza20yndfp8n12k93jyprym02hqah36fkk2b3if3kcmwnfg"; + }; + + + nativeBuildInputs = [ + autoPatchelfHook + makeWrapper + wrapGAppsHook + ]; + + buildInputs = [ atomEnv.packages gtk3 ]; + + installPhase = '' + mkdir -p $out/bin + mkdir -p $out/share/trilium + mkdir -p $out/share/{applications,icons/hicolor/scalable/apps} + + cp -r ./* $out/share/trilium + ln -s $out/share/trilium/trilium $out/bin/trilium + + ln -s ${trilium_svg} $out/share/icons/hicolor/scalable/apps/trilium.svg + cp ${desktopItem}/share/applications/* $out/share/applications + ''; + + # LD_LIBRARY_PATH "shouldn't" be needed, remove when possible :) + preFixup = '' + gappsWrapperArgs+=(--prefix LD_LIBRARY_PATH : ${atomEnv.libPath}) + ''; + + dontStrip = true; }; - nativeBuildInputs = [ - autoPatchelfHook - makeWrapper - wrapGAppsHook - ]; + trilium-server = stdenv.mkDerivation rec { + pname = "trilium-server"; + inherit version; + inherit meta; - buildInputs = [ atomEnv.packages gtk3 ]; + src = fetchurl { + url = "https://github.com/zadam/trilium/releases/download/v${version}/trilium-linux-x64-server-${version}.tar.xz"; + sha256 = "1df0cx9gpzk0086lgha0qm1g03l8f4rz7y2xzgpzng5rrxjkgz61"; + }; - installPhase = '' - mkdir -p $out/bin - mkdir -p $out/share/trilium - mkdir -p $out/share/{applications,icons/hicolor/scalable/apps} + nativeBuildInputs = [ + autoPatchelfHook + ]; - cp -r ./* $out/share/trilium - ln -s $out/share/trilium/trilium $out/bin/trilium + buildInputs = [ + stdenv.cc.cc.lib + zlib + libxkbfile + ]; - ln -s ${trilium_svg} $out/share/icons/hicolor/scalable/apps/trilium.svg - cp ${desktopItem}/share/applications/* $out/share/applications - ''; + patches = [ ./0001-Use-console-logger-instead-of-rolling-files.patch ] ; + installPhase = '' + mkdir -p $out/bin + mkdir -p $out/share/trilium-server - # LD_LIBRARY_PATH "shouldn't" be needed, remove when possible :) - preFixup = '' - gappsWrapperArgs+=(--prefix LD_LIBRARY_PATH : ${atomEnv.libPath}) - ''; + cp -r ./* $out/share/trilium-server + ''; - dontStrip = true; + postFixup = '' + cat > $out/bin/trilium-server <<EOF + #!${stdenv.cc.shell} + cd $out/share/trilium-server + exec ./node/bin/node src/www + EOF + chmod a+x $out/bin/trilium-server + ''; - meta = with stdenv.lib; { - inherit description; - homepage = https://github.com/zadam/trilium; - license = licenses.agpl3; - platforms = platforms.linux; - maintainers = with maintainers; [ emmanuelrosa dtzWill ]; + passthru.tests = { + trilium-server = nixosTests.trilium-server; + }; }; } diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index a7e405e20cb1..cba2d61184d7 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -6816,7 +6816,11 @@ in triggerhappy = callPackage ../tools/inputmethods/triggerhappy {}; - trilium = callPackage ../applications/office/trilium { }; + inherit (callPackage ../applications/office/trilium {}) + trilium-desktop + trilium-server + ; + trilium = trilium-desktop; trousers = callPackage ../tools/security/trousers { }; |