2024-05-08 21:50:08 +02:00
|
|
|
{
|
|
|
|
lib,
|
|
|
|
config,
|
|
|
|
pkgs,
|
|
|
|
...
|
|
|
|
}:
|
2024-05-08 21:49:37 +02:00
|
|
|
let
|
|
|
|
inherit (config.networking) domain;
|
2024-05-11 22:55:59 +02:00
|
|
|
inherit (config.serverConfig) vhosts;
|
2024-05-08 21:50:08 +02:00
|
|
|
in
|
|
|
|
{
|
|
|
|
services.postgresql = {
|
2024-05-08 21:49:37 +02:00
|
|
|
enable = true;
|
|
|
|
# CREATE DATABASE synapse ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' template=template0 OWNER synapse;
|
|
|
|
ensureDatabases = [ "synapse" ];
|
|
|
|
package = pkgs.postgresql_15;
|
|
|
|
ensureUsers = [
|
|
|
|
{
|
|
|
|
name = "synapse";
|
|
|
|
ensureDBOwnership = true;
|
|
|
|
}
|
|
|
|
];
|
|
|
|
authentication = pkgs.lib.mkOverride 10 ''
|
2024-05-08 21:50:08 +02:00
|
|
|
#type database DBuser auth-method
|
|
|
|
local all postgres peer
|
|
|
|
local all all peer
|
|
|
|
host all all 127.0.0.1/32 md5
|
|
|
|
host synapse matrix-synapse ::1/128 md5
|
|
|
|
host nextcloud nextcloud ::1/128 md5
|
|
|
|
host all all ::1/128 md5
|
|
|
|
local replication all peer
|
|
|
|
host replication all 127.0.0.1/32 md5
|
|
|
|
host replication all ::1/128 md5
|
2024-05-08 21:49:37 +02:00
|
|
|
'';
|
|
|
|
identMap = ''
|
2024-05-08 21:50:08 +02:00
|
|
|
# ArbitraryMapName systemUser DBUser
|
|
|
|
superuser_map root postgres
|
|
|
|
superuser_map matrix-synapse synapse
|
|
|
|
superuser_map nextcloud nextcloud
|
|
|
|
superuser_map postgres postgres
|
|
|
|
# Let other names login as themselves
|
|
|
|
superuser_map /^(.*)$ \1
|
|
|
|
'';
|
2024-05-08 21:49:37 +02:00
|
|
|
};
|
|
|
|
|
2024-05-08 21:50:08 +02:00
|
|
|
systemd.services.postgresql.postStart =
|
|
|
|
let
|
|
|
|
password_file_path = config.age.secrets.synapse_db_pass.path;
|
|
|
|
in
|
|
|
|
''
|
|
|
|
$PSQL -tA <<'EOF'
|
|
|
|
DO $$
|
|
|
|
DECLARE password TEXT;
|
|
|
|
BEGIN
|
|
|
|
password := trim(both from replace(pg_read_file('${password_file_path}'), E'\n', '''));
|
|
|
|
EXECUTE format('ALTER ROLE synapse WITH PASSWORD '''%s''';', password);
|
|
|
|
END $$;
|
|
|
|
EOF
|
|
|
|
'';
|
2024-05-08 21:49:37 +02:00
|
|
|
|
|
|
|
services.matrix-synapse-next = {
|
|
|
|
enable = true;
|
|
|
|
|
|
|
|
workers.federationSenders = 1;
|
|
|
|
workers.federationReceivers = 1;
|
|
|
|
workers.initialSyncers = 1;
|
|
|
|
workers.normalSyncers = 1;
|
|
|
|
workers.eventPersisters = 2;
|
|
|
|
workers.useUserDirectoryWorker = true;
|
|
|
|
mainLogConfig = ./matrix_synapse_log_config.yaml;
|
|
|
|
|
|
|
|
enableNginx = true;
|
|
|
|
enableSlidingSync = false;
|
|
|
|
|
|
|
|
settings = {
|
|
|
|
suppress_key_server_warning = true;
|
|
|
|
server_name = domain;
|
|
|
|
public_baseurl = "https://${domain}";
|
|
|
|
enable_registration = true;
|
|
|
|
registration_requires_token = true;
|
|
|
|
registration_shared_secret_path = config.age.secrets.synapse_registration_shared_secret.path;
|
2024-05-09 14:55:02 +02:00
|
|
|
# enable_registration_without_verification = true;
|
|
|
|
# mainLogConfig = ./matrix_synapse_log_config.yaml;
|
2024-05-08 21:49:37 +02:00
|
|
|
|
2024-05-09 14:55:02 +02:00
|
|
|
# registrations_require_3pid = [ "email" ];
|
2024-05-08 21:49:37 +02:00
|
|
|
|
|
|
|
database = {
|
|
|
|
name = "psycopg2";
|
|
|
|
args = {
|
|
|
|
host = "localhost";
|
2024-05-09 14:57:35 +02:00
|
|
|
port = config.services.postgresql.settings.port;
|
2024-05-08 21:49:37 +02:00
|
|
|
dbname = "synapse";
|
|
|
|
user = "synapse";
|
|
|
|
cp_min = 5;
|
|
|
|
cp_max = 10;
|
|
|
|
client_encoding = "auto";
|
|
|
|
passfile = config.age.secrets.synapse_db_pass_prepared.path;
|
|
|
|
};
|
|
|
|
};
|
2024-05-08 21:50:08 +02:00
|
|
|
};
|
2024-05-08 21:49:37 +02:00
|
|
|
};
|
|
|
|
services.redis.servers."".enable = true;
|
|
|
|
|
|
|
|
age.secrets.synapse_db_pass = {
|
|
|
|
file = ../secrets/synapse_db_pass.age;
|
|
|
|
owner = "postgres";
|
|
|
|
group = "postgres";
|
|
|
|
};
|
|
|
|
age.secrets.synapse_db_pass_prepared = {
|
|
|
|
file = ../secrets/synapse_db_pass_prepared.age;
|
|
|
|
owner = "matrix-synapse";
|
|
|
|
group = "matrix-synapse";
|
|
|
|
mode = "0600";
|
|
|
|
};
|
|
|
|
age.secrets.synapse_registration_shared_secret = {
|
|
|
|
file = ../secrets/synapse_registration_shared_secret.age;
|
|
|
|
owner = "matrix-synapse";
|
|
|
|
group = "matrix-synapse";
|
|
|
|
mode = "0600";
|
|
|
|
};
|
|
|
|
|
|
|
|
environment.systemPackages = with pkgs; [
|
|
|
|
matrix-synapse-tools.synadm
|
|
|
|
matrix-synapse
|
|
|
|
];
|
|
|
|
|
|
|
|
services.nginx = {
|
|
|
|
enable = true;
|
|
|
|
virtualHosts."${domain}" = {
|
|
|
|
forceSSL = true;
|
2024-05-09 14:55:02 +02:00
|
|
|
enableACME = lib.mkForce false; # use the cert above, not some weird one that matrix-synapse module supplies
|
2024-05-08 21:49:37 +02:00
|
|
|
useACMEHost = domain;
|
|
|
|
locations."/.well-known/matrix/server" = {
|
2024-05-09 14:55:02 +02:00
|
|
|
return = "200 '{\"m.server\":\"${vhosts.matrix_host.host}:443\"}'";
|
2024-05-08 21:49:37 +02:00
|
|
|
extraConfig = ''
|
2024-05-08 21:50:08 +02:00
|
|
|
default_type application/json;
|
|
|
|
add_header Access-Control-Allow-Origin *;
|
|
|
|
add_header Accept-Ranges bytes;'';
|
2024-05-08 21:49:37 +02:00
|
|
|
};
|
|
|
|
locations."/.well-known/matrix/client" = {
|
2024-05-09 14:55:02 +02:00
|
|
|
return = "200 '{\"m.homeserver\": {\"base_url\": \"https://${vhosts.matrix_host.host}\"}}'";
|
2024-05-08 21:49:37 +02:00
|
|
|
extraConfig = ''
|
2024-05-08 21:50:08 +02:00
|
|
|
add_header Access-Control-Allow-Origin *;
|
|
|
|
default_type application/json;
|
|
|
|
'';
|
2024-05-08 21:49:37 +02:00
|
|
|
};
|
|
|
|
locations."/_matrix" = {
|
|
|
|
proxyPass = "http://$synapse_backend";
|
|
|
|
extraConfig = ''
|
|
|
|
add_header X-debug-backend $synapse_backend;
|
|
|
|
add_header X-debug-group $synapse_uri_group;
|
|
|
|
client_max_body_size ${config.services.matrix-synapse-next.settings.max_upload_size};
|
|
|
|
proxy_read_timeout 10m;
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
locations."~ ^/_matrix/client/(r0|v3)/sync$" = {
|
|
|
|
proxyPass = "http://$synapse_backend";
|
|
|
|
extraConfig = ''
|
|
|
|
proxy_read_timeout 1h;
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
locations."~ ^/_matrix/client/(api/v1|r0|v3)/initialSync$" = {
|
|
|
|
proxyPass = "http://synapse_worker_initial_sync";
|
|
|
|
extraConfig = ''
|
|
|
|
proxy_read_timeout 1h;
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
locations."~ ^/_matrix/client/(api/v1|r0|v3)/rooms/[^/]+/initialSync$" = {
|
|
|
|
proxyPass = "http://synapse_worker_initial_sync";
|
|
|
|
extraConfig = ''
|
|
|
|
proxy_read_timeout 1h;
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
locations."/_synapse/client" = {
|
|
|
|
proxyPass = "http://$synapse_backend";
|
|
|
|
};
|
|
|
|
locations."/.well-known/matrix" = {
|
|
|
|
proxyPass = "http://$synapse_backend";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
2024-05-08 21:50:08 +02:00
|
|
|
# networking.firewall.allowedTCPPorts = [ 8448 8008 ];
|
2024-05-08 21:49:37 +02:00
|
|
|
}
|