Compare commits
27 Commits
1bff640204
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
af561f95c0
|
|||
|
17f49d28ed
|
|||
|
f7b36ea02f
|
|||
|
ef59d3b6ca
|
|||
|
8dfc55fcdb
|
|||
|
49dd32fda4
|
|||
|
19bfa69daa
|
|||
|
b0a95d5a45
|
|||
|
2b5ec9f2f1
|
|||
|
21774d2865
|
|||
|
440952520f
|
|||
|
bae346af19
|
|||
|
1382a2e6ec
|
|||
|
82bbf7aafd
|
|||
|
629d4d34aa
|
|||
|
f4e35a4c96
|
|||
|
c46f6064e9
|
|||
|
75f075fc7d
|
|||
|
b561101d80
|
|||
|
cc6460c078
|
|||
|
a66dfd2392
|
|||
|
0bc2cadd1c
|
|||
|
e0bfd89594
|
|||
| 0862b8d9a0 | |||
| f246bad660 | |||
|
bdaa68a797
|
|||
|
cf0cd34ceb
|
@@ -9,7 +9,7 @@
|
|||||||
./modules/users.nix
|
./modules/users.nix
|
||||||
./modules/hardware.nix
|
./modules/hardware.nix
|
||||||
./modules/services.nix
|
./modules/services.nix
|
||||||
./modules/nginx.nix
|
./modules/proxy.nix
|
||||||
./modules/matrix.nix
|
./modules/matrix.nix
|
||||||
./modules/fail2ban.nix
|
./modules/fail2ban.nix
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -7,14 +7,4 @@ in
|
|||||||
networking.hostName = settings.hostname;
|
networking.hostName = settings.hostname;
|
||||||
|
|
||||||
networking.networkmanager.enable = true;
|
networking.networkmanager.enable = true;
|
||||||
|
|
||||||
networking.firewall = {
|
|
||||||
enable = true;
|
|
||||||
allowedTCPPorts = [
|
|
||||||
22
|
|
||||||
80
|
|
||||||
443
|
|
||||||
];
|
|
||||||
allowedUDPPorts = [ ];
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,273 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
atriDotDad = "atri.dad";
|
|
||||||
atashDotDev = "atash.dev";
|
|
||||||
|
|
||||||
matrixDomain = "matrix.${atriDotDad}";
|
|
||||||
matrixRtcDomain = "matrixrtc.${atriDotDad}";
|
|
||||||
|
|
||||||
upstream = "lloyd.tadpole-pain.ts.net";
|
|
||||||
|
|
||||||
wellKnownServer = builtins.toJSON {
|
|
||||||
"m.server" = "${matrixDomain}:443";
|
|
||||||
};
|
|
||||||
|
|
||||||
wellKnownClient = builtins.toJSON {
|
|
||||||
"m.homeserver" = {
|
|
||||||
base_url = "https://${matrixDomain}";
|
|
||||||
};
|
|
||||||
"org.matrix.msc4143.rtc_foci" = [
|
|
||||||
{
|
|
||||||
type = "livekit";
|
|
||||||
livekit_service_url = "https://${matrixDomain}/livekit/jwt";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
mkProxy = port: {
|
|
||||||
enableACME = true;
|
|
||||||
forceSSL = true;
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "http://${upstream}:${toString port}";
|
|
||||||
proxyWebsockets = true;
|
|
||||||
extraConfig = "if ($fuckai) { return 444; }";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
mkStream = port: ''
|
|
||||||
server {
|
|
||||||
listen ${toString port};
|
|
||||||
listen ${toString port} udp;
|
|
||||||
proxy_pass ${upstream}:${toString port};
|
|
||||||
proxy_timeout 300s;
|
|
||||||
proxy_connect_timeout 10s;
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
in
|
|
||||||
{
|
|
||||||
security.acme = {
|
|
||||||
acceptTerms = true;
|
|
||||||
defaults.email = "me@${atriDotDad}";
|
|
||||||
};
|
|
||||||
|
|
||||||
services.nginx = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
recommendedGzipSettings = true;
|
|
||||||
recommendedOptimisation = true;
|
|
||||||
recommendedProxySettings = true;
|
|
||||||
recommendedTlsSettings = true;
|
|
||||||
|
|
||||||
clientMaxBodySize = "3g";
|
|
||||||
|
|
||||||
commonHttpConfig = ''
|
|
||||||
more_clear_headers Server;
|
|
||||||
more_clear_headers X-Powered-By;
|
|
||||||
|
|
||||||
map $http_user_agent $fuckai {
|
|
||||||
default 0;
|
|
||||||
|
|
||||||
"~*GPTBot" 1;
|
|
||||||
"~*ChatGPT-User" 1;
|
|
||||||
"~*OAI-SearchBot" 1;
|
|
||||||
"~*ChatGPT-Browser" 1;
|
|
||||||
"~*ClaudeBot" 1;
|
|
||||||
"~*Claude-Web" 1;
|
|
||||||
"~*Claude-SearchBot" 1;
|
|
||||||
"~*anthropic-ai" 1;
|
|
||||||
"~*Anthropic-Claude" 1;
|
|
||||||
"~*xAI-Bot" 1;
|
|
||||||
"~*DeepseekBot" 1;
|
|
||||||
"~*Google-Extended" 1;
|
|
||||||
"~*Gemini-Ai" 1;
|
|
||||||
"~*Gemini-Deep-Research" 1;
|
|
||||||
"~*Google-CloudVertexBot" 1;
|
|
||||||
"~*Google-NotebookLM" 1;
|
|
||||||
"~*GoogleAgent-Mariner" 1;
|
|
||||||
"~*Bard-Ai" 1;
|
|
||||||
"~*FacebookBot" 1;
|
|
||||||
"~*Meta-ExternalAgent" 1;
|
|
||||||
"~*meta-webindexer" 1;
|
|
||||||
"~*Applebot-Extended" 1;
|
|
||||||
"~*bingbot" 1;
|
|
||||||
"~*CCBot" 1;
|
|
||||||
"~*PerplexityBot" 1;
|
|
||||||
"~*Perplexity-User" 1;
|
|
||||||
"~*Bytespider" 1;
|
|
||||||
"~*Diffbot" 1;
|
|
||||||
"~*Amazonbot" 1;
|
|
||||||
"~*cohere-ai" 1;
|
|
||||||
"~*Cohere-Command" 1;
|
|
||||||
"~*YouBot" 1;
|
|
||||||
"~*Omgilibot" 1;
|
|
||||||
"~*ImagesiftBot" 1;
|
|
||||||
"~*AI2Bot" 1;
|
|
||||||
"~*Andibot" 1;
|
|
||||||
"~*bigsur.ai" 1;
|
|
||||||
"~*Brightbot" 1;
|
|
||||||
"~*TerraCotta" 1;
|
|
||||||
"~*Character-AI" 1;
|
|
||||||
"~*Devin" 1;
|
|
||||||
"~*Crawlspace" 1;
|
|
||||||
"~*DuckAssistBot" 1;
|
|
||||||
"~*FirecrawlAgent" 1;
|
|
||||||
"~*Groq-Bot" 1;
|
|
||||||
"~*HuggingFace-Bot" 1;
|
|
||||||
"~*IbouBot" 1;
|
|
||||||
"~*MistralAI-User" 1;
|
|
||||||
"~*Replicate-Bot" 1;
|
|
||||||
"~*RunPod-Bot" 1;
|
|
||||||
"~*TimpiBot" 1;
|
|
||||||
"~*Together-Bot" 1;
|
|
||||||
"~*Kangaroo Bot" 1;
|
|
||||||
"~*PanguBot" 1;
|
|
||||||
"~*Cotoyogi" 1;
|
|
||||||
"~*Webzio-Extended" 1;
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
|
|
||||||
streamConfig = lib.concatStrings (
|
|
||||||
map mkStream [
|
|
||||||
69
|
|
||||||
420
|
|
||||||
25565
|
|
||||||
25566
|
|
||||||
25567
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
virtualHosts = {
|
|
||||||
"${atriDotDad}" = {
|
|
||||||
enableACME = true;
|
|
||||||
forceSSL = true;
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "http://${upstream}:3000";
|
|
||||||
extraConfig = "if ($fuckai) { return 444; }";
|
|
||||||
};
|
|
||||||
locations."= /.well-known/matrix/server" = {
|
|
||||||
extraConfig = ''
|
|
||||||
default_type application/json;
|
|
||||||
add_header X-Content-Type-Options nosniff;
|
|
||||||
return 200 '${wellKnownServer}';
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
locations."= /.well-known/matrix/client" = {
|
|
||||||
extraConfig = ''
|
|
||||||
default_type application/json;
|
|
||||||
add_header Access-Control-Allow-Origin "*";
|
|
||||||
add_header Vary Origin;
|
|
||||||
add_header X-Content-Type-Options nosniff;
|
|
||||||
return 200 '${wellKnownClient}';
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
"analytics.${atriDotDad}" = mkProxy 30060;
|
|
||||||
"archive.${atriDotDad}" = mkProxy 30288;
|
|
||||||
"ascently.${atriDotDad}" = mkProxy 8838;
|
|
||||||
"chef.${atriDotDad}" = mkProxy 30111;
|
|
||||||
"democlimb.${atriDotDad}" = mkProxy 8008;
|
|
||||||
"fedi.${atriDotDad}" = mkProxy 8181;
|
|
||||||
"gist.${atriDotDad}" = mkProxy 1227;
|
|
||||||
"git.${atriDotDad}" = mkProxy 30010;
|
|
||||||
"links.${atriDotDad}" = mkProxy 30243;
|
|
||||||
"memos.${atriDotDad}" = mkProxy 30311;
|
|
||||||
"mermaid.${atriDotDad}" = mkProxy 8280;
|
|
||||||
"msrc.${atriDotDad}" = mkProxy 3311;
|
|
||||||
"openclimb.${atriDotDad}" = mkProxy 1337;
|
|
||||||
"photos.${atriDotDad}" = mkProxy 30041;
|
|
||||||
"pods.${atriDotDad}" = mkProxy 30067;
|
|
||||||
"requests.${atriDotDad}" = mkProxy 30042;
|
|
||||||
"s3.${atriDotDad}" = mkProxy 30188;
|
|
||||||
"search.${atriDotDad}" = mkProxy 30053;
|
|
||||||
"vault.${atriDotDad}" = mkProxy 30032;
|
|
||||||
"vids.${atriDotDad}" = mkProxy 31008;
|
|
||||||
"music.${atriDotDad}" = mkProxy 30043;
|
|
||||||
"books.${atriDotDad}" = mkProxy 31067;
|
|
||||||
|
|
||||||
"tv.${atriDotDad}" = {
|
|
||||||
enableACME = true;
|
|
||||||
forceSSL = true;
|
|
||||||
extraConfig = ''
|
|
||||||
client_max_body_size 20g;
|
|
||||||
'';
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "http://${upstream}:30013";
|
|
||||||
proxyWebsockets = true;
|
|
||||||
extraConfig = ''
|
|
||||||
# NOTE: `if` is safe here because the only statement is `return`.
|
|
||||||
# Do NOT add other directives inside this if block.
|
|
||||||
if ($fuckai) { return 444; }
|
|
||||||
proxy_buffering off;
|
|
||||||
proxy_request_buffering off;
|
|
||||||
proxy_read_timeout 86400s;
|
|
||||||
proxy_send_timeout 86400s;
|
|
||||||
send_timeout 86400s;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
"${matrixDomain}" = {
|
|
||||||
enableACME = true;
|
|
||||||
forceSSL = true;
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "http://[::1]:6167";
|
|
||||||
proxyWebsockets = true;
|
|
||||||
extraConfig = ''
|
|
||||||
client_max_body_size 100M;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
locations."^~ /livekit/jwt/" = {
|
|
||||||
priority = 400;
|
|
||||||
extraConfig = ''
|
|
||||||
if ($uri !~ "^/livekit/jwt/(sfu/get|get_token|healthz)$") {
|
|
||||||
return 404;
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
proxyPass = "http://[::1]:${toString config.services.lk-jwt-service.port}/";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
"${matrixRtcDomain}" = {
|
|
||||||
enableACME = true;
|
|
||||||
forceSSL = true;
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "http://[::1]:${toString config.services.livekit.settings.port}";
|
|
||||||
proxyWebsockets = true;
|
|
||||||
extraConfig = ''
|
|
||||||
proxy_send_timeout 120;
|
|
||||||
proxy_read_timeout 120;
|
|
||||||
proxy_buffering off;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
"ripkyle.org" = mkProxy 4321;
|
|
||||||
"${atashDotDev}" = mkProxy 6969;
|
|
||||||
"chronus.${atashDotDev}" = mkProxy 7337;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
networking.firewall.allowedTCPPorts = [
|
|
||||||
80
|
|
||||||
443
|
|
||||||
69
|
|
||||||
420
|
|
||||||
25565
|
|
||||||
25566
|
|
||||||
25567
|
|
||||||
];
|
|
||||||
networking.firewall.allowedUDPPorts = [
|
|
||||||
69
|
|
||||||
420
|
|
||||||
25565
|
|
||||||
25566
|
|
||||||
25567
|
|
||||||
];
|
|
||||||
}
|
|
||||||
213
modules/proxy.nix
Normal file
213
modules/proxy.nix
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
atriDotDad = "atri.dad";
|
||||||
|
atashDotDev = "atash.dev";
|
||||||
|
|
||||||
|
matrixDomain = "matrix.${atriDotDad}";
|
||||||
|
matrixRtcDomain = "matrixrtc.${atriDotDad}";
|
||||||
|
|
||||||
|
upstream = "lloyd.tadpole-pain.ts.net";
|
||||||
|
streamPorts = [
|
||||||
|
69
|
||||||
|
420
|
||||||
|
25565
|
||||||
|
25566
|
||||||
|
25567
|
||||||
|
];
|
||||||
|
|
||||||
|
wellKnownServer = builtins.toJSON {
|
||||||
|
"m.server" = "${matrixDomain}:443";
|
||||||
|
};
|
||||||
|
|
||||||
|
wellKnownClient = builtins.toJSON {
|
||||||
|
"m.homeserver" = {
|
||||||
|
base_url = "https://${matrixDomain}";
|
||||||
|
};
|
||||||
|
"org.matrix.msc4143.rtc_foci" = [
|
||||||
|
{
|
||||||
|
type = "livekit";
|
||||||
|
livekit_service_url = "https://${matrixDomain}/livekit/jwt";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
mkProxy = port: config_preset: ''
|
||||||
|
import ${config_preset}
|
||||||
|
reverse_proxy http://${upstream}:${toString port}
|
||||||
|
'';
|
||||||
|
|
||||||
|
mkSocatService =
|
||||||
|
port: proto:
|
||||||
|
lib.nameValuePair "socat-${proto}-${toString port}" {
|
||||||
|
description = "Socat ${proto} proxy for port ${toString port}";
|
||||||
|
after = [
|
||||||
|
"network-online.target"
|
||||||
|
"tailscaled.service"
|
||||||
|
];
|
||||||
|
wants = [ "network-online.target" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
serviceConfig = {
|
||||||
|
ExecStart = "${pkgs.socat}/bin/socat ${lib.toUpper proto}-LISTEN:${toString port},fork,reuseaddr ${lib.toUpper proto}:${upstream}:${toString port}";
|
||||||
|
Restart = "on-failure";
|
||||||
|
RestartSec = "5s";
|
||||||
|
DynamicUser = true;
|
||||||
|
AmbientCapabilities = [ "CAP_NET_BIND_SERVICE" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
services.caddy = {
|
||||||
|
enable = true;
|
||||||
|
email = "me@${atriDotDad}";
|
||||||
|
|
||||||
|
package = pkgs.caddy.withPlugins {
|
||||||
|
plugins = [ "pkg.jsn.cam/caddy-defender@v0.10.0" ];
|
||||||
|
hash = "sha256-DpCaOp9pXV3sdMz1hh/1SQ7ww7Fo4aAgLvFyQFgIJdI=";
|
||||||
|
};
|
||||||
|
|
||||||
|
extraConfig = ''
|
||||||
|
(common_config) {
|
||||||
|
encode zstd gzip
|
||||||
|
|
||||||
|
defender garbage {
|
||||||
|
ranges openai deepseek aliyun azurepubliccloud aws gcloud githubcopilot mistral oci vultr digitalocean linode cloudflare
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
|
||||||
|
X-Content-Type-Options "nosniff"
|
||||||
|
X-Frame-Options "DENY"
|
||||||
|
Referrer-Policy "strict-origin-when-cross-origin"
|
||||||
|
Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: https://*.atri.dad https://*.atash.dev; font-src 'self' data:; connect-src 'self' wss: https://*.atri.dad https://*.atash.dev; object-src 'none'; base-uri 'self'; frame-ancestors 'none'"
|
||||||
|
-Server
|
||||||
|
-alt-svc
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(relaxed_config) {
|
||||||
|
encode zstd gzip
|
||||||
|
|
||||||
|
header {
|
||||||
|
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
|
||||||
|
X-Content-Type-Options "nosniff"
|
||||||
|
X-Frame-Options "DENY"
|
||||||
|
Referrer-Policy "strict-origin-when-cross-origin"
|
||||||
|
Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: https:; font-src 'self' data:; connect-src 'self' wss: https://*.atri.dad https://*.atash.dev; object-src 'none'; base-uri 'self'; frame-ancestors 'none'"
|
||||||
|
-Server
|
||||||
|
-alt-svc
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
${atriDotDad} {
|
||||||
|
import common_config
|
||||||
|
|
||||||
|
handle /.well-known/matrix/server {
|
||||||
|
header Content-Type application/json
|
||||||
|
header X-Content-Type-Options nosniff
|
||||||
|
respond `${wellKnownServer}` 200
|
||||||
|
}
|
||||||
|
|
||||||
|
handle /.well-known/matrix/client {
|
||||||
|
header Content-Type application/json
|
||||||
|
header Access-Control-Allow-Origin "*"
|
||||||
|
header Vary Origin
|
||||||
|
header X-Content-Type-Options nosniff
|
||||||
|
respond `${wellKnownClient}` 200
|
||||||
|
}
|
||||||
|
|
||||||
|
handle {
|
||||||
|
reverse_proxy http://${upstream}:3000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
analytics.${atriDotDad} { ${mkProxy 30060 "common_config"} }
|
||||||
|
ascently.${atriDotDad} { ${mkProxy 8838 "common_config"} }
|
||||||
|
chef.${atriDotDad} { ${mkProxy 30111 "common_config"} }
|
||||||
|
democlimb.${atriDotDad} { ${mkProxy 8008 "common_config"} }
|
||||||
|
fedi.${atriDotDad} { ${mkProxy 8181 "common_config"} }
|
||||||
|
gist.${atriDotDad} { ${mkProxy 1227 "common_config"} }
|
||||||
|
git.${atriDotDad} { ${mkProxy 30010 "common_config"} }
|
||||||
|
links.${atriDotDad} { ${mkProxy 30243 "common_config"} }
|
||||||
|
memos.${atriDotDad} { ${mkProxy 30311 "common_config"} }
|
||||||
|
mermaid.${atriDotDad} { ${mkProxy 8280 "relaxed_config"} }
|
||||||
|
msrc.${atriDotDad} { ${mkProxy 3311 "common_config"} }
|
||||||
|
openclimb.${atriDotDad} { ${mkProxy 1337 "common_config"} }
|
||||||
|
photos.${atriDotDad} { ${mkProxy 30041 "common_config"} }
|
||||||
|
abs.${atriDotDad} { ${mkProxy 30067 "common_config"} }
|
||||||
|
s3.${atriDotDad} { ${mkProxy 30188 "common_config"} }
|
||||||
|
search.${atriDotDad} { ${mkProxy 30053 "relaxed_config"} }
|
||||||
|
vault.${atriDotDad} { ${mkProxy 30032 "common_config"} }
|
||||||
|
vids.${atriDotDad} { ${mkProxy 31008 "common_config"} }
|
||||||
|
music.${atriDotDad} { ${mkProxy 30043 "common_config"} }
|
||||||
|
books.${atriDotDad} { ${mkProxy 31067 "common_config"} }
|
||||||
|
tv.${atriDotDad} { ${mkProxy 30013 "common_config"} }
|
||||||
|
|
||||||
|
ripkyle.org { ${mkProxy 4321 "common_config"} }
|
||||||
|
${atashDotDev} { ${mkProxy 6969 "common_config"} }
|
||||||
|
chronus.${atashDotDev} { ${mkProxy 7337 "common_config"} }
|
||||||
|
|
||||||
|
${matrixDomain} {
|
||||||
|
request_body {
|
||||||
|
max_size 1GB
|
||||||
|
}
|
||||||
|
|
||||||
|
handle_path /livekit/jwt/* {
|
||||||
|
@allowed path /sfu/get /get_token /healthz
|
||||||
|
handle @allowed {
|
||||||
|
reverse_proxy http://[::1]:${toString config.services.lk-jwt-service.port}
|
||||||
|
}
|
||||||
|
handle {
|
||||||
|
respond 404
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handle {
|
||||||
|
reverse_proxy http://[::1]:6167
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
${matrixRtcDomain} {
|
||||||
|
handle /.well-known/acme-challenge/* {
|
||||||
|
root * /var/lib/acme/acme-challenge
|
||||||
|
file_server
|
||||||
|
}
|
||||||
|
|
||||||
|
handle {
|
||||||
|
reverse_proxy http://[::1]:${toString config.services.livekit.settings.port} {
|
||||||
|
flush_interval -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services = lib.listToAttrs (
|
||||||
|
(map (port: mkSocatService port "tcp") streamPorts)
|
||||||
|
++ (map (port: mkSocatService port "udp") streamPorts)
|
||||||
|
);
|
||||||
|
|
||||||
|
networking.firewall = {
|
||||||
|
allowedTCPPorts = [
|
||||||
|
80
|
||||||
|
443
|
||||||
|
]
|
||||||
|
++ streamPorts;
|
||||||
|
allowedUDPPorts = streamPorts;
|
||||||
|
};
|
||||||
|
|
||||||
|
security.acme = {
|
||||||
|
acceptTerms = true;
|
||||||
|
defaults.email = "me@${atriDotDad}";
|
||||||
|
|
||||||
|
certs."${matrixRtcDomain}" = {
|
||||||
|
webroot = "/var/lib/acme/acme-challenge";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user