nixos/synapse: add options to configure workers

This commit is contained in:
Sophie Tauchert 2023-07-06 22:42:36 +02:00
parent b329180128
commit 72a26e2b54
No known key found for this signature in database
GPG Key ID: 52701DE5F5F51125
2 changed files with 93 additions and 8 deletions

View File

@ -242,6 +242,8 @@
Unfortunately all servers supporting new clients (newer version of anki-sync-server, anki's built in sync server and this new rust package) do not support the older sync protocol that was used in the old server, so such old clients will also need updating and in particular the anki package in nixpkgs is also being updated in this release.
The module update takes care of the new config syntax and the data itself (user login and cards) are compatible, so users of the module will be able to just log in again after updating both client and server without any extra action.
- `services.matrix-synapse` has new options to configure worker processes for matrix-synapse using `services.matrix-synapse.workers.enable` and `services.matrix-synapse.workers.config`. It's also now possible to configure a local redis server using `services.matrix-synapse.configureRedisLocally`.
- `services.nginx` gained a `defaultListen` option at server-level with support for PROXY protocol listeners, also `proxyProtocol` is now exposed in `services.nginx.virtualHosts.<name>.listen` option. It is now possible to run PROXY listeners and non-PROXY listeners at a server-level, see [#213510](https://github.com/NixOS/nixpkgs/pull/213510/) for more details.
- `services.restic.backups` now adds wrapper scripts to your system path, which set the same environment variables as the service, so restic operations can easly be run from the command line. This behavior can be disabled by setting `createWrapper` to `false`, per backup configuration.

View File

@ -10,13 +10,10 @@ let
finalSettings = lib.filterAttrsRecursive (_: v: v != null) cfg.settings;
configFile = format.generate "homeserver.yaml" finalSettings;
pluginsEnv = cfg.package.python.buildEnv.override {
extraLibs = cfg.plugins;
};
usePostgresql = cfg.settings.database.name == "psycopg2";
hasLocalPostgresDB = let args = cfg.settings.database.args; in
usePostgresql && (!(args ? host) || (elem args.host [ "localhost" "127.0.0.1" "::1" ]));
hasWorkers = cfg.workers.enable && (cfg.workers.config != { });
registerNewMatrixUser =
let
@ -758,6 +755,45 @@ in {
};
};
workers = lib.mkOption {
default = { };
description = lib.mdDoc ''
Options for configuring workers. See `services.matrix-synapse.workers.enable`
for a more detailed description.
'';
type = types.submodule {
options = {
enable = lib.mkOption {
type = types.bool;
default = false;
description = lib.mdDoc ''
Whether to enable matrix synapse workers
'';
};
config = lib.mkOption {
type = types.attrsOf (types.submodule {
freeformType = format.type;
options = {
worker_listeners = lib.mkOption {
default = [ ];
type = types.listOf listenerType;
description = lib.mdDoc ''
List of ports that this worker should listen on, their purpose and their configuration.
'';
};
};
});
default = { };
description = lib.mdDoc ''
List of workers to configure. See the
[worker documention](https://matrix-org.github.io/synapse/latest/workers.html#worker-configuration)
for possible values.
'';
};
};
};
};
extraConfigFiles = mkOption {
type = types.listOf types.path;
default = [ ];
@ -800,6 +836,13 @@ in {
For further information about this update, please read the release-notes of 20.03 carefully.
'';
}
{
assertion = hasWorkers -> cfg.settings.redis.enabled;
message = ''
Workers for matrix-synapse require configuring a redis instance. This can be done
automatically by setting `services.matrix-synapse.configureRedisLocally = true`.
'';
}
];
services.matrix-synapse.settings.redis = lib.mkIf cfg.configureRedisLocally {
@ -825,11 +868,26 @@ in {
gid = config.ids.gids.matrix-synapse;
};
systemd.targets.matrix-synapse = lib.mkIf hasWorkers {
description = "Synapse Matrix parent target";
after = [ "network.target" ] ++ optional hasLocalPostgresDB "postgresql.service";
wantedBy = [ "multi-user.target" ];
};
systemd.services =
let
targetConfig =
if hasWorkers
then {
partOf = [ "matrix-synapse.target" ];
wantedBy = [ "matrix-synapse.target" ];
unitConfig.ReloadPropagatedFrom = "matrix-synapse.target";
}
else {
after = [ "network.target" ] ++ optional hasLocalPostgresDB "postgresql.service";
wantedBy = [ "multi-user.target" ];
};
baseServiceConfig = {
after = [ "network.target" ] ++ optional hasLocalPostgresDB "postgresql.service";
wantedBy = [ "multi-user.target" ];
environment = optionalAttrs (cfg.withJemalloc) {
LD_PRELOAD = "${pkgs.jemalloc}/lib/libjemalloc.so";
};
@ -869,7 +927,31 @@ in {
SystemCallArchitectures = "native";
SystemCallFilter = [ "@system-service" "~@resources" "~@privileged" ];
};
};
}
// targetConfig;
genWorkerService = name: workerCfg:
let
finalWorkerCfg = workerCfg // { worker_name = name; };
workerConfigFile = format.generate "worker-${name}.yaml" finalWorkerCfg;
in
{
name = "matrix-synapse-worker-${name}";
value = lib.mkMerge [
baseServiceConfig
{
description = "Synapse Matrix worker ${name}";
# make sure the main process starts first for potential database migrations
after = [ "matrix-synapse.service" ];
serviceConfig = {
ExecStart = ''
${cfg.package}/bin/synapse_worker \
${ concatMapStringsSep "\n " (x: "--config-path ${x} \\") ([ configFile workerConfigFile ] ++ cfg.extraConfigFiles) }
--keys-directory ${cfg.dataDir}
'';
};
}
];
};
in
{
matrix-synapse = lib.mkMerge [
@ -897,7 +979,8 @@ in {
};
}
];
};
}
// (lib.mapAttrs' genWorkerService cfg.workers.config);
services.redis.servers.matrix-synapse = lib.mkIf cfg.configureRedisLocally {
enable = true;