nixos-config/services/matrix/dendrite.nix

134 lines
3.5 KiB
Nix
Raw Permalink Normal View History

2023-01-08 15:49:53 +01:00
{ config, pkgs, ... }:
let
server_name = "felschr.com";
domain = "matrix.${server_name}";
database = {
connection_string = "postgresql:///dendrite?host=/run/postgresql";
max_open_conns = 10;
max_idle_conns = 2;
conn_max_lifetime = -1;
};
2024-05-26 16:45:38 +02:00
in
{
2023-01-08 15:49:53 +01:00
age.secrets.dendrite-private-key = {
file = ../../secrets/dendrite/privateKey.age;
mode = "755";
};
age.secrets.dendrite-env = {
2024-05-26 17:28:02 +02:00
file = ../../secrets/dendrite/env.age;
2023-01-08 15:49:53 +01:00
mode = "755";
};
services.dendrite = {
enable = true;
environmentFile = config.age.secrets.dendrite-env.path;
settings = {
app_service_api.database = database;
federation_api.database = database;
key_server.database = database;
media_api.database = database;
mscs.database = database;
room_server.database = database;
sync_api.database = database;
user_api.account_database = database;
2023-01-08 15:49:53 +01:00
client_api.registration_shared_secret = "$REGISTRATION_SHARED_SECRET";
media_api.max_file_size_bytes = 10485760; # 10 MB
2023-01-08 15:49:53 +01:00
mscs.mscs = [
"msc2836" # threads
"msc2946" # space summaries
2023-01-08 15:49:53 +01:00
];
2024-05-26 16:45:38 +02:00
federation_api.key_perspectives = [
{
server_name = "matrix.org";
keys = [
{
key_id = "ed25519:auto";
public_key = "Noi6WqcDj0QmPxCNQqgezwTlBKrfqehY1u2FyWP9uYw";
}
{
key_id = "ed25519:a_RXGa";
public_key = "l8Hft5qXKn1vfHrg3p4+W8gELQVo8N13JkluMfmn2sQ";
}
];
}
];
2023-01-08 15:49:53 +01:00
global = {
inherit server_name;
private_key = config.age.secrets.dendrite-private-key.path;
jetstream.storage_path = "/var/lib/dendrite/jetstream";
dns_cache = {
enabled = true;
cache_size = 4096;
cache_lifetime = "600s";
};
};
};
};
services.postgresql = {
2024-05-26 16:45:38 +02:00
ensureUsers = [
{
name = "dendrite";
ensureDBOwnership = true;
}
];
2023-01-08 15:49:53 +01:00
ensureDatabases = [ "dendrite" ];
};
systemd.services.dendrite.after = [ "postgresql.service" ];
services.nginx.virtualHosts = {
${server_name} = {
enableACME = true;
forceSSL = true;
2024-05-26 16:45:38 +02:00
locations =
let
server = {
"m.server" = "${domain}:443";
};
client = {
"m.homeserver"."base_url" = "https://${domain}";
"org.matrix.msc3575.proxy"."url" = "https://${domain}";
"m.identity_server"."base_url" = "https://vector.im";
};
in
{
"= /.well-known/matrix/server".extraConfig = ''
add_header Content-Type application/json;
return 200 '${builtins.toJSON server}';
'';
"= /.well-known/matrix/client".extraConfig = ''
add_header Content-Type application/json;
add_header Access-Control-Allow-Origin *;
return 200 '${builtins.toJSON client}';
'';
2023-01-08 15:49:53 +01:00
};
};
"${domain}" = {
enableACME = true;
forceSSL = true;
locations = {
"/".extraConfig = ''
return 404;
'';
2024-05-26 16:45:38 +02:00
"/_matrix".proxyPass = "http://127.0.0.1:${toString config.services.dendrite.httpPort}";
2023-01-08 15:49:53 +01:00
};
};
};
environment.systemPackages = [
# run like: dendrite-create-account --username --admin
(pkgs.writeShellScriptBin "dendrite-create-account" ''
${pkgs.dendrite}/bin/create-account \
--config /run/dendrite/dendrite.yaml \
"$@"
'')
];
}