improve caddy config

This commit is contained in:
xunuwu 2025-05-04 07:56:11 +02:00
parent 2edfd18ed0
commit 1e6a17c6a7
4 changed files with 57 additions and 55 deletions

26
flake.lock generated
View file

@ -109,6 +109,30 @@
"type": "github" "type": "github"
} }
}, },
"cloudflare-ipv4": {
"flake": false,
"locked": {
"narHash": "sha256-V4dThTb8iw02hjngubVtSJbEeWgOS1e/ODt1fLjLZvk=",
"type": "file",
"url": "https://www.cloudflare.com/ips-v4"
},
"original": {
"type": "file",
"url": "https://www.cloudflare.com/ips-v4"
}
},
"cloudflare-ipv6": {
"flake": false,
"locked": {
"narHash": "sha256-BgpkXCAh/MmK3GTAElKiGJctCYUN+/UgvpuawqGmitE=",
"type": "file",
"url": "https://www.cloudflare.com/ips-v6"
},
"original": {
"type": "file",
"url": "https://www.cloudflare.com/ips-v6"
}
},
"crane": { "crane": {
"locked": { "locked": {
"lastModified": 1745454774, "lastModified": 1745454774,
@ -992,6 +1016,8 @@
"root": { "root": {
"inputs": { "inputs": {
"authentik-nix": "authentik-nix", "authentik-nix": "authentik-nix",
"cloudflare-ipv4": "cloudflare-ipv4",
"cloudflare-ipv6": "cloudflare-ipv6",
"firefox-addons": "firefox-addons", "firefox-addons": "firefox-addons",
"flake-parts": "flake-parts_2", "flake-parts": "flake-parts_2",
"hardware": "hardware", "hardware": "hardware",

View file

@ -78,9 +78,13 @@
roblox-playtime.url = "github:xunuwu/roblox-playtime"; roblox-playtime.url = "github:xunuwu/roblox-playtime";
roblox-playtime.inputs.nixpkgs.follows = "nixpkgs"; roblox-playtime.inputs.nixpkgs.follows = "nixpkgs";
wallpaper = { cloudflare-ipv4.url = "https://www.cloudflare.com/ips-v4";
url = "https://cdn.donmai.us/original/43/20/__kasane_teto_and_kasane_teto_utau_and_1_more_drawn_by_maguru_white__43204cf49ef8c071c34009553d1c0455.jpg"; cloudflare-ipv4.flake = false;
flake = false;
}; cloudflare-ipv6.url = "https://www.cloudflare.com/ips-v6";
cloudflare-ipv6.flake = false;
wallpaper.url = "https://cdn.donmai.us/original/43/20/__kasane_teto_and_kasane_teto_utau_and_1_more_drawn_by_maguru_white__43204cf49ef8c071c34009553d1c0455.jpg";
wallpaper.flake = false;
}; };
} }

View file

@ -1,6 +1,7 @@
{ {
config, config,
vars, vars,
inputs,
... ...
}: let }: let
inherit (vars.common) domain; inherit (vars.common) domain;
@ -20,64 +21,34 @@ in {
services.caddy = { services.caddy = {
enable = true; enable = true;
globalConfig = "metrics"; globalConfig = "metrics";
virtualHosts = { virtualHosts = let
jellyfin = { mkPublicEntry = name: destination: {
useACMEHost = domain; useACMEHost = domain;
hostName = "jellyfin.${domain}:${toString caddyPort}"; hostName = "${name}.${domain}:${toString caddyPort}";
extraConfig = '' extraConfig = ''
@blocked not remote_ip ${builtins.replaceStrings ["\n"] [" "] (builtins.foldl' (res: ip-ver: "${res} ${builtins.readFile inputs."cloudflare-${ip-ver}".outPath}") "" ["ipv4" "ipv6"])}
respond @blocked "Access only allowed through cloudflare" 403
reverse_proxy { reverse_proxy {
header_up X-Forwarded-For {http.request.header.CF-Connecting-IP} header_up X-Forwarded-For {http.request.header.CF-Connecting-IP}
to ${bridge}:8096 to ${destination}
} }
''; '';
}; };
navidrome = { mkPrivateEntry = name: destination: {
useACMEHost = domain; hostName = "${name}.hopper.xun.host:80";
hostName = "navidrome.${domain}:${toString caddyPort}"; extraConfig = "reverse_proxy ${destination}";
extraConfig = ''
reverse_proxy unix//var/lib/navidrome/navidrome.sock
'';
};
slskd = {
hostName = "slskd.hopper.xun.host:80";
extraConfig = ''
reverse_proxy localhost:${toString config.services.slskd.settings.web.port}
'';
};
prometheus = {
hostName = "prometheus.hopper.xun.host:80";
extraConfig = ''
reverse_proxy ${bridge}:${toString config.services.prometheus.port}
'';
};
adguard = {
hostName = "adguard.hopper.xun.host:80";
extraConfig = ''
reverse_proxy ${bridge}:${toString config.services.adguardhome.port}
'';
};
transmission = {
hostName = "transmission.hopper.xun.host:80";
extraConfig = ''
reverse_proxy localhost:${toString config.services.transmission.settings.rpc-port}
'';
};
dash = {
hostName = "dash.hopper.xun.host:80";
extraConfig = ''
reverse_proxy ${bridge}:${toString config.services.homepage-dashboard.listenPort}
'';
};
vw = {
useACMEHost = domain;
hostName = "vw.${domain}:${toString caddyPort}";
extraConfig = ''
reverse_proxy {
header_up X-Real-Ip {http.request.header.CF-Connecting-IP}
to ${bridge}:${toString config.services.vaultwarden.config.ROCKET_PORT}
}
'';
}; };
in {
jellyfin = mkPublicEntry "jellyfin" "${bridge}:8096";
navidrome = mkPublicEntry "navidrome" "unix//var/lib/navidrome/navidrome.sock";
vaultwarden = mkPublicEntry "vw" "${bridge}:${toString config.services.vaultwarden.config.ROCKET_PORT}";
slskd = mkPrivateEntry "slskd" "localhost:${toString config.services.slskd.settings.web.port}";
prometheus = mkPrivateEntry "prometheus" "${bridge}:${toString config.services.prometheus.port}";
adguard = mkPrivateEntry "adguard" "${bridge}:${toString config.services.adguardhome.port}";
transmission = mkPrivateEntry "transmission" "localhost:${toString config.services.transmission.settings.rpc-port}";
dash = mkPrivateEntry "dash" "${bridge}:${toString config.services.homepage-dashboard.listenPort}";
other = { other = {
useACMEHost = domain; useACMEHost = domain;
hostName = ":${toString caddyPort}"; hostName = ":${toString caddyPort}";

View file

@ -6,11 +6,12 @@
services.vaultwarden = { services.vaultwarden = {
enable = true; enable = true;
config = { config = {
DOMAIN = "https://${config.services.caddy.virtualHosts.vw.hostName}"; DOMAIN = "https://${config.services.caddy.virtualHosts.vaultwarden.hostName}";
ROCKET_ADDRESS = "0.0.0.0"; ROCKET_ADDRESS = "0.0.0.0";
ROCKET_PORT = 35381; ROCKET_PORT = 35381;
ROCKET_LOG = "critical"; ROCKET_LOG = "critical";
SIGNUPS_ALLOWED = false; SIGNUPS_ALLOWED = false;
IP_HEADER = "X-Forwarded-For";
}; };
}; };