Config coturn
This commit is contained in:
parent
9710cae748
commit
b08a27c475
8 changed files with 122 additions and 88 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
cloudflare:
|
cloudflare: ENC[AES256_GCM,data:g1aQmfbkgiNOblIz/4CUU1MYgIPV5obFiH37+80hrPqFpAeR78PKOWJ9gmpwvwq2yKbyr59Urn0JyhOqsQ==,iv:I1Qjn6KSlokRwa5lMX3YwhsSFDpgd7RX+xVbS61z/ys=,tag:ycXEik7WAV92JRLP4huLFw==,type:str]
|
||||||
singularity: ENC[AES256_GCM,data:pb2HNPTSAJ47oOeo77+lR1WrCpjMm8UtqOvHJWpKlnOcvw+2q2S2SpB3CbY5Ovp28Vq29paVUOnc5f2SZA==,iv:H5tf/Uq9uk4u0ZPxmW7UrgRXuHMGBU8KTMwnhODC7IQ=,tag:xvte0Rkh8Rgds6r5VIkTUA==,type:str]
|
coturn: ENC[AES256_GCM,data:3JQCzWn3RJcGgMyfS+Wm/IL1cTSh/BFcVHhI,iv:aCmkJJt6wIjL2dIe6MUDNZieoq4siyb4T1x7SuwNrIg=,tag:OKtbQE+ykC7iASQq0pwe9w==,type:str]
|
||||||
mail:
|
mail:
|
||||||
macronova:
|
macronova:
|
||||||
password: ENC[AES256_GCM,data:wJMS3WqmAMQiOiyDUvmwH6Bes4L8GZC/2MxXP23M+RUrN7esqQsaMXLksY/33TuopuekVAvW9K+D2go5quaxdZhB/cVrhXqIjLVLV6Wa+WkYlbeQvJ5ix3R40X455opndrCQCQslatzcgGxmMS8qj5j0UcOfng==,iv:jfo7REVvIDI9MiWRsBi4MoTHfO6lHY5oQI9WyUecnnQ=,tag:hrSHzh4DK5Skav6A3fwD5A==,type:str]
|
password: ENC[AES256_GCM,data:wJMS3WqmAMQiOiyDUvmwH6Bes4L8GZC/2MxXP23M+RUrN7esqQsaMXLksY/33TuopuekVAvW9K+D2go5quaxdZhB/cVrhXqIjLVLV6Wa+WkYlbeQvJ5ix3R40X455opndrCQCQslatzcgGxmMS8qj5j0UcOfng==,iv:jfo7REVvIDI9MiWRsBi4MoTHfO6lHY5oQI9WyUecnnQ=,tag:hrSHzh4DK5Skav6A3fwD5A==,type:str]
|
||||||
|
|
@ -48,8 +48,8 @@ sops:
|
||||||
UnlUY25pOGJ2T1VoTW0yeTFEL2NNTVUKHFdlBryccJAKz26+oECG8tx/FvhZEe0E
|
UnlUY25pOGJ2T1VoTW0yeTFEL2NNTVUKHFdlBryccJAKz26+oECG8tx/FvhZEe0E
|
||||||
MBRoWFu+LHaAUgaOKEBMUHZKzY7Q+TahAsdsy+VErmRkI6i/Hh10ww==
|
MBRoWFu+LHaAUgaOKEBMUHZKzY7Q+TahAsdsy+VErmRkI6i/Hh10ww==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
lastmodified: "2023-11-28T05:25:46Z"
|
lastmodified: "2024-09-01T06:31:43Z"
|
||||||
mac: ENC[AES256_GCM,data:e6p67apo/byZ1dNhvHqcbcUOnTFInoL9t2RGki8Wd114w+1IZxfPAmXzvoea3txXWnrvCuuZBVD+RglcWjbkvE54J8YfACgRN5+93NLWVVHrgbwL7WiI+W+rpzUqiWxByD72ee9rvG1dehAEAT0QEARVehIHpPK8F9/i/a3F+IA=,iv:rjtqpbKe4FyrX4RdVMwyqkCDMSP1rUaZoC9U9CAlzR0=,tag:4KSAB5eooNTdd/2ff9zL5Q==,type:str]
|
mac: ENC[AES256_GCM,data:w6s0HiUCsaVU0aYkCuIwLxW/NTP3dZbDZOS8zOAKgK4mBecs9MlBzFY6cQzM657aYvK/JibyD2L6AsjrdX9HOiN0dEFikDAaZ6OvyCoaxYawZF/aFPKR92sWzuMMvaU8g+g3F3tyhq/SR1ojHyPFztbkrfxIkm+ORl17w56Eb5E=,iv:7088zB1C/1Dt7zBJNRaTcDVJRa28dwPV43vR/yRc/mA=,tag:geuuukzQ4A8wofkK5Co4jg==,type:str]
|
||||||
pgp: []
|
pgp: []
|
||||||
unencrypted_suffix: _unencrypted
|
unencrypted_suffix: _unencrypted
|
||||||
version: 3.8.1
|
version: 3.9.0
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,10 @@ with lib; {
|
||||||
default = {
|
default = {
|
||||||
aria2 = 30206;
|
aria2 = 30206;
|
||||||
conduit = 29800;
|
conduit = 29800;
|
||||||
|
coturn = 12616;
|
||||||
|
coturn-tls = 38313;
|
||||||
|
coturn-relay-udp-min = 17105;
|
||||||
|
coturn-relay-udp-max = 17184;
|
||||||
forgejo = 47674;
|
forgejo = 47674;
|
||||||
headscale = 27327;
|
headscale = 27327;
|
||||||
http = 80;
|
http = 80;
|
||||||
|
|
@ -55,7 +59,7 @@ with lib; {
|
||||||
type = types.listOf types.str;
|
type = types.listOf types.str;
|
||||||
default =
|
default =
|
||||||
if config.services.openssh.enable
|
if config.services.openssh.enable
|
||||||
then builtins.map (key: key.path) config.services.openssh.hostKeys
|
then map (key: key.path) config.services.openssh.hostKeys
|
||||||
else ["/root/.ssh/${config.networking.hostName}"];
|
else ["/root/.ssh/${config.networking.hostName}"];
|
||||||
description = ''
|
description = ''
|
||||||
The private key files for sops.
|
The private key files for sops.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
aria2: ENC[AES256_GCM,data:wXS/Qgbu3bc9YDwVLCz+EIm8yMl8Un8XPwMv,iv:6j/mRhbA+Ps/8pvfmx0CYH2/iqxcG+roi50Gr6hC3SI=,tag:TK6D/9nmM76ODPH1irbREg==,type:str]
|
aria2: ENC[AES256_GCM,data:wXS/Qgbu3bc9YDwVLCz+EIm8yMl8Un8XPwMv,iv:6j/mRhbA+Ps/8pvfmx0CYH2/iqxcG+roi50Gr6hC3SI=,tag:TK6D/9nmM76ODPH1irbREg==,type:str]
|
||||||
coturn: ENC[AES256_GCM,data:JvywrYxRl9QM4+WXH3xhkl4HZwGZurVYRX+S,iv:x6qmAS+11djd2w6pRr5KZYOy7vNtaC6rIw+XXDuu2aY=,tag:fT202mZDyRknuZK27RzgbA==,type:str]
|
|
||||||
users:
|
users:
|
||||||
macronova:
|
macronova:
|
||||||
password: ENC[AES256_GCM,data:b1ct21IrepupexfV5CZV31/HRLRbhPY8EZDAA5rkYisSkke5Z6K8IlFePkbRAEre08qastLPr8FARal+s/co6kfR+aFcqD55hMcLaXvthg4xI6K4NRX0Ifp28JaEy0c515qLbvDLiyMsHQ==,iv:uK96mBa7ewu6SjPWb5aJDPKKASSqWFNGfRt88jWhbP8=,tag:eeVXcr3JOOpqO35y0wcXIQ==,type:str]
|
password: ENC[AES256_GCM,data:b1ct21IrepupexfV5CZV31/HRLRbhPY8EZDAA5rkYisSkke5Z6K8IlFePkbRAEre08qastLPr8FARal+s/co6kfR+aFcqD55hMcLaXvthg4xI6K4NRX0Ifp28JaEy0c515qLbvDLiyMsHQ==,iv:uK96mBa7ewu6SjPWb5aJDPKKASSqWFNGfRt88jWhbP8=,tag:eeVXcr3JOOpqO35y0wcXIQ==,type:str]
|
||||||
|
|
@ -36,8 +35,8 @@ sops:
|
||||||
TG5mYWd3MnI5TlZiNXBjb0JJY3BvN0EKUd0ldQPe0/zdHjsmKEUhH7xkpO4nLfd5
|
TG5mYWd3MnI5TlZiNXBjb0JJY3BvN0EKUd0ldQPe0/zdHjsmKEUhH7xkpO4nLfd5
|
||||||
fnTk1jGonJg+t+TqLLg/YYKlcNkgExWaIZ7wrd0RVKXOeC2BtM/wzQ==
|
fnTk1jGonJg+t+TqLLg/YYKlcNkgExWaIZ7wrd0RVKXOeC2BtM/wzQ==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
lastmodified: "2024-09-01T04:16:17Z"
|
lastmodified: "2024-09-01T04:30:14Z"
|
||||||
mac: ENC[AES256_GCM,data:eGWeRIt35PZ09tYOFwSm5OMC/cehI8Y2W6x2zd4PXLDxZpJi1I7wdvQ1ch/sHabD9Q9SLA4YbisHdCCNEXUc2y0sjfjK9CMvQjsOKhkvtDVPtPvlpK99CthNT2EGER22FxCOr2Ozp95Xji1NQrtxEozZF1IhI2HlZ9a8hZvcue8=,iv:rtnEIZetXDS9QSlOwjWfSFWH56e1C2He0qxQjWjiYxA=,tag:rTQSKM7erUfHscW4dsJJHQ==,type:str]
|
mac: ENC[AES256_GCM,data:ct8vaGlaPj69vzRm9baA2rxbuBM+MYX3Gjtg8m1cdHtldifvrYcw+hb1b9qC/Jhn3ppqpPO/8PhqqMU9U+aUBaSRV0AdDZs63T1/591SU3NDC6rmRBtkbrGk4g4jw4/Guw9Gs8F2r6xWf91KobAoHg9HLI+PK+pOSlfl4o8PBww=,iv:iPGlDkj5mnUxdtoSMztH8BPwSID0FJQDZfc2JenQngw=,tag:1QUCclV0Cs6hsPBANupj1g==,type:str]
|
||||||
pgp: []
|
pgp: []
|
||||||
unencrypted_suffix: _unencrypted
|
unencrypted_suffix: _unencrypted
|
||||||
version: 3.9.0
|
version: 3.9.0
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,19 @@
|
||||||
{config, ...}: {
|
{config, ...}: {
|
||||||
services = with config.constants; {
|
services.matrix-conduit = with config.constants; {
|
||||||
coturn = {
|
enable = true;
|
||||||
enable = true;
|
settings.global = {
|
||||||
realm = localhost;
|
address = wildcard;
|
||||||
static-auth-secret-file = config.sops.secrets.coturn.path;
|
port = port.conduit;
|
||||||
use-auth-secret = true;
|
# Use secret file when possible
|
||||||
};
|
turn_secret = "84EoJSEVnlH@eiqqV7K!2vmAr^G";
|
||||||
matrix-conduit = {
|
turn_uris = let
|
||||||
enable = true;
|
coturn-realm = "turn.${domain}";
|
||||||
settings.global = {
|
in [
|
||||||
address = wildcard;
|
"turn:${coturn-realm}:${toString port.coturn-tls}?transport=udp"
|
||||||
port = port.conduit;
|
"turn:${coturn-realm}:${toString port.coturn-tls}?transport=tcp"
|
||||||
turn_secret = "TbbL8a4tsv6HkR9esjkPa4$fTKX";
|
];
|
||||||
turn_uris = [
|
turn_user_lifetime = "1h";
|
||||||
"turn:${localhost}?transport=udp"
|
server_name = domain;
|
||||||
"turn:${localhost}?transport=tcp"
|
|
||||||
];
|
|
||||||
server_name = domain;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
sops.secrets.coturn = {};
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,65 +8,74 @@ with config.constants; {
|
||||||
enable = true;
|
enable = true;
|
||||||
email = postMaster;
|
email = postMaster;
|
||||||
virtualHosts = let
|
virtualHosts = let
|
||||||
|
acme = fqdns:
|
||||||
|
builtins.listToAttrs (map (fqdn: {
|
||||||
|
name = fqdn;
|
||||||
|
value = {
|
||||||
|
extraConfig = ''
|
||||||
|
file_server ${wn "acme-challenge"}/* {
|
||||||
|
root ${config.security.acme.defaults.webroot}/
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
useACMEHost = fqdn;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
fqdns);
|
||||||
|
portStr = builtins.mapAttrs (n: v: toString v) port;
|
||||||
homeSrv = s: "nebula:${portStr.${s}}";
|
homeSrv = s: "nebula:${portStr.${s}}";
|
||||||
localSrv = s: "${localhost}:${portStr.${s}}";
|
localSrv = s: "${localhost}:${portStr.${s}}";
|
||||||
msfqdn = config.mailserver.fqdn;
|
|
||||||
mtfqdn = "matrix.${domain}";
|
mtfqdn = "matrix.${domain}";
|
||||||
portStr = builtins.mapAttrs (n: v: toString v) port;
|
|
||||||
wn = s: "/.well-known/${s}";
|
wn = s: "/.well-known/${s}";
|
||||||
in {
|
in
|
||||||
"${domain}".extraConfig = let
|
{
|
||||||
wnm = wn "matrix";
|
"${domain}".extraConfig = let
|
||||||
in ''
|
wnm = wn "matrix";
|
||||||
header ${wnm}/* Content-Type application/json
|
in ''
|
||||||
header ${wnm}/* Access-Control-Allow-Origin *
|
header ${wnm}/* Content-Type application/json
|
||||||
respond ${wnm}/server `{ "m.server": "${mtfqdn}:${portStr.https}" }`
|
header ${wnm}/* Access-Control-Allow-Origin *
|
||||||
respond ${wnm}/client `{
|
respond ${wnm}/server `{ "m.server": "${mtfqdn}:${portStr.https}" }`
|
||||||
"m.homeserver": { "base_url": "https://${mtfqdn}" },
|
respond ${wnm}/client `{
|
||||||
"m.identity_server": { "base_url": "https://${mtfqdn}" }
|
"m.homeserver": { "base_url": "https://${mtfqdn}" },
|
||||||
}`
|
"m.identity_server": { "base_url": "https://${mtfqdn}" }
|
||||||
'';
|
}`
|
||||||
"aria2.${domain}".extraConfig = ''
|
'';
|
||||||
reverse_proxy /jsonrpc ${homeSrv "aria2"}
|
"aria2.${domain}".extraConfig = ''
|
||||||
file_server {
|
reverse_proxy /jsonrpc ${homeSrv "aria2"}
|
||||||
root ${pkgs.ariang}/share/ariang
|
file_server {
|
||||||
}
|
root ${pkgs.ariang}/share/ariang
|
||||||
'';
|
|
||||||
"forgejo.${domain}".extraConfig = ''
|
|
||||||
reverse_proxy ${homeSrv "forgejo"}
|
|
||||||
'';
|
|
||||||
"headscale.${domain}".extraConfig = ''
|
|
||||||
reverse_proxy ${localSrv "headscale"}
|
|
||||||
'';
|
|
||||||
"jellyfin.${domain}".extraConfig = ''
|
|
||||||
reverse_proxy ${homeSrv "jellyfin"}
|
|
||||||
'';
|
|
||||||
"jellyseerr.${domain}".extraConfig = ''
|
|
||||||
reverse_proxy ${homeSrv "jellyseerr"}
|
|
||||||
'';
|
|
||||||
${msfqdn} = {
|
|
||||||
extraConfig = ''
|
|
||||||
file_server ${wn "acme-challenge"}/* {
|
|
||||||
root ${config.security.acme.defaults.webroot}/
|
|
||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
useACMEHost = msfqdn;
|
"forgejo.${domain}".extraConfig = ''
|
||||||
};
|
reverse_proxy ${homeSrv "forgejo"}
|
||||||
"matrix.${domain}".extraConfig = ''
|
'';
|
||||||
reverse_proxy /_matrix/* ${homeSrv "conduit"}
|
"headscale.${domain}".extraConfig = ''
|
||||||
file_server {
|
reverse_proxy ${localSrv "headscale"}
|
||||||
root ${pkgs.fluffychat-web}
|
'';
|
||||||
}
|
"jellyfin.${domain}".extraConfig = ''
|
||||||
'';
|
reverse_proxy ${homeSrv "jellyfin"}
|
||||||
"vault.${domain}".extraConfig = ''
|
'';
|
||||||
reverse_proxy ${localSrv "vault"} {
|
"jellyseerr.${domain}".extraConfig = ''
|
||||||
header_up X-Real-IP {remote_host}
|
reverse_proxy ${homeSrv "jellyseerr"}
|
||||||
}
|
'';
|
||||||
'';
|
"matrix.${domain}".extraConfig = ''
|
||||||
"writefreely.${domain}".extraConfig = ''
|
reverse_proxy /_matrix/* ${homeSrv "conduit"}
|
||||||
reverse_proxy ${homeSrv "writefreely"}
|
file_server {
|
||||||
'';
|
root ${pkgs.fluffychat-web}
|
||||||
};
|
}
|
||||||
|
'';
|
||||||
|
"vault.${domain}".extraConfig = ''
|
||||||
|
reverse_proxy ${localSrv "vault"} {
|
||||||
|
header_up X-Real-IP {remote_host}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
"writefreely.${domain}".extraConfig = ''
|
||||||
|
reverse_proxy ${homeSrv "writefreely"}
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
// (acme [
|
||||||
|
config.mailserver.fqdn
|
||||||
|
config.services.coturn.realm
|
||||||
|
]);
|
||||||
};
|
};
|
||||||
|
|
||||||
security.acme = {
|
security.acme = {
|
||||||
|
|
|
||||||
19
linux/singularity/coturn.nix
Normal file
19
linux/singularity/coturn.nix
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
{config, ...}: {
|
||||||
|
services.coturn = with config.constants; let
|
||||||
|
acmeDir = config.security.acme.certs.${coturn-realm}.directory;
|
||||||
|
coturn-realm = "turn.${domain}";
|
||||||
|
in {
|
||||||
|
enable = true;
|
||||||
|
cert = "${acmeDir}/fullchain.pem";
|
||||||
|
listening-port = port.coturn;
|
||||||
|
min-port = port.coturn-relay-udp-min;
|
||||||
|
max-port = port.coturn-relay-udp-max;
|
||||||
|
pkey = "${acmeDir}/key.pem";
|
||||||
|
realm = coturn-realm;
|
||||||
|
static-auth-secret-file = config.sops.secrets.coturn.path;
|
||||||
|
tls-listening-port = port.coturn-tls;
|
||||||
|
use-auth-secret = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
sops.secrets.coturn = {};
|
||||||
|
}
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
../../common
|
../../common
|
||||||
./caddy.nix
|
./caddy.nix
|
||||||
./configuration.nix
|
./configuration.nix
|
||||||
|
./coturn.nix
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
./headscale.nix
|
./headscale.nix
|
||||||
./mailserver.nix
|
./mailserver.nix
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,15 @@
|
||||||
{config, ...}: let
|
{config, ...}: {
|
||||||
hn = config.networking.hostName;
|
|
||||||
in {
|
|
||||||
networking = {
|
networking = {
|
||||||
firewall.allowedTCPPorts = with config.constants.port; [http https];
|
firewall = with config.constants.port; {
|
||||||
|
allowedTCPPorts = [coturn coturn-tls http https];
|
||||||
|
allowedUDPPorts = [coturn coturn-tls];
|
||||||
|
allowedUDPPortRanges = [
|
||||||
|
{
|
||||||
|
from = coturn-relay-udp-min;
|
||||||
|
to = coturn-relay-udp-max;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
hostId = "2cadb253";
|
hostId = "2cadb253";
|
||||||
nftables.enable = true;
|
nftables.enable = true;
|
||||||
};
|
};
|
||||||
|
|
@ -10,11 +17,11 @@ in {
|
||||||
services = {
|
services = {
|
||||||
cloudflare-dyndns = {
|
cloudflare-dyndns = {
|
||||||
enable = true;
|
enable = true;
|
||||||
apiTokenFile = config.sops.secrets."cloudflare/${hn}".path;
|
apiTokenFile = config.sops.secrets.cloudflare.path;
|
||||||
domains = builtins.attrNames config.services.caddy.virtualHosts;
|
domains = builtins.attrNames config.services.caddy.virtualHosts;
|
||||||
};
|
};
|
||||||
openssh.enable = true;
|
openssh.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
sops.secrets."cloudflare/${hn}" = {};
|
sops.secrets.cloudflare = {};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue