From c0327bf8e229cb393d809f72848c651337705fd7 Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Thu, 23 Jan 2025 20:18:05 +0100 Subject: [PATCH 01/11] feat(server/utils): add envToBoolean helper function turns "true" / "false" strings from a process.env property into actual boolean values or undefined --- src/services/utils.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/services/utils.ts b/src/services/utils.ts index 4d4f42936..9b05e2199 100644 --- a/src/services/utils.ts +++ b/src/services/utils.ts @@ -295,6 +295,18 @@ export function isString(x: any) { return Object.prototype.toString.call(x) === "[object String]"; } +// try to turn 'true' and 'false' strings from process.env variables into boolean values or undefined +export function envToBoolean(val: string | undefined) { + if (val === undefined || typeof val !== "string") return undefined; + + const valLc = val.toLowerCase().trim(); + + if (valLc === "true") return true; + if (valLc === "false") return false; + + return undefined; +} + /** * Returns the directory for resources. On Electron builds this corresponds to the `resources` subdirectory inside the distributable package. * On development builds, this simply refers to the root directory of the application. @@ -352,5 +364,6 @@ export default { isString, getResourceDir, isMac, - isWindows + isWindows, + envToBoolean }; From 279aa156cfc2d5d8876d1fc31a97f6d79ba0056d Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Thu, 23 Jan 2025 20:23:31 +0100 Subject: [PATCH 02/11] feat(services/config): add possibility to read config from ENV envToBoolean used to turn "string booleans" into JS booleans --- src/services/config.ts | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/services/config.ts b/src/services/config.ts index 43ecc39da..40908657b 100644 --- a/src/services/config.ts +++ b/src/services/config.ts @@ -5,6 +5,7 @@ import fs from "fs"; import dataDir from "./data_dir.js"; import path from "path"; import resourceDir from "./resource_dir.js"; +import { envToBoolean } from "./utils.js"; const configSampleFilePath = path.resolve(resourceDir.RESOURCE_DIR, "config-sample.ini"); @@ -14,6 +15,25 @@ if (!fs.existsSync(dataDir.CONFIG_INI_PATH)) { fs.writeFileSync(dataDir.CONFIG_INI_PATH, configSample); } -const config = ini.parse(fs.readFileSync(dataDir.CONFIG_INI_PATH, "utf-8")); +const iniConfig = ini.parse(fs.readFileSync(dataDir.CONFIG_INI_PATH, "utf-8")); + +const config = { + + General: { + instanceName: process.env.TRILIUM_GENERAL_INSTANCENAME || iniConfig.General.instanceName, + noAuthentication: envToBoolean(process.env.TRILIUM_GENERAL_NOAUTHENTICATION) || iniConfig.General.noAuthentication, + noBackup: envToBoolean(process.env.TRILIUM_GENERAL_NOBACKUP) || iniConfig.General.noBackup + }, + + Network: { + port: process.env.TRILIUM_NETWORK_PORT || iniConfig.Network.port, + https: envToBoolean(process.env.TRILIUM_NETWORK_HTTPS) || iniConfig.Network.https, + certPath: process.env.TRILIUM_NETWORK_CERTPATH || iniConfig.Network.certPath, + keyPath: process.env.TRILIUM_NETWORK_KEYPATH || iniConfig.Network.keyPath, + trustedReverseProxy: process.env.TRILIUM_NETWORK_TRUSTEDREVERSEPROXY || iniConfig.Network.trustedReverseProxy + } + +}; + export default config; From edeaca6d1fda87668f83afd4b7cdeec68980559a Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Thu, 23 Jan 2025 20:32:45 +0100 Subject: [PATCH 03/11] feat(services/config): add missing config values these are used in the codebase, but are not defined in the sample.ini --- src/services/config.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/services/config.ts b/src/services/config.ts index 40908657b..42bd2ab74 100644 --- a/src/services/config.ts +++ b/src/services/config.ts @@ -22,16 +22,20 @@ const config = { General: { instanceName: process.env.TRILIUM_GENERAL_INSTANCENAME || iniConfig.General.instanceName, noAuthentication: envToBoolean(process.env.TRILIUM_GENERAL_NOAUTHENTICATION) || iniConfig.General.noAuthentication, - noBackup: envToBoolean(process.env.TRILIUM_GENERAL_NOBACKUP) || iniConfig.General.noBackup + noBackup: envToBoolean(process.env.TRILIUM_GENERAL_NOBACKUP) || iniConfig.General.noBackup, + noDesktopIcon: envToBoolean(process.env.TRILIUM_GENERAL_NODESKTOPICON) || iniConfig.General.noDesktopIcon }, Network: { + host: process.env.TRILIUM_NETWORK_HOST || iniConfig.Network.host, port: process.env.TRILIUM_NETWORK_PORT || iniConfig.Network.port, https: envToBoolean(process.env.TRILIUM_NETWORK_HTTPS) || iniConfig.Network.https, certPath: process.env.TRILIUM_NETWORK_CERTPATH || iniConfig.Network.certPath, keyPath: process.env.TRILIUM_NETWORK_KEYPATH || iniConfig.Network.keyPath, trustedReverseProxy: process.env.TRILIUM_NETWORK_TRUSTEDREVERSEPROXY || iniConfig.Network.trustedReverseProxy - } + }, + // @TODO correctly define here + //Sync: {} }; From c7bd5e2c675778841af8aa834779963b7f9b8285 Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Thu, 23 Jan 2025 23:50:16 +0100 Subject: [PATCH 04/11] feat(services/config): add TriliumConfig Type --- src/services/config.ts | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/services/config.ts b/src/services/config.ts index 42bd2ab74..fa7358099 100644 --- a/src/services/config.ts +++ b/src/services/config.ts @@ -17,7 +17,28 @@ if (!fs.existsSync(dataDir.CONFIG_INI_PATH)) { const iniConfig = ini.parse(fs.readFileSync(dataDir.CONFIG_INI_PATH, "utf-8")); -const config = { +export interface TriliumConfig { + General: { + instanceName: string; + noAuthentication: boolean; + noBackup: boolean; + noDesktopIcon: boolean; + }; + Network: { + host: string; + port: string; + https: boolean; + certPath: string; + keyPath: string; + trustedReverseProxy: boolean | string; + }; + Sync: { + syncServerHost: string; + syncServerTimeout: string; + syncProxy: string; + }; +} +const config: TriliumConfig = { General: { instanceName: process.env.TRILIUM_GENERAL_INSTANCENAME || iniConfig.General.instanceName, From 85c676486448d9e0755294fa2d79b97ab50d8260 Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Thu, 23 Jan 2025 23:58:46 +0100 Subject: [PATCH 05/11] feat(services/config): add Sync config block and fallback values original idea of using config-sample.ini for default values is not backwards compatible unfortunately fallback values taken from config-sample.ini and directly from other code in this codebase, where these values were set --- src/services/config.ts | 56 ++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/src/services/config.ts b/src/services/config.ts index fa7358099..c851503d0 100644 --- a/src/services/config.ts +++ b/src/services/config.ts @@ -38,27 +38,57 @@ export interface TriliumConfig { syncProxy: string; }; } + +//prettier-ignore const config: TriliumConfig = { General: { - instanceName: process.env.TRILIUM_GENERAL_INSTANCENAME || iniConfig.General.instanceName, - noAuthentication: envToBoolean(process.env.TRILIUM_GENERAL_NOAUTHENTICATION) || iniConfig.General.noAuthentication, - noBackup: envToBoolean(process.env.TRILIUM_GENERAL_NOBACKUP) || iniConfig.General.noBackup, - noDesktopIcon: envToBoolean(process.env.TRILIUM_GENERAL_NODESKTOPICON) || iniConfig.General.noDesktopIcon + instanceName: + process.env.TRILIUM_GENERAL_INSTANCENAME || iniConfig.General.instanceName || "", + + noAuthentication: + envToBoolean(process.env.TRILIUM_GENERAL_NOAUTHENTICATION) || iniConfig.General.noAuthentication || false, + + noBackup: + envToBoolean(process.env.TRILIUM_GENERAL_NOBACKUP) || iniConfig.General.noBackup || false, + + noDesktopIcon: + envToBoolean(process.env.TRILIUM_GENERAL_NODESKTOPICON) || iniConfig.General.noDesktopIcon || false }, Network: { - host: process.env.TRILIUM_NETWORK_HOST || iniConfig.Network.host, - port: process.env.TRILIUM_NETWORK_PORT || iniConfig.Network.port, - https: envToBoolean(process.env.TRILIUM_NETWORK_HTTPS) || iniConfig.Network.https, - certPath: process.env.TRILIUM_NETWORK_CERTPATH || iniConfig.Network.certPath, - keyPath: process.env.TRILIUM_NETWORK_KEYPATH || iniConfig.Network.keyPath, - trustedReverseProxy: process.env.TRILIUM_NETWORK_TRUSTEDREVERSEPROXY || iniConfig.Network.trustedReverseProxy + host: + process.env.TRILIUM_NETWORK_HOST || iniConfig.Network.host || "0.0.0.0", + + port: + process.env.TRILIUM_NETWORK_PORT || iniConfig.Network.port || "3000", + + https: + envToBoolean(process.env.TRILIUM_NETWORK_HTTPS) || iniConfig.Network.https || false, + + certPath: + process.env.TRILIUM_NETWORK_CERTPATH || iniConfig.Network.certPath || "", + + keyPath: + process.env.TRILIUM_NETWORK_KEYPATH || iniConfig.Network.keyPath || "", + + trustedReverseProxy: + process.env.TRILIUM_NETWORK_TRUSTEDREVERSEPROXY || iniConfig.Network.trustedReverseProxy || false }, - // @TODO correctly define here - //Sync: {} -}; + Sync: { + syncServerHost: + process.env.TRILIUM_SYNC_SERVER_HOST || iniConfig?.Sync?.syncServerHost || "", + syncServerTimeout: + process.env.TRILIUM_SYNC_SERVER_TIMEOUT || iniConfig?.Sync?.syncServerTimeout || "120000", + + // @TriliumNextTODO: check if we can rename misnamed syncProxy to syncServerProxy without + // breaking backwards compatibility - for naming consistency + syncProxy: + process.env.TRILIUM_SYNC_SERVER_PROXY || iniConfig?.Sync?.syncProxy || "" + } + +}; export default config; From 8778ca5f6c2d0f39172f7568955725de0493c650 Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Fri, 24 Jan 2025 00:02:45 +0100 Subject: [PATCH 06/11] fix(services): fix type errors --- src/services/scheduler.ts | 2 +- src/services/sync_options.ts | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/services/scheduler.ts b/src/services/scheduler.ts index 17edfe6f1..2c0151887 100644 --- a/src/services/scheduler.ts +++ b/src/services/scheduler.ts @@ -19,7 +19,7 @@ function getRunAtHours(note: BNote): number[] { } function runNotesWithLabel(runAttrValue: string) { - const instanceName = config.General ? config.General.instanceName : null; + const instanceName = config.General.instanceName; const currentHours = new Date().getHours(); const notes = attributeService.getNotesWithLabel("run", runAttrValue); diff --git a/src/services/sync_options.ts b/src/services/sync_options.ts index b7dc7f091..5bbb395f3 100644 --- a/src/services/sync_options.ts +++ b/src/services/sync_options.ts @@ -1,7 +1,6 @@ "use strict"; import optionService from "./options.js"; -import type { OptionNames } from "./options_interface.js"; import config from "./config.js"; /* @@ -11,8 +10,8 @@ import config from "./config.js"; * to live sync server. */ -function get(name: OptionNames) { - return (config["Sync"] && config["Sync"][name]) || optionService.getOption(name); +function get(name: keyof typeof config.Sync) { + return (config["Sync"] && config["Sync"][name]) || optionService.getOption(name); } export default { From 3fc9a10ab64da3e5eb630208de374840068284fc Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Fri, 24 Jan 2025 00:03:50 +0100 Subject: [PATCH 07/11] refactor(services/sync_options): get rid of process.env query this is now handled in config.ts already --- src/services/sync_options.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/sync_options.ts b/src/services/sync_options.ts index 5bbb395f3..ade405f46 100644 --- a/src/services/sync_options.ts +++ b/src/services/sync_options.ts @@ -17,7 +17,7 @@ function get(name: keyof typeof config.Sync) { export default { // env variable is the easiest way to guarantee we won't overwrite prod data during development // after copying prod document/data directory - getSyncServerHost: () => process.env.TRILIUM_SYNC_SERVER_HOST || get("syncServerHost"), + getSyncServerHost: () => get("syncServerHost"), isSyncSetup: () => { const syncServerHost = get("syncServerHost"); From 5c7c9955044ce1fd584ba21dd1f5598584b5dc48 Mon Sep 17 00:00:00 2001 From: perf3ct Date: Wed, 22 Jan 2025 20:37:24 +0000 Subject: [PATCH 08/11] feat: have docker_healthcheck use correct config --- docker_healthcheck.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker_healthcheck.ts b/docker_healthcheck.ts index 2a2635db2..9e1cc705d 100755 --- a/docker_healthcheck.ts +++ b/docker_healthcheck.ts @@ -2,7 +2,7 @@ import http from "http"; import ini from "ini"; import fs from "fs"; import dataDir from "./src/services/data_dir.js"; -const config = ini.parse(fs.readFileSync(dataDir.CONFIG_INI_PATH, "utf-8")); +import config from "./src/services/config.js"; if (config.Network.https) { // built-in TLS (terminated by trilium) is not supported yet, PRs are welcome From 9cca9fe074b1895b2df0e9bf67290e559aecf985 Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Fri, 24 Jan 2025 00:12:50 +0100 Subject: [PATCH 09/11] feat(config-sample): add Sync config block to config-sample commented out --- config-sample.ini | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config-sample.ini b/config-sample.ini index d419ed473..039a78516 100644 --- a/config-sample.ini +++ b/config-sample.ini @@ -27,3 +27,8 @@ keyPath= # once set, expressjs will use the X-Forwarded-For header set by the rev. proxy to determinate the real IPs of clients. # expressjs shortcuts are supported: loopback(127.0.0.1/8, ::1/128), linklocal(169.254.0.0/16, fe80::/10), uniquelocal(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7) trustedReverseProxy=false + +[Sync] +#syncServerHost= +#syncServerTimeout= +#syncProxy= \ No newline at end of file From 2c2a40405646aa97e92259489a2a0b841a928adb Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Fri, 24 Jan 2025 07:45:47 +0100 Subject: [PATCH 10/11] feat(services/config): rename syncProxy to syncServerProxy for naming consistency backwards compatibility ensured, by still checking the iniConfig for the old value first --- config-sample.ini | 2 +- src/services/config.ts | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/config-sample.ini b/config-sample.ini index 039a78516..90c7fa17e 100644 --- a/config-sample.ini +++ b/config-sample.ini @@ -31,4 +31,4 @@ trustedReverseProxy=false [Sync] #syncServerHost= #syncServerTimeout= -#syncProxy= \ No newline at end of file +#syncServerProxy= \ No newline at end of file diff --git a/src/services/config.ts b/src/services/config.ts index c851503d0..dbbf644b5 100644 --- a/src/services/config.ts +++ b/src/services/config.ts @@ -83,10 +83,9 @@ const config: TriliumConfig = { syncServerTimeout: process.env.TRILIUM_SYNC_SERVER_TIMEOUT || iniConfig?.Sync?.syncServerTimeout || "120000", - // @TriliumNextTODO: check if we can rename misnamed syncProxy to syncServerProxy without - // breaking backwards compatibility - for naming consistency syncProxy: - process.env.TRILIUM_SYNC_SERVER_PROXY || iniConfig?.Sync?.syncProxy || "" + // additionally checking in iniConfig for inconsistently named syncProxy for backwards compatibility + process.env.TRILIUM_SYNC_SERVER_PROXY || iniConfig?.Sync?.syncProxy || iniConfig?.Sync?.syncServerProxy || "" } }; From 8472e44fe62137a05199947a9b3c43e07e72baa5 Mon Sep 17 00:00:00 2001 From: Panagiotis Papadopoulos Date: Fri, 24 Jan 2025 07:46:39 +0100 Subject: [PATCH 11/11] chore(docker_healthcheck): remove now unused imports --- docker_healthcheck.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/docker_healthcheck.ts b/docker_healthcheck.ts index 9e1cc705d..262dc3ef2 100755 --- a/docker_healthcheck.ts +++ b/docker_healthcheck.ts @@ -1,7 +1,4 @@ import http from "http"; -import ini from "ini"; -import fs from "fs"; -import dataDir from "./src/services/data_dir.js"; import config from "./src/services/config.js"; if (config.Network.https) {