{ pkgs, lib, config, ... }: let hostname = "matrix"; fqdn = "${hostname}.cloonar.com"; baseUrl = "https://${fqdn}"; 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; synapseMasConfig = pkgs.writeText "synapse-mas-config.yaml" '' matrix_authentication_service: enabled: true endpoint: "http://127.0.0.1:8081" secret_path: ${config.sops.secrets.mas-matrix-secret-synapse.path} ''; in { # 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"; }; # Synapse also needs the shared secret sops.secrets.mas-matrix-secret-synapse = { owner = "matrix-synapse"; key = "mas-matrix-secret"; }; sops.secrets.mautrix-whatsapp-env = { }; sops.secrets.mautrix-signal-env = { }; sops.secrets.mautrix-discord-env = { }; # 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" "mas" ]; ensureUsers = [ { name = "matrix-synapse"; ensureDBOwnership = true; } { name = "mas"; ensureDBOwnership = true; } ]; }; services.postgresqlBackup.enable = true; 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 MAS config with secrets interpolated cat > /run/mas/config.yaml <