My Nix Configuration

[prefect.caddy] Move from standalone caddyfile to evaluated with Nix

pyrox.dev 5cfe24c2 e197f1af

verified
Changed files
+166 -182
systems
x86_64-linux
prefect
services
-178
systems/x86_64-linux/prefect/services/Caddyfile
···
-
{
-
email pyrox@pyrox.dev
-
}
-
thehedgehog.me {
-
redir https://pyrox.dev{uri} permanent
-
}
-
pyrox.dev {
-
route {
-
header /.well-known/matrix/* Access-Control-Allow-Origin *
-
reverse_proxy /.well-known/matrix/* http://100.123.15.72:6922
-
redir /.well-known/carddav https://cloud.pyrox.dev/.well-known/carddav temporary
-
redir /.well-known/caldav https://cloud.pyrox.dev/.well-known/caldav temporary
-
header /.well-known/openpgpkey/* Access-Control-Allow-Origin *
-
header /.well-known/openpgpkey/hu/* application/octet-stream
-
respond /.well-known/openpgpkey/*/policy 200
-
header /.well-known/fursona Content-Type application/json
-
header {
-
X-Content-Type-Options nosniff
-
Permissions-Policy accelerometer=(), autoplay=(), camera=(), cross-origin-isolated=(), unload=(),
-
+Permissions-Policy display-capture=(), encrypted-media=(), fullscreen=(), geolocation=(),
-
+Permissions-Policy gyroscope=(), keyboard-map=(), magnetometer=(), microphone=(), midi=(),
-
+Permissions-Policy payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(),
-
+Permissions-Policy sync-xhr=(self), usb=(), web-share=(), xr-spatial-tracking=(), clipboard-read=(),
-
+Permissions-Policy clipboard-write=(), gamepad=(), hid=(), idle-detection=(), interest-cohort=(), serial=()
-
X-Frame-Options SAMEORIGIN
-
Referrer-Policy origin
-
-Server
-
}
-
file_server {
-
root /var/www/blog
-
hide .git
-
precompressed br gzip
-
}
-
}
-
}
-
-
www.pyrox.dev {
-
redir https://pyrox.dev{uri} permanent
-
}
-
-
# Authentik - Self-hosted OIDC and LDAP server
-
auth.pyrox.dev:443 {
-
reverse_proxy http://100.123.15.72:6908
-
}
-
auth.pyrox.dev:80 {
-
reverse_proxy http://100.123.15.72:6908
-
}
-
http://auth.pyrox.dev:389 {
-
reverse_proxy http://100.123.15.72:389
-
}
-
auth.pyrox.dev:636 {
-
reverse_proxy http://100.123.15.72:636
-
}
-
-
blog.pyrox.dev {
-
redir https://pyrox.dev{uri} permanent
-
}
-
-
# Vaultwarden - Self-Hosted Bitwarden Server
-
bw.pyrox.dev {
-
reverse_proxy 100.123.15.72:6912 {
-
header_up X-Real-IP {remote_host}
-
}
-
}
-
-
cloud.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6926
-
}
-
-
# Deemix - download music from Deezer
-
deemix.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6907
-
}
-
-
# Gitea(Forgejo) - Self-hosted Git forge
-
git.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6904
-
}
-
-
library.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6921
-
}
-
-
mail.pyrox.dev {
-
}
-
-
# Cinny: Elegant matrix client
-
# Also has Dendrite for matrix server
-
matrix.pyrox.dev {
-
@index {
-
not path /index.html
-
not path /public/*
-
not path /assets/*
-
not path /config.json
-
not path /manifest.json
-
not path /pdf.worker.min.js
-
not path /olm.wasm
-
path /*
-
}
-
handle /_matrix/* {
-
reverse_proxy http://100.123.15.72:6922
-
}
-
handle {
-
root * /var/www/cinny/dist/
-
redir /*/olm.wasm /olm.wasm
-
redir @index /index.html
-
file_server
-
}
-
}
-
-
# Jellyfin - Self-hosted media server
-
media.pyrox.dev {
-
@blocked not remote_ip 100.64.0.0/10 private_ranges
-
reverse_proxy http://100.123.15.72:8096
-
handle /metrics* {
-
respond @blocked "Access Denied" 403
-
}
-
}
-
-
mta-sts.pyrox.dev {
-
header Content-Type text/plain; charset=utf-8
-
respond /.well-known/mta-sts.txt <<END
-
version: STSv1
-
mode: enforce
-
mx: mail.pyrox.dev
-
mx:mail2.pyrox.dev
-
max_age: 2419200
-
END 200
-
}
-
-
office.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6927
-
}
-
-
# Miniflux
-
rss.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6903
-
}
-
-
# Iceshrimp
-
soc.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6923
-
}
-
-
# Grafana - stats dashboard
-
stats.pyrox.dev {
-
reverse_proxy http://100.123.15.72:6914
-
}
-
-
# Yourmother.website - The best rick-roll URL, period
-
yourmother.website {
-
header Content-Type text/html
-
respond 200 {
-
body `<!DOCTYPE html>
-
<html>
-
<head>
-
<meta http-equiv="Refresh" content="0; url=https://youtube.com/watch?v=oHg5SJYRHA0" />
-
</head>
-
</html>`
-
}
-
}
-
-
plan.cs2a.club {
-
reverse_proxy http://100.123.15.72:6929
-
}
-
-
# OpenPGP Key
-
openpgpkey.thehedgehog.me, openpgpkey.pyrox.dev {
-
respond /.well-known/openpgpkey/{labels.1}.{labels.0}/policy 200
-
header Access-Control-Allow-Origin *
-
header /.well-known/openpgpkey/{labels.1}.{labels.0}/hu/* Content-Type application/octet-stream
-
file_server {
-
root /var/www/blog/
-
}
-
}
-
:6899 {
-
metrics /metrics
-
}
+166 -4
systems/x86_64-linux/prefect/services/caddy.nix
···
-
{ pkgs, ... }:
-
{
+
{ pkgs, lib, ... }: let
+
pns = lib.py.data.services;
+
marvin = lib.py.data.hosts.marvin.ts.ip4;
+
reverseProxyToMarvin = port: {
+
extraConfig = ''
+
reverse_proxy http://${marvin}:${toString port}
+
'';
+
};
+
# Hosts that are just a reverse proxy declaration and nothing else
+
simpleHosts = [
+
"nextcloud"
+
"nextcloud-office"
+
"git"
+
"miniflux"
+
"iceshrimp"
+
"grafana"
+
"deemix"
+
"planka"
+
];
+
+
simpleHostAttrs = lib.mapAttrs' (name: value: lib.nameValuePair "${pns.${name}.extUrl}" (reverseProxyToMarvin (toString pns.${value}.port)))
+
(lib.genAttrs simpleHosts (name: name));
+
in {
services.caddy = {
enable = true;
package = pkgs.caddy.withPlugins {
···
];
hash = "sha256-nfBjtwqn7UOGRr5Aqy0y1u9AYhWU9TLjbdhZ9uAwtHY=";
};
-
configFile = ./Caddyfile;
-
adapter = "caddyfile";
+
email = "pyrox@pyrox.dev";
+
virtualHosts = {
+
# Just get TLS certs for mailserver
+
"mail.pyrox.dev" = {};
+
# Redirect old domains -> pyrox.dev
+
"blog.pyrox.dev" = {
+
serverAliases = ["www.pyrox.dev" "thehedgehog.me"];
+
extraConfig = ''
+
redir https://pyrox.dev{uri} permanent
+
'';
+
};
+
"pyrox.dev" = {
+
extraConfig = ''
+
route {
+
header /.well-known/matrix/* Access-Control-Allow-Origin *
+
reverse_proxy /.well-known/matrix/* http://100.123.15.72:6922
+
redir /.well-known/carddav https://cloud.pyrox.dev/.well-known/carddav temporary
+
redir /.well-known/caldav https://cloud.pyrox.dev/.well-known/caldav temporary
+
header /.well-known/openpgpkey/* Access-Control-Allow-Origin *
+
header /.well-known/openpgpkey/hu/* application/octet-stream
+
respond /.well-known/openpgpkey/*/policy 200
+
header /.well-known/fursona Content-Type application/json
+
header {
+
X-Content-Type-Options nosniff
+
Permissions-Policy accelerometer=(), autoplay=(), camera=(), cross-origin-isolated=(), unload=(),
+
+Permissions-Policy display-capture=(), encrypted-media=(), fullscreen=(), geolocation=(),
+
+Permissions-Policy gyroscope=(), keyboard-map=(), magnetometer=(), microphone=(), midi=(),
+
+Permissions-Policy payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(),
+
+Permissions-Policy sync-xhr=(self), usb=(), web-share=(), xr-spatial-tracking=(), clipboard-read=(),
+
+Permissions-Policy clipboard-write=(), gamepad=(), hid=(), idle-detection=(), interest-cohort=(), serial=()
+
X-Frame-Options SAMEORIGIN
+
Referrer-Policy origin
+
-Server
+
}
+
file_server {
+
root /var/www/blog
+
hide .git
+
precompressed br gzip
+
}
+
}
+
'';
+
};
+
+
# Authentik
+
"${pns.authentik.extUrl}:443" = reverseProxyToMarvin pns.authentik.port;
+
"${pns.authentik.extUrl}:80" = reverseProxyToMarvin pns.authentik.port;
+
"http://${pns.authentik.extUrl}:389" = reverseProxyToMarvin 389;
+
"${pns.authentik.extUrl}:636" = reverseProxyToMarvin 636;
+
+
# Vaultwarden
+
${pns.vaultwarden.extUrl} = {
+
extraConfig = ''
+
header / {
+
Strict-Transport-Security "max-age=31536000;"
+
X-XSS-Protection "0"
+
X-Frame-Options "DENY"
+
X-Robots-Tag "noindex, nofollow"
+
X-Content-Type-Options "nosniff"
+
-Server
+
-X-Powered-By
+
-Last-Modified
+
}
+
reverse_proxy ${marvin}:${toString pns.vaultwarden.port} {
+
header_up X-Real-IP {remote_host}
+
}
+
'';
+
};
+
+
# Cinny + Conduit
+
${pns.matrix-server.extUrl} = {
+
extraConfig = ''
+
handle /_matrix/* {
+
reverse_proxy http://100.123.15.72:6922
+
}
+
@nativeRouter not file {path} /
+
handle {
+
rewrite @nativeRouter {http.matchers.file.relative}
+
root * /var/www/cinny/dist
+
file_server
+
}
+
'';
+
};
+
+
# Jellyfin
+
${pns.jellyfin.extUrl} = {
+
extraConfig = ''
+
@blocked not remote_ip 100.64.0.0/10 private_ranges
+
reverse_proxy http://${marvin}:${toString pns.jellyfin.port}
+
handle /metrics* {
+
respond @blocked "Access Denied" 403
+
}
+
'';
+
};
+
+
# MTA-STS Setup for mailserver
+
"mta-sts.pyrox.dev" = {
+
extraConfig = ''
+
header Content-Type text/plain; charset=utf-8
+
respond /.well-known/mta-sts.txt <<END
+
version: STSv1
+
mode: enforce
+
mx: mail.pyrox.dev
+
mx:mail2.pyrox.dev
+
max_age: 2419200
+
END 200
+
'';
+
};
+
+
# Yourmother.website
+
"yourmother.website" = {
+
extraConfig = ''
+
header Content-Type text/html
+
respond 200 {
+
body `<!DOCTYPE html>
+
<html>
+
<head>
+
<meta http-equiv="Refresh" content="0; url=https://youtube.com/watch?v=oHg5SJYRHA0" />
+
</head>
+
</html>`
+
}
+
'';
+
};
+
+
# OpenPGP WKD stuff
+
"openpgpkey.pyrox.dev" = {
+
serverAliases = [ "openpgpkey.thehedgehog.me" ];
+
extraConfig = ''
+
respond /.well-known/openpgpkey/{labels.1}.{labels.0}/policy 200
+
header Access-Control-Allow-Origin *
+
header /.well-known/openpgpkey/{labels.1}.{labels.0}/hu/* Content-Type application/octet-stream
+
file_server {
+
root /var/www/blog/
+
}
+
'';
+
};
+
+
# Metrics
+
":6899" = {
+
extraConfig = ''
+
metrics /metrics
+
'';
+
};
+
} // simpleHostAttrs;
};
systemd.services.caddy.serviceConfig.CapabilityBoundingSet = "CAP_NET_BIND_SERVICE";
systemd.services.caddy.serviceConfig.AmbientCapabilities = "CAP_NET_BIND_SERVICE";