Federation readers
4 files changed, 217 insertions, 0 deletions
diff --git a/host/Rory-nginx/services/matrix/synapse/synapse-main.nix b/host/Rory-nginx/services/matrix/synapse/synapse-main.nix
index cdbb6b7..42a880d 100755
--- a/host/Rory-nginx/services/matrix/synapse/synapse-main.nix
+++ b/host/Rory-nginx/services/matrix/synapse/synapse-main.nix
@@ -20,6 +20,9 @@
mediaRepoWorkers = 8;
clientReaders = 16;
+ federationReaders = 16;
+ federationInboundWorkers = 16;
+
enableAppserviceWorker = true;
enableBackgroundWorker = true;
enableUserDirWorker = true;
diff --git a/host/Rory-nginx/services/matrix/synapse/workers/federation-inbound.nix b/host/Rory-nginx/services/matrix/synapse/workers/federation-inbound.nix
new file mode 100644
index 0000000..c2c84ec
--- /dev/null
+++ b/host/Rory-nginx/services/matrix/synapse/workers/federation-inbound.nix
@@ -0,0 +1,91 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+
+let
+ cfg = config.services.matrix-synapse;
+ workers = lib.range 0 (cfg.federationReaders - 1);
+ routes = [
+ "~ /_matrix/federation/(v1|v2)/send/"
+ ];
+in
+{
+ config = lib.mkIf (cfg.federationInboundWorkers > 0) {
+ services.matrix-synapse = {
+ settings = {
+ instance_map = lib.listToAttrs (
+ lib.map (index: {
+ name = "federation_inbound-${toString index}";
+ value = {
+ path = "/run/matrix-synapse/federation_inbound-${toString index}.sock";
+ };
+ }) workers
+ );
+ };
+
+ workers = lib.listToAttrs (
+ lib.map (index: {
+ name = "federation_inbound-${toString index}";
+ value = {
+ worker_app = "synapse.app.generic_worker";
+ worker_listeners = [
+ {
+ type = "http";
+ path = "/run/matrix-synapse/federation_inbound-${toString index}.sock";
+ resources = [
+ {
+ names = [ "replication" ];
+ compress = false;
+ }
+ ];
+ }
+ {
+ type = "http";
+ path = "/run/matrix-synapse/federation_inbound-federation-${toString index}.sock";
+ mode = "666";
+ resources = [
+ {
+ names = [ "federation" ];
+ compress = false;
+ }
+ ];
+ }
+ ];
+ database = (
+ import ../db.nix {
+ workerName = "federation_inbound-${toString index}";
+ dbGroup = "medium";
+ }
+ );
+ };
+ }) workers
+ );
+ };
+
+ services.nginx.upstreams."federation_inbound" = {
+ extraConfig = ''
+ keepalive 32;
+ '';
+ servers = lib.listToAttrs (
+ lib.map (index: {
+ name = "unix:/run/matrix-synapse/federation_inbound-federation-${toString index}.sock";
+ value = {
+ max_fails = 0;
+ };
+ }) workers
+ );
+ };
+
+ services.nginx.virtualHosts."${cfg.nginxVirtualHostName}".locations = lib.listToAttrs (
+ lib.map (route: {
+ name = route;
+ value = {
+ proxyPass = "http://federation_inbound";
+ };
+ }) routes
+ );
+ };
+}
diff --git a/host/Rory-nginx/services/matrix/synapse/workers/federation-reader.nix b/host/Rory-nginx/services/matrix/synapse/workers/federation-reader.nix
new file mode 100644
index 0000000..e48ba05
--- /dev/null
+++ b/host/Rory-nginx/services/matrix/synapse/workers/federation-reader.nix
@@ -0,0 +1,111 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+
+let
+ cfg = config.services.matrix-synapse;
+ workers = lib.range 0 (cfg.federationReaders - 1);
+ routes = [
+ "~ ^/_matrix/federation/(v1|v2)/event/"
+ "~ ^/_matrix/federation/(v1|v2)/state/"
+ "~ ^/_matrix/federation/(v1|v2)/state_ids/"
+ "~ ^/_matrix/federation/(v1|v2)/backfill/"
+ "~ ^/_matrix/federation/(v1|v2)/get_missing_events/"
+ "~ ^/_matrix/federation/(v1|v2)/publicRooms"
+ "~ ^/_matrix/federation/(v1|v2)/query/"
+ "~ ^/_matrix/federation/(v1|v2)/make_join/"
+ "~ ^/_matrix/federation/(v1|v2)/make_leave/"
+ "~ ^/_matrix/federation/(v1|v2)/send_join/"
+ "~ ^/_matrix/federation/(v1|v2)/send_leave/"
+ "~ ^/_matrix/federation/v1/make_knock/"
+ "~ ^/_matrix/federation/v1/send_knock/"
+ "~ ^/_matrix/federation/(v1|v2)/invite/"
+ "~ ^/_matrix/federation/(v1|v2)/query_auth/"
+ "~ ^/_matrix/federation/(v1|v2)/event_auth/"
+ "~ ^/_matrix/federation/v1/timestamp_to_event/"
+ "~ ^/_matrix/federation/(v1|v2)/exchange_third_party_invite/"
+ "~ ^/_matrix/federation/(v1|v2)/user/devices/"
+ "~ ^/_matrix/federation/(v1|v2)/get_groups_publicised$"
+ "~ ^/_matrix/key/v2/query"
+ ];
+in
+{
+ config = lib.mkIf (cfg.federationReaders > 0) {
+ services.matrix-synapse = {
+ settings = {
+ instance_map = lib.listToAttrs (
+ lib.map (index: {
+ name = "federation_reader-${toString index}";
+ value = {
+ path = "/run/matrix-synapse/federation_reader-${toString index}.sock";
+ };
+ }) workers
+ );
+ };
+
+ workers = lib.listToAttrs (
+ lib.map (index: {
+ name = "federation_reader-${toString index}";
+ value = {
+ worker_app = "synapse.app.generic_worker";
+ worker_listeners = [
+ {
+ type = "http";
+ path = "/run/matrix-synapse/federation_reader-${toString index}.sock";
+ resources = [
+ {
+ names = [ "replication" ];
+ compress = false;
+ }
+ ];
+ }
+ {
+ type = "http";
+ path = "/run/matrix-synapse/federation_reader-federation-${toString index}.sock";
+ mode = "666";
+ resources = [
+ {
+ names = [ "federation" ];
+ compress = false;
+ }
+ ];
+ }
+ ];
+ database = (
+ import ../db.nix {
+ workerName = "federation_reader-${toString index}";
+ dbGroup = "medium";
+ }
+ );
+ };
+ }) workers
+ );
+ };
+
+ services.nginx.upstreams."federation_reader" = {
+ extraConfig = ''
+ keepalive 32;
+ '';
+ servers = lib.listToAttrs (
+ lib.map (index: {
+ name = "unix:/run/matrix-synapse/federation_reader-federation-${toString index}.sock";
+ value = {
+ max_fails = 0;
+ };
+ }) workers
+ );
+ };
+
+ services.nginx.virtualHosts."${cfg.nginxVirtualHostName}".locations = lib.listToAttrs (
+ lib.map (route: {
+ name = route;
+ value = {
+ proxyPass = "http://federation_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 ebe4732..1450d52 100644
--- a/host/Rory-nginx/services/matrix/synapse/workers/module.nix
+++ b/host/Rory-nginx/services/matrix/synapse/workers/module.nix
@@ -19,6 +19,8 @@ in
./appservice.nix
./background.nix
./client-reader.nix
+ ./federation-inbound.nix
+ ./federation-reader.nix
./federation-sender.nix
./media-repo.nix
./pusher.nix
@@ -79,6 +81,16 @@ in
default = 0;
description = "Number of client readers";
};
+ federationReaders = lib.mkOption {
+ type = lib.types.int;
+ default = 0;
+ description = "Number of federation readers";
+ };
+ federationInboundWorkers = lib.mkOption {
+ type = lib.types.int;
+ default = 0;
+ description = "Number of federation inbound workers";
+ };
nginxVirtualHostName = lib.mkOption {
type = lib.types.str;
|