{ 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"; }; # MatrixRTC LiveKit focus for Element Call "org.matrix.msc4143.rtc_foci" = [ { type = "livekit"; livekit_service_url = "${baseUrl}/livekit/jwt"; } ]; }; 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} ''; synapseVoipConfig = "/run/matrix-synapse/voip-config.yaml"; 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"; }; # TURN shared secret (for Synapse VoIP config) sops.secrets.coturn-static-secret = { sopsFile = ./secrets.yaml; owner = "matrix-synapse"; }; sops.secrets.mautrix-whatsapp-env = { }; sops.secrets.mautrix-signal-env = { }; sops.secrets.mautrix-discord-env = { }; sops.secrets.mautrix-mattermost-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 < ${synapseVoipConfig} < /run/livekit/key chmod 0644 /run/livekit/key fi ''; }; # Mattermost bridge (bridgev2 — attrs replace entirely, so include all needed fields) services.mautrix-mattermost = { enable = true; registerToSynapse = true; environmentFile = config.sops.secrets.mautrix-mattermost-env.path; settings = { homeserver = { address = "http://127.0.0.1:8009"; domain = "cloonar.com"; }; bridge = { command_prefix = "!mm"; permissions."*" = "relay"; permissions."cloonar.com" = "user"; relay.enabled = true; }; appservice = { address = "http://localhost:29335"; hostname = "0.0.0.0"; port = 29335; id = "mattermost"; bot.username = "mattermostbot"; ephemeral_events = true; username_template = "mattermost_{{.}}"; as_token = "$MAUTRIX_MATTERMOST_AS_TOKEN"; hs_token = "$MAUTRIX_MATTERMOST_HS_TOKEN"; }; encryption = { allow = true; default = true; require = true; pickle_key = "$MAUTRIX_MATTERMOST_PICKLE_KEY"; msc4190 = true; }; }; }; }