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 min-port = 49000;
16 max-port = 50000;
17 use-auth-secret = true;
18 static-auth-secret-file = "${config.eilean.secretsDir}/coturn";
19 realm = "turn.${domain}";
20 cert = "${config.security.acme.certs.${realm}.directory}/full.pem";
21 pkey = "${config.security.acme.certs.${realm}.directory}/key.pem";
22 secure-stun = true;
23 };
24
25 networking.firewall =
26 let
27 turn-range = with config.services.coturn; {
28 from = min-port;
29 to = max-port;
30 };
31 stun-port = 3478;
32 in {
33 allowedTCPPorts = lib.mkForce [ stun-port ];
34 allowedTCPPortRanges = [ turn-range ];
35 allowedUDPPorts = lib.mkForce [ stun-port ];
36 allowedUDPPortRanges = [ turn-range ];
37 };
38
39 security.acme.certs.${config.services.coturn.realm} = {
40 postRun = "systemctl reload nginx.service; systemctl restart coturn.service";
41 group = "turnserver";
42 };
43 services.nginx.virtualHosts = {
44 "turn.${domain}" = {
45 forceSSL = true;
46 enableACME = true;
47 };
48 };
49 users.groups."turnserver".members = [ config.services.nginx.user ];
50
51 dns.records = [
52 {
53 name = "turn";
54 type = "CNAME";
55 data = "vps";
56 }
57 ];
58 };
59}