{ pkgs, lib, config, ... }: let inherit (builtins.extraBuiltins) pass-chomp; inherit (config) networking; inherit (config.services) prosody; in { networking.nftables.ruleset = '' add rule inet filter net2fw tcp dport {5222, 5269} counter accept comment "XMPP" add rule inet filter net2fw tcp dport 5000 counter accept comment "XMPP XEP-0065 File Transfer Proxy" add rule inet filter net2fw tcp dport {${lib.concatMapStringsSep "," toString prosody.httpsPorts}} counter accept comment "XMPP HTTPS" add rule inet filter fw2net meta skuid ${prosody.user} tcp dport 3478 counter accept comment "TURN" add rule inet filter fw2net meta skuid ${prosody.user} udp dport 3478 counter accept comment "TURN" add rule inet filter fw2net meta skuid ${prosody.user} counter accept comment "Prosody" add rule inet filter fw2net meta skuid ${prosody.user} counter accept comment "Prosody" ''; users.groups.acme.members = [ prosody.user ]; security.acme.certs."${networking.domain}" = { postRun = "systemctl reload prosody"; }; systemd.services.prosody = { wants = [ "acme-selfsigned-${networking.domain}.service" "acme-${networking.domain}.service"]; after = [ "acme-selfsigned-${networking.domain}.service" ]; }; services.prosody = { enable = true; xmppComplianceSuite = true; modules = { announce = true; groups = true; limits = false; motd = true; watchregistrations = true; websocket = false; welcome = true; }; extraModules = [ "turncredentials" #"net_multiplex" ]; extraConfig = '' Component "proxy65.${networking.domain}" "proxy65" proxy65_ports = 5000 turncredentials_host = "turn.${networking.domain}" turncredentials_secret = "${pass-chomp "machines/mermet/coturn/static-auth-secret"}" turncredentials_port = 3478 ''; #ports = {80}; #ssl_ports = {443}; c2sRequireEncryption = true; s2sRequireEncryption = true; s2sSecureAuth = true; uploadHttp = { domain = "tmp.${networking.domain}"; # Prosody's HTTP parser limit on body size uploadFileSizeLimit = "10485760"; userQuota = 100 * 1024 * 1024; uploadExpireAfter = "60 * 60 * 24 * 7"; }; muc = [ { domain = "salons.${networking.domain}"; extraConfig = '' restrict_room_creation = "local" max_history_messages = 42 muc_room_locking = true muc_room_lock_timeout = 600 muc_tombstones = true muc_tombstone_expiry = 31 * 24 * 60 * 60 muc_room_default_public = true muc_room_default_members_only = false muc_room_default_moderated = true muc_room_default_public_jids = false muc_room_default_change_subject = true muc_room_default_history_length = 42 muc_room_default_language = "fr" ''; } ]; virtualHosts."${networking.domain}" = { enabled = true; domain = "${networking.domain}"; ssl.key = "/var/lib/acme/${networking.domain}/key.pem"; ssl.cert = "/var/lib/acme/${networking.domain}/fullchain.pem"; }; admins = [ "julm@${networking.domain}" ]; allowRegistration = false; authentication = "internal_hashed"; #httpPorts = []; disco_items = []; }; }