From 0ae91ee62fd138cee595b8fcf50dcd3a4fd8c532 Mon Sep 17 00:00:00 2001 From: Dominik Polakovics Date: Mon, 2 Mar 2026 11:12:13 +0100 Subject: [PATCH] feat: switch to mas for matrix --- hosts/fw/modules/web/default.nix | 2 + hosts/fw/modules/web/matrix.nix | 212 ++++++++++++++++++++++++----- hosts/fw/modules/web/secrets.yaml | 80 +++++------ hosts/web-arm/modules/authelia.nix | 5 +- 4 files changed, 226 insertions(+), 73 deletions(-) diff --git a/hosts/fw/modules/web/default.nix b/hosts/fw/modules/web/default.nix index fe1175b..edd85ee 100644 --- a/hosts/fw/modules/web/default.nix +++ b/hosts/fw/modules/web/default.nix @@ -91,6 +91,7 @@ in "/var/lib/zammad" "/var/lib/postgresql" "/var/lib/n8n" + "/var/lib/mas" "/var/lib/matrix-synapse" "/var/lib/mautrix-whatsapp" "/var/lib/mautrix-signal" @@ -103,6 +104,7 @@ in environment.systemPackages = with pkgs; [ vim # my preferred editor + matrix-authentication-service # mas-cli for migration ]; networking.hostName = hostname; diff --git a/hosts/fw/modules/web/matrix.nix b/hosts/fw/modules/web/matrix.nix index 6277c2b..59e7356 100644 --- a/hosts/fw/modules/web/matrix.nix +++ b/hosts/fw/modules/web/matrix.nix @@ -3,42 +3,178 @@ let hostname = "matrix"; fqdn = "${hostname}.cloonar.com"; baseUrl = "https://${fqdn}"; - clientConfig."m.homeserver".base_url = baseUrl; + clientConfig = { + "m.homeserver".base_url = baseUrl; + # MAS auth issuer discovery (MSC2965) + "org.matrix.msc2965.authentication" = { + issuer = baseUrl + "/"; + account = baseUrl + "/account"; + }; + }; serverConfig."m.server" = "${fqdn}:443"; mkWellKnown = data: '' default_type application/json; add_header Access-Control-Allow-Origin *; return 200 '${builtins.toJSON data}'; ''; + + masUpstreamId = "01KJPRKN397E5N8D0CA2Z3TJ7Y"; + elementWebClientId = "01KJPVT5D54NRAY7AJY6PZEN0D"; + masPackage = pkgs.matrix-authentication-service; in { - # Secrets for Synapse - sops.secrets.synapse-oidc-client-secret = { - owner = "matrix-synapse"; - }; + # Secrets for MAS + sops.secrets.mas-encryption-key = { owner = "mas"; }; + sops.secrets.mas-matrix-secret = { owner = "mas"; }; + sops.secrets.mas-authelia-client-secret = { owner = "mas"; }; + sops.secrets.mas-rsa-key = { owner = "mas"; }; + sops.secrets.mautrix-whatsapp-env = { }; sops.secrets.mautrix-signal-env = { }; sops.secrets.mautrix-discord-env = { }; - # PostgreSQL database for Synapse + # MAS system user + users.users.mas = { + isSystemUser = true; + group = "mas"; + home = "/var/lib/mas"; + }; + users.groups.mas = { }; + + # PostgreSQL databases for Synapse and MAS services.postgresql = { enable = true; # Synapse requires C locale for correct collation behavior initdbArgs = [ "--lc-collate=C" "--lc-ctype=C" ]; - ensureDatabases = [ "matrix-synapse" ]; + ensureDatabases = [ "matrix-synapse" "mas" ]; ensureUsers = [ { name = "matrix-synapse"; ensureDBOwnership = true; } + { + name = "mas"; + ensureDBOwnership = true; + } ]; }; services.postgresqlBackup.enable = true; - services.postgresqlBackup.databases = [ "matrix-synapse" ]; + services.postgresqlBackup.databases = [ "matrix-synapse" "mas" ]; + + # Matrix Authentication Service (MAS) + systemd.services.matrix-authentication-service = { + description = "Matrix Authentication Service"; + after = [ "postgresql.service" "network.target" ]; + before = [ "matrix-synapse.service" ]; + wantedBy = [ "multi-user.target" ]; + + serviceConfig = { + Type = "simple"; + User = "mas"; + Group = "mas"; + RuntimeDirectory = "mas"; + RuntimeDirectoryMode = "0755"; + StateDirectory = "mas"; + StateDirectoryMode = "0750"; + ExecStart = "${masPackage}/bin/mas-cli server --config /run/mas/config.yaml"; + Restart = "on-failure"; + RestartSec = "5s"; + }; + + preStart = '' + # Read secrets from SOPS-managed files + ENCRYPTION_KEY=$(cat ${config.sops.secrets.mas-encryption-key.path}) + MATRIX_SECRET=$(cat ${config.sops.secrets.mas-matrix-secret.path}) + CLIENT_SECRET=$(cat ${config.sops.secrets.mas-authelia-client-secret.path}) + + # Write Synapse MAS config fragment with inline secret + # (secret_path is not supported in all Synapse versions) + cat > /run/mas/synapse-mas-config.yaml < /run/mas/config.yaml <