summary refs log tree commit diff
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2024-07-04 19:09:51 +0200
committerRory& <root@rory.gay>2024-07-04 19:09:51 +0200
commit5e2dafaa19109ac3ce9a941408c85acf85e902ed (patch)
tree3a31ea6b0568c3b7a746437b1d466c196cb6db73
parentfixx (diff)
downloadRory-Open-Architecture-5e2dafaa19109ac3ce9a941408c85acf85e902ed.tar.xz
More workers?
-rwxr-xr-xhost/Rory-nginx/services/matrix/synapse/synapse-main.nix5
-rw-r--r--host/Rory-nginx/services/matrix/synapse/workers/media-repo.nix100
-rw-r--r--host/Rory-nginx/services/matrix/synapse/workers/module.nix13
-rw-r--r--host/Rory-nginx/services/matrix/synapse/workers/sync.nix98
4 files changed, 215 insertions, 1 deletions
diff --git a/host/Rory-nginx/services/matrix/synapse/synapse-main.nix b/host/Rory-nginx/services/matrix/synapse/synapse-main.nix
index 82e9eef..66292a3 100755
--- a/host/Rory-nginx/services/matrix/synapse/synapse-main.nix
+++ b/host/Rory-nginx/services/matrix/synapse/synapse-main.nix
@@ -17,10 +17,13 @@
     nginxVirtualHostName = "matrix.rory.gay";
     federationSenders = 32;
     pushers = 2;
-    enableStreamWriters = false;
+    mediaRepoWorkers = 8;
+
     enableAppserviceWorker = true;
     enableBackgroundWorker = true;
     enableUserDirWorker = true;
+
+    enableStreamWriters = false;
     #eventStreamWriters = 8;
 
     # https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html
diff --git a/host/Rory-nginx/services/matrix/synapse/workers/media-repo.nix b/host/Rory-nginx/services/matrix/synapse/workers/media-repo.nix
new file mode 100644
index 0000000..ec07eb0
--- /dev/null
+++ b/host/Rory-nginx/services/matrix/synapse/workers/media-repo.nix
@@ -0,0 +1,100 @@
+{
+  config,
+  pkgs,
+  lib,
+  ...
+}:
+
+let
+  cfg = config.services.matrix-synapse;
+  workers = lib.range 0 (cfg.mediaRepoWorkers - 1);
+  routes = [
+    "~ ^/_matrix/media/"
+    "~ ^/_synapse/admin/v1/purge_media_cache$"
+    "~ ^/_synapse/admin/v1/room/.*/media.*$"
+    "~ ^/_synapse/admin/v1/user/.*/media.*$"
+    "~ ^/_synapse/admin/v1/media/.*$"
+    "~ ^/_synapse/admin/v1/quarantine_media/.*$"
+  ];
+in
+{
+  config = lib.mkIf (cfg.mediaRepoWorkers > 0) {
+    services.matrix-synapse = {
+      settings = {
+        instance_map = lib.listToAttrs (
+          lib.map (index: {
+            name = "media_repo-${toString index}";
+            value = {
+              path = "/run/matrix-synapse/media_repo-${toString index}.sock";
+            };
+          }) workers
+        );
+
+        media_instance_running_background_jobs = "media_repo-0";
+        enable_media_repo = false;
+      };
+
+      workers = lib.listToAttrs (
+        lib.map (index: {
+          name = "media_repo-${toString index}";
+          value = {
+            worker_app = "synapse.app.generic_worker";
+            worker_listeners = [
+              {
+                type = "http";
+                path = "/run/matrix-synapse/media_repo-${toString index}.sock";
+                resources = [
+                  {
+                    names = [ "replication" ];
+                    compress = false;
+                  }
+                ];
+              }
+              {
+                type = "http";
+                path = "/run/matrix-synapse/media_repo-media-${toString index}.sock";
+                mode = "666";
+                resources = [
+                  {
+                    names = [ "media" ];
+                    compress = false;
+                  }
+                ];
+              }
+            ];
+            database = (
+              import ../db.nix {
+                workerName = "media_repo-${toString index}";
+                dbGroup = "small";
+              }
+            );
+            enable_media_repo = true;
+          };
+        }) workers
+      );
+    };
+
+    services.nginx.upstreams."media_repo" = {
+      extraConfig = ''
+        keepalive 32;
+      '';
+      servers = lib.listToAttrs (
+        lib.map (index: {
+          name = "unix:/run/matrix-synapse/media_repo-media-${toString index}.sock";
+          value = {
+            max_fails = 0;
+          };
+        }) workers
+      );
+    };
+
+    services.nginx.virtualHosts."${cfg.nginxVirtualHostName}".locations = lib.listToAttrs (
+      lib.map (route: {
+        name = route;
+        value = {
+          proxyPass = "http://media_repo";
+        };
+      }) routes
+    );
+  };
+}
diff --git a/host/Rory-nginx/services/matrix/synapse/workers/module.nix b/host/Rory-nginx/services/matrix/synapse/workers/module.nix
index 84b8a87..080f524 100644
--- a/host/Rory-nginx/services/matrix/synapse/workers/module.nix
+++ b/host/Rory-nginx/services/matrix/synapse/workers/module.nix
@@ -19,8 +19,11 @@ in
     ./appservice.nix
     ./background.nix
     ./federation-sender.nix
+    ./media-repo.nix
     ./pusher.nix
+    ./sync.nix
     ./user-dir.nix
+
     ./stream-writers/event-stream-writer.nix
   ];
   options.services.matrix-synapse =
@@ -60,6 +63,16 @@ in
         default = 0;
         description = "Number of pushers";
       };
+      mediaRepoWorkers = lib.mkOption {
+        type = lib.types.int;
+        default = 0;
+        description = "Number of media repo workers";
+      };
+      syncWorkers = lib.mkOption {
+        type = lib.types.int;
+        default = 0;
+        description = "Number of sync workers";
+      };
 
       nginxVirtualHostName = lib.mkOption {
         type = lib.types.str;
diff --git a/host/Rory-nginx/services/matrix/synapse/workers/sync.nix b/host/Rory-nginx/services/matrix/synapse/workers/sync.nix
new file mode 100644
index 0000000..d409d54
--- /dev/null
+++ b/host/Rory-nginx/services/matrix/synapse/workers/sync.nix
@@ -0,0 +1,98 @@
+{
+  config,
+  pkgs,
+  lib,
+  ...
+}:
+
+let
+  cfg = config.services.matrix-synapse;
+  workers = lib.range 0 (cfg.syncWorkers - 1);
+  routes = [
+    "~ ^/_matrix/client/(v2_alpha|r0|v3)/sync$"
+    "~ ^/_matrix/client/(api/v1|v2_alpha|r0|v3)/events$"
+    "~ ^/_matrix/client/(api/v1|r0|v3)/initialSync$"
+    "~ ^/_matrix/client/(api/v1|r0|v3)/rooms/[^/]+/initialSync$"
+  ];
+in
+{
+  config = lib.mkIf (cfg.syncWorkers > 0) {
+    services.matrix-synapse = {
+      settings = {
+        instance_map = lib.listToAttrs (
+          lib.map (index: {
+            name = "sync-${toString index}";
+            value = {
+              path = "/run/matrix-synapse/sync-${toString index}.sock";
+            };
+          }) workers
+        );
+
+        media_instance_running_background_jobs = "sync-0";
+        enable_sync = false;
+      };
+
+      workers = lib.listToAttrs (
+        lib.map (index: {
+          name = "sync-${toString index}";
+          value = {
+            worker_app = "synapse.app.generic_worker";
+            worker_listeners = [
+              {
+                type = "http";
+                path = "/run/matrix-synapse/sync-${toString index}.sock";
+                resources = [
+                  {
+                    names = [ "replication" ];
+                    compress = false;
+                  }
+                ];
+              }
+              {
+                type = "http";
+                path = "/run/matrix-synapse/sync-client-${toString index}.sock";
+                mode = "666";
+                resources = [
+                  {
+                    names = [ "client" ];
+                    compress = false;
+                  }
+                ];
+              }
+            ];
+            database = (
+              import ../db.nix {
+                workerName = "sync-${toString index}";
+                dbGroup = "small";
+              }
+            );
+            enable_sync = true;
+          };
+        }) workers
+      );
+    };
+
+    services.nginx.upstreams."sync" = {
+      extraConfig = ''
+        keepalive 32;
+      '';
+      servers = lib.listToAttrs (
+        lib.map (index: {
+          name = "unix:/run/matrix-synapse/sync-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://sync";
+        };
+      }) routes
+    );
+  };
+}