From 045d0b6d055bb76ffba11576bc7582e91b4e51aa Mon Sep 17 00:00:00 2001 From: Rory& Date: Thu, 4 Jul 2024 19:58:30 +0200 Subject: Client readers --- .../services/matrix/synapse/synapse-main.nix | 1 + .../matrix/synapse/workers/client-reader.nix | 121 +++++++++++++++++++++ .../services/matrix/synapse/workers/module.nix | 5 + 3 files changed, 127 insertions(+) create mode 100644 host/Rory-nginx/services/matrix/synapse/workers/client-reader.nix diff --git a/host/Rory-nginx/services/matrix/synapse/synapse-main.nix b/host/Rory-nginx/services/matrix/synapse/synapse-main.nix index 66292a3..cdbb6b7 100755 --- a/host/Rory-nginx/services/matrix/synapse/synapse-main.nix +++ b/host/Rory-nginx/services/matrix/synapse/synapse-main.nix @@ -18,6 +18,7 @@ federationSenders = 32; pushers = 2; mediaRepoWorkers = 8; + clientReaders = 16; enableAppserviceWorker = true; enableBackgroundWorker = true; diff --git a/host/Rory-nginx/services/matrix/synapse/workers/client-reader.nix b/host/Rory-nginx/services/matrix/synapse/workers/client-reader.nix new file mode 100644 index 0000000..c6a4c44 --- /dev/null +++ b/host/Rory-nginx/services/matrix/synapse/workers/client-reader.nix @@ -0,0 +1,121 @@ +{ + config, + pkgs, + lib, + ... +}: + +let + cfg = config.services.matrix-synapse; + workers = lib.range 0 (cfg.clientReaders - 1); + routes = [ + "~ ^/_matrix/client/(api/v1|r0|v3|unstable)/publicRooms$" + "~ ^/_matrix/client/(api/v1|r0|v3|unstable)/rooms/.*/joined_members$" + "~ ^/_matrix/client/(api/v1|r0|v3|unstable)/rooms/.*/context/.*$" + "~ ^/_matrix/client/(api/v1|r0|v3|unstable)/rooms/.*/members$" + "~ ^/_matrix/client/(api/v1|r0|v3|unstable)/rooms/.*/state$" + "~ ^/_matrix/client/v1/rooms/.*/hierarchy$" + "~ ^/_matrix/client/(v1|unstable)/rooms/.*/relations/" + "~ ^/_matrix/client/v1/rooms/.*/threads$" + "~ ^/_matrix/client/(api/v1|r0|v3|unstable)/login$" + "~ ^/_matrix/client/(api/v1|r0|v3|unstable)/account/3pid$" + "~ ^/_matrix/client/(api/v1|r0|v3|unstable)/account/whoami$" + "~ ^/_matrix/client/versions$" + "~ ^/_matrix/client/(api/v1|r0|v3|unstable)/voip/turnServer$" + "~ ^/_matrix/client/(r0|v3|unstable)/register$" + "~ ^/_matrix/client/(r0|v3|unstable)/register/available$" + "~ ^/_matrix/client/(r0|v3|unstable)/auth/.*/fallback/web$" + "~ ^/_matrix/client/(api/v1|r0|v3|unstable)/rooms/.*/messages$" + "~ ^/_matrix/client/(api/v1|r0|v3|unstable)/rooms/.*/event" + "~ ^/_matrix/client/(api/v1|r0|v3|unstable)/joined_rooms" + "~ ^/_matrix/client/(api/v1|r0|v3|unstable/.*)/rooms/.*/aliases" + "~ ^/_matrix/client/v1/rooms/.*/timestamp_to_event$" + "~ ^/_matrix/client/(api/v1|r0|v3|unstable)/search" + "~ ^/_matrix/client/(r0|v3|unstable)/user/.*/filter(/|$)" + "~ ^/_matrix/client/(r0|v3|unstable)/password_policy$" + "~ ^/_matrix/client/(api/v1|r0|v3|unstable)/directory/room/.*$" + "~ ^/_matrix/client/(r0|v3|unstable)/capabilities$" + "~ ^/_matrix/client/(r0|v3|unstable)/notifications$" + ]; +in +{ + config = lib.mkIf (cfg.clientReaders > 0) { + services.matrix-synapse = { + settings = { + instance_map = lib.listToAttrs ( + lib.map (index: { + name = "client_reader-${toString index}"; + value = { + path = "/run/matrix-synapse/client_reader-${toString index}.sock"; + }; + }) workers + ); + + media_instance_running_background_jobs = "client_reader-0"; + enable_client_reader = false; + }; + + workers = lib.listToAttrs ( + lib.map (index: { + name = "client_reader-${toString index}"; + value = { + worker_app = "synapse.app.generic_worker"; + worker_listeners = [ + { + type = "http"; + path = "/run/matrix-synapse/client_reader-${toString index}.sock"; + resources = [ + { + names = [ "replication" ]; + compress = false; + } + ]; + } + { + type = "http"; + path = "/run/matrix-synapse/client_reader-client-${toString index}.sock"; + mode = "666"; + resources = [ + { + names = [ "client" ]; + compress = false; + } + ]; + } + ]; + database = ( + import ../db.nix { + workerName = "client_reader-${toString index}"; + dbGroup = "small"; + } + ); + enable_client_reader = true; + }; + }) workers + ); + }; + + services.nginx.upstreams."client_reader" = { + extraConfig = '' + keepalive 32; + ''; + servers = lib.listToAttrs ( + lib.map (index: { + name = "unix:/run/matrix-synapse/client_reader-client-${toString index}.sock"; + value = { + max_fails = 0; + }; + }) workers + ); + }; + + services.nginx.virtualHosts."${cfg.nginxVirtualHostName}".locations = lib.listToAttrs ( + lib.map (route: { + name = route; + value = { + proxyPass = "http://client_reader"; + }; + }) routes + ); + }; +} diff --git a/host/Rory-nginx/services/matrix/synapse/workers/module.nix b/host/Rory-nginx/services/matrix/synapse/workers/module.nix index 080f524..2ab1d10 100644 --- a/host/Rory-nginx/services/matrix/synapse/workers/module.nix +++ b/host/Rory-nginx/services/matrix/synapse/workers/module.nix @@ -73,6 +73,11 @@ in default = 0; description = "Number of sync workers"; }; + clientReaders = lib.mkOption { + type = lib.types.int; + default = 0; + description = "Number of client readers"; + }; nginxVirtualHostName = lib.mkOption { type = lib.types.str; -- cgit 1.4.1