revert Merge pull request 'Remove clanModules/*' (#4202) from remove-modules into main Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/4202 See: https://git.clan.lol/clan/clan-core/issues/4365 Not all modules are migrated. If they are not migrated, we need to write migration docs and please display the link to the migration docs
210 lines
6.5 KiB
Nix
210 lines
6.5 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}:
|
|
let
|
|
cfg = config.clan.matrix-synapse;
|
|
element-web =
|
|
pkgs.runCommand "element-web-with-config" { nativeBuildInputs = [ pkgs.buildPackages.jq ]; }
|
|
''
|
|
cp -r ${pkgs.element-web} $out
|
|
chmod -R u+w $out
|
|
jq '."default_server_config"."m.homeserver" = { "base_url": "https://${cfg.app_domain}:443", "server_name": "${cfg.server_tld}" }' \
|
|
> $out/config.json < ${pkgs.element-web}/config.json
|
|
ln -s $out/config.json $out/config.${cfg.app_domain}.json
|
|
'';
|
|
in
|
|
# FIXME: This was taken from upstream. Drop this when our patch is upstream
|
|
{
|
|
options.services.matrix-synapse.package = lib.mkOption { readOnly = false; };
|
|
options.clan.matrix-synapse = {
|
|
server_tld = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = "The address that is suffixed after your username i.e @alice:example.com";
|
|
example = "example.com";
|
|
};
|
|
|
|
app_domain = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = "The matrix server hostname also serves the element client";
|
|
example = "matrix.example.com";
|
|
};
|
|
|
|
users = lib.mkOption {
|
|
default = { };
|
|
type = lib.types.attrsOf (
|
|
lib.types.submodule (
|
|
{ name, ... }:
|
|
{
|
|
options = {
|
|
name = lib.mkOption {
|
|
type = lib.types.str;
|
|
default = name;
|
|
description = "The name of the user";
|
|
};
|
|
|
|
admin = lib.mkOption {
|
|
type = lib.types.bool;
|
|
default = false;
|
|
description = "Whether the user should be an admin";
|
|
};
|
|
};
|
|
}
|
|
)
|
|
);
|
|
description = "A list of users. Not that only new users will be created and existing ones are not modified.";
|
|
example.alice = {
|
|
admin = true;
|
|
};
|
|
};
|
|
};
|
|
imports = [
|
|
../postgresql
|
|
(lib.mkRemovedOptionModule [
|
|
"clan"
|
|
"matrix-synapse"
|
|
"enable"
|
|
] "Importing the module will already enable the service.")
|
|
../nginx
|
|
];
|
|
config = {
|
|
services.matrix-synapse = {
|
|
enable = true;
|
|
settings = {
|
|
server_name = cfg.server_tld;
|
|
database = {
|
|
args.user = "matrix-synapse";
|
|
args.database = "matrix-synapse";
|
|
name = "psycopg2";
|
|
};
|
|
turn_uris = [
|
|
"turn:turn.matrix.org?transport=udp"
|
|
"turn:turn.matrix.org?transport=tcp"
|
|
];
|
|
registration_shared_secret_path = "/run/synapse-registration-shared-secret";
|
|
listeners = [
|
|
{
|
|
port = 8008;
|
|
bind_addresses = [ "::1" ];
|
|
type = "http";
|
|
tls = false;
|
|
x_forwarded = true;
|
|
resources = [
|
|
{
|
|
names = [ "client" ];
|
|
compress = true;
|
|
}
|
|
{
|
|
names = [ "federation" ];
|
|
compress = false;
|
|
}
|
|
];
|
|
}
|
|
];
|
|
};
|
|
};
|
|
|
|
clan.postgresql.users.matrix-synapse = { };
|
|
clan.postgresql.databases.matrix-synapse.create.options = {
|
|
TEMPLATE = "template0";
|
|
LC_COLLATE = "C";
|
|
LC_CTYPE = "C";
|
|
ENCODING = "UTF8";
|
|
OWNER = "matrix-synapse";
|
|
};
|
|
clan.postgresql.databases.matrix-synapse.restore.stopOnRestore = [ "matrix-synapse" ];
|
|
|
|
clan.core.vars.generators =
|
|
{
|
|
"matrix-synapse" = {
|
|
files."synapse-registration_shared_secret" = { };
|
|
runtimeInputs = with pkgs; [
|
|
coreutils
|
|
pwgen
|
|
];
|
|
migrateFact = "matrix-synapse";
|
|
script = ''
|
|
echo -n "$(pwgen -s 32 1)" > "$out"/synapse-registration_shared_secret
|
|
'';
|
|
};
|
|
}
|
|
// lib.mapAttrs' (
|
|
name: user:
|
|
lib.nameValuePair "matrix-password-${user.name}" {
|
|
files."matrix-password-${user.name}" = { };
|
|
migrateFact = "matrix-password-${user.name}";
|
|
runtimeInputs = with pkgs; [ xkcdpass ];
|
|
script = ''
|
|
xkcdpass -n 4 -d - > "$out"/${lib.escapeShellArg "matrix-password-${user.name}"}
|
|
'';
|
|
}
|
|
) cfg.users;
|
|
|
|
systemd.services.matrix-synapse =
|
|
let
|
|
usersScript =
|
|
''
|
|
while ! ${pkgs.netcat}/bin/nc -z -v ::1 8008; do
|
|
if ! kill -0 "$MAINPID"; then exit 1; fi
|
|
sleep 1;
|
|
done
|
|
''
|
|
+ lib.concatMapStringsSep "\n" (user: ''
|
|
# only create user if it doesn't exist
|
|
/run/current-system/sw/bin/matrix-synapse-register_new_matrix_user --exists-ok --password-file ${
|
|
config.clan.core.vars.generators."matrix-password-${user.name}".files."matrix-password-${user.name}".path
|
|
} --user "${user.name}" ${if user.admin then "--admin" else "--no-admin"}
|
|
'') (lib.attrValues cfg.users);
|
|
in
|
|
{
|
|
path = [ pkgs.curl ];
|
|
serviceConfig.ExecStartPre = lib.mkBefore [
|
|
"+${pkgs.coreutils}/bin/install -o matrix-synapse -g matrix-synapse ${
|
|
lib.escapeShellArg
|
|
config.clan.core.vars.generators.matrix-synapse.files."synapse-registration_shared_secret".path
|
|
} /run/synapse-registration-shared-secret"
|
|
];
|
|
serviceConfig.ExecStartPost = [
|
|
''+${pkgs.writeShellScript "matrix-synapse-create-users" usersScript}''
|
|
];
|
|
};
|
|
|
|
services.nginx = {
|
|
enable = true;
|
|
virtualHosts = {
|
|
"${cfg.server_tld}" = {
|
|
locations."= /.well-known/matrix/server".extraConfig = ''
|
|
add_header Content-Type application/json;
|
|
return 200 '${builtins.toJSON { "m.server" = "${cfg.app_domain}:443"; }}';
|
|
'';
|
|
locations."= /.well-known/matrix/client".extraConfig = ''
|
|
add_header Content-Type application/json;
|
|
add_header Access-Control-Allow-Origin *;
|
|
return 200 '${
|
|
builtins.toJSON {
|
|
"m.homeserver" = {
|
|
"base_url" = "https://${cfg.app_domain}";
|
|
};
|
|
"m.identity_server" = {
|
|
"base_url" = "https://vector.im";
|
|
};
|
|
}
|
|
}';
|
|
'';
|
|
forceSSL = true;
|
|
enableACME = true;
|
|
};
|
|
"${cfg.app_domain}" = {
|
|
forceSSL = true;
|
|
enableACME = true;
|
|
locations."/".root = element-web;
|
|
locations."/_matrix".proxyPass = "http://localhost:8008"; # TODO: We should make the port configurable
|
|
locations."/_synapse".proxyPass = "http://localhost:8008";
|
|
};
|
|
};
|
|
};
|
|
};
|
|
}
|