Self-host your own digital island
1{ config, pkgs, lib, ... }: 2 3let 4 cfg = config.eilean; 5 domain = config.networking.domain; 6in 7{ 8 options.eilean.turn.enable = lib.mkEnableOption "TURN server"; 9 10 config = lib.mkIf cfg.turn.enable { 11 services.coturn = rec { 12 enable = true; 13 no-cli = true; 14 no-tcp-relay = true; 15 secure-stun = true; 16 use-auth-secret = true; 17 static-auth-secret-file = "${config.eilean.secretsDir}/coturn"; 18 realm = "turn.${domain}"; 19 relay-ips = with config.eilean; [ 20 serverIpv4 21 serverIpv6 22 ]; 23 cert = "${config.security.acme.certs.${realm}.directory}/full.pem"; 24 pkey = "${config.security.acme.certs.${realm}.directory}/key.pem"; 25 }; 26 27 networking.firewall = 28 with config.services.coturn; 29 let 30 turn-range = { 31 from = min-port; 32 to = max-port; 33 }; 34 stun-ports = [ 35 listening-port 36 tls-listening-port 37 # these are only used if server has more than one IP address (of the same family 38 #alt-listening-port 39 #alt-tls-listening-port 40 ]; 41 in { 42 allowedTCPPorts = stun-ports; 43 allowedTCPPortRanges = [ turn-range ]; 44 allowedUDPPorts = stun-ports; 45 allowedUDPPortRanges = [ turn-range ]; 46 }; 47 48 security.acme.certs.${config.services.coturn.realm} = { 49 postRun = "systemctl reload nginx.service; systemctl restart coturn.service"; 50 group = "turnserver"; 51 }; 52 services.nginx.virtualHosts = { 53 "${config.services.coturn.realm}" = { 54 forceSSL = true; 55 enableACME = true; 56 }; 57 }; 58 users.groups."turnserver".members = [ config.services.nginx.user ]; 59 60 eilean.dns.enable = true; 61 eilean.services.dns.zones.${config.networking.domain}.records = [ 62 { 63 name = "turn"; 64 type = "CNAME"; 65 data = "vps"; 66 } 67 ]; 68 }; 69}