system/roles/webserver/reverse-proxy.nix (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | {
config,
pkgs,
...
}:
{
imports = [
../../settings/services/caddy.nix
];
age.secrets = {
# TS_AUTHKEY for caddy-tailscale plugin
caddy.file = ../../../secrets/caddy.age;
};
security.acme.defaults = {
email = "security@${config.networking.domain}";
dnsProvider = "pdns";
validMinDays = 32;
};
services.tailscale.permitCertUid = config.services.caddy.user;
services.caddy = {
environmentFile = config.age.secrets.caddy.path;
package = pkgs.caddy.withPlugins {
plugins = [
"github.com/caddyserver/cache-handler@v0.16.0"
"github.com/tailscale/caddy-tailscale@v0.0.0-20260106222316-bb080c4414ac"
"github.com/caddy-dns/rfc2136@v1.0.0"
"github.com/mholt/caddy-ratelimit@v0.1.1-0.20260521172720-16aecbbcb8ca"
];
hash = "sha256-gP2p91zY5JK8+MV9deEb3i4bqb2sXKEdhrqJK7W7CuM=";
};
globalConfig = ''
cache
tailscale {
tags tag:app
}
acme_dns rfc2136 {
key_name caddy
key_alg hmac-sha512
key "{env.DDNS_TSIG_KEY}"
server pdns.alin.ovh:53
}
'';
extraConfig = ''
(rate_limit) {
rate_limit {
zone global_static {
match {
query query=*
}
key static
events 240
window 1m
}
zone host_dynamic {
match {
query query=*
}
key {remote_host}
ipv6_prefix 64
events 5
window 5s
}
zone net_dynamic {
match {
query query=*
}
key {remote_host}
ipv4_prefix 24
ipv6_prefix 56
events 10
window 5s
}
}
}
'';
};
users.groups.caddy.members = [ "alin" ];
users.groups.webservice = {
members = [ "caddy" ];
};
systemd.tmpfiles.rules = [
# setgid bit (2)
# sticky bit (4)
"d /run/web/ 6770 caddy webservice -"
];
systemd.services.caddy.serviceConfig = {
ReadWritePaths = [ "/run/web" ];
};
boot.kernel.sysctl =
let
buffer_size = 16 * 1024 * 1024;
server_count = 2;
max_clients = 100;
page_size = 4096;
# This server might have 100 clients simultaneously, so:
# max(tcp_wmem) * 2 * 100 / 4096
mem = toString (buffer_size * server_count * max_clients / page_size);
in
{
# Provide adequate buffer memory.
# rmem_max and wmem_max are TCP max buffer size
# settable with setsockopt(), in bytes
# tcp_rmem and tcp_wmem are per socket in bytes.
# tcp_mem is for all TCP streams, in 4096-byte pages.
# The following are suggested on IBM's
# High Performance Computing page
"net.core.rmem_max" = buffer_size;
"net.core.wmem_max" = buffer_size;
"net.core.rmem_default" = buffer_size;
"net.core.wmem_default" = buffer_size;
"net.ipv4.tcp_rmem" = "4096 87380 ${toString buffer_size}";
"net.ipv4.tcp_wmem" = "4096 87380 ${toString buffer_size}";
"net.ipv4.tcp_mem" = "${mem} ${mem} ${mem}";
"net.ipv4.tcp_sack" = 0;
"net.ipv4.tcp_dsack" = 0;
"net.ipv4.tcp_slow_start_after_idle" = 0;
};
}
|