Compare commits
8 commits
main
...
temp-caddy
| Author | SHA1 | Date | |
|---|---|---|---|
| d6beb72f6f | |||
| 6427ffd9c3 | |||
| 796a42e70e | |||
| 76f19a2ac9 | |||
| 9e0412be5b | |||
| b432cac554 | |||
| 382e6e20a0 | |||
| 2b949f04ce |
4 changed files with 194 additions and 6 deletions
|
|
@ -23,6 +23,8 @@
|
||||||
url = "https://keys.openpgp.org/vks/v1/by-email/wekuz%40duck.com";
|
url = "https://keys.openpgp.org/vks/v1/by-email/wekuz%40duck.com";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
crowdsec-rewrite.url = "github:TornaxO7/nixpkgs/saltsprint";
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs =
|
outputs =
|
||||||
|
|
@ -37,6 +39,7 @@
|
||||||
nixosConfigurations = {
|
nixosConfigurations = {
|
||||||
plexy = nixpkgs.lib.nixosSystem {
|
plexy = nixpkgs.lib.nixosSystem {
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
|
specialArgs = { inherit inputs; };
|
||||||
modules = [
|
modules = [
|
||||||
./hosts/plexy
|
./hosts/plexy
|
||||||
home-manager.nixosModules.home-manager
|
home-manager.nixosModules.home-manager
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,21 @@
|
||||||
{
|
{
|
||||||
config,
|
config,
|
||||||
pkgs,
|
pkgs,
|
||||||
|
inputs,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
{
|
{
|
||||||
|
disabledModules = [
|
||||||
|
"services/security/crowdsec.nix"
|
||||||
|
"services/security/crowdsec-firewall-bouncer.nix"
|
||||||
|
];
|
||||||
|
|
||||||
imports = [
|
imports = [
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
./disko-config.nix
|
./disko-config.nix
|
||||||
|
"${inputs.crowdsec-rewrite}/nixos/modules/services/security/crowdsec.nix"
|
||||||
|
"${inputs.crowdsec-rewrite}/nixos/modules/services/security/crowdsec-firewall-bouncer.nix"
|
||||||
];
|
];
|
||||||
|
|
||||||
nix = {
|
nix = {
|
||||||
|
|
@ -96,6 +104,8 @@
|
||||||
secrets = {
|
secrets = {
|
||||||
"vaultwarden.env" = { };
|
"vaultwarden.env" = { };
|
||||||
"rsyncd.secrets" = { };
|
"rsyncd.secrets" = { };
|
||||||
|
"caddy.env" = { };
|
||||||
|
"crowdsec-console-token" = { };
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -143,6 +153,180 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
caddy = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.caddy.withPlugins {
|
||||||
|
plugins = [
|
||||||
|
"github.com/caddy-dns/cloudflare@v0.2.4"
|
||||||
|
"github.com/WeidiDeng/caddy-cloudflare-ip@v0.0.0-20231130002422-f53b62aa13cb"
|
||||||
|
"github.com/mholt/caddy-l4@v0.1.2"
|
||||||
|
"github.com/caddyserver/transform-encoder@v0.0.0-20260423033309-ba4124974830"
|
||||||
|
"github.com/hslatman/caddy-crowdsec-bouncer/http@v0.14.1"
|
||||||
|
"github.com/hslatman/caddy-crowdsec-bouncer/appsec@v0.14.1"
|
||||||
|
"github.com/hslatman/caddy-crowdsec-bouncer/layer4@v0.14.1"
|
||||||
|
];
|
||||||
|
hash = "sha256-5kC1Rcrgxco/26B4Tb6h7bictQ3j8rycxH+3Rr28Fa0=";
|
||||||
|
doInstallCheck = false; # Because caddy-crowdsec-bouncer plugins are in subdirectories
|
||||||
|
};
|
||||||
|
environmentFile = config.sops.secrets."caddy.env".path;
|
||||||
|
logFormat = ''
|
||||||
|
level INFO
|
||||||
|
'';
|
||||||
|
globalConfig = ''
|
||||||
|
grace_period 10s
|
||||||
|
servers {
|
||||||
|
trusted_proxies cloudflare {
|
||||||
|
interval 1h
|
||||||
|
timeout 20s
|
||||||
|
}
|
||||||
|
trusted_proxies_strict
|
||||||
|
client_ip_headers Cf-Connecting-Ip X-Forwarded-For
|
||||||
|
}
|
||||||
|
crowdsec {
|
||||||
|
api_url http://127.0.0.1:8080
|
||||||
|
api_key {$CROWDSEC_APIKEY}
|
||||||
|
ticker_interval 10s
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
extraConfig = ''
|
||||||
|
(proxy-route) {
|
||||||
|
route {
|
||||||
|
crowdsec
|
||||||
|
reverse_proxy {args[0]} {
|
||||||
|
# Strip intermediary proxies
|
||||||
|
header_up X-Forwarded-For {client_ip}
|
||||||
|
header_up X-Real-IP {client_ip}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
virtualHosts = {
|
||||||
|
"*.wekuz.localplayer.dev" = {
|
||||||
|
logFormat = ''
|
||||||
|
output stdout
|
||||||
|
format json
|
||||||
|
'';
|
||||||
|
extraConfig = ''
|
||||||
|
tls {
|
||||||
|
dns cloudflare {$CF_APIKEY}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
"glance.wekuz.localplayer.dev" = {
|
||||||
|
logFormat = null;
|
||||||
|
extraConfig = ''
|
||||||
|
import proxy-route http://localhost:15835
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
"vw.wekuz.localplayer.dev" = {
|
||||||
|
logFormat = null;
|
||||||
|
extraConfig = ''
|
||||||
|
import proxy-route http://192.168.1.111:15830
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
"lw.wekuz.localplayer.dev" = {
|
||||||
|
logFormat = null;
|
||||||
|
extraConfig = ''
|
||||||
|
import proxy-route http://192.168.1.111:15834
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
"git.wekuz.localplayer.dev" = {
|
||||||
|
logFormat = null;
|
||||||
|
extraConfig = ''
|
||||||
|
import proxy-route http://192.168.1.111:15836
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
"tv.wekuz.localplayer.dev" = {
|
||||||
|
logFormat = null;
|
||||||
|
extraConfig = ''
|
||||||
|
import proxy-route http://localhost:8096
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
"seerr.wekuz.localplayer.dev" = {
|
||||||
|
logFormat = null;
|
||||||
|
extraConfig = ''
|
||||||
|
import proxy-route http://localhost:5055
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
crowdsec = {
|
||||||
|
enable = true;
|
||||||
|
autoUpdateService = true;
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
console.enrollKeyFile = config.sops.secrets."crowdsec-console-token".path;
|
||||||
|
config = {
|
||||||
|
|
||||||
|
api.server = {
|
||||||
|
enable = true;
|
||||||
|
online_client.credentials_path = "/var/lib/crowdsec/online_api_credentials.yaml";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
acquisitions = [
|
||||||
|
{
|
||||||
|
source = "journalctl";
|
||||||
|
journalctl_filter = [ "_SYSTEMD_UNIT=sshd.service" ];
|
||||||
|
labels.type = "syslog";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
source = "journalctl";
|
||||||
|
journalctl_filter = [ "-k" ];
|
||||||
|
labels.type = "syslog";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
source = "journalctl";
|
||||||
|
journalctl_filter = [
|
||||||
|
"_SYSTEMD_UNIT=caddy.service"
|
||||||
|
"-o"
|
||||||
|
"cat"
|
||||||
|
];
|
||||||
|
labels.type = "caddy";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
source = "journalctl";
|
||||||
|
journalctl_filter = [ "_SYSTEMD_UNIT=vaultwarden.service" ];
|
||||||
|
labels.type = "Vaultwarden";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
source = "journalctl";
|
||||||
|
journalctl_filter = [ "_SYSTEMD_UNIT=jellyfin.service" ];
|
||||||
|
labels.type = "jellyfin";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
source = "journalctl";
|
||||||
|
journalctl_filter = [ "_SYSTEMD_UNIT=seerr.service" ];
|
||||||
|
labels.type = "seerr";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
hub.collections = [
|
||||||
|
"crowdsecurity/linux"
|
||||||
|
"crowdsecurity/sshd"
|
||||||
|
|
||||||
|
"crowdsecurity/base-http-scenarios"
|
||||||
|
"crowdsecurity/caddy"
|
||||||
|
|
||||||
|
"Dominic-Wagner/vaultwarden"
|
||||||
|
"LePresidente/jellyfin"
|
||||||
|
"LePresidente/jellyseerr"
|
||||||
|
|
||||||
|
"crowdsecurity/whitelist-good-actors"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
crowdsec-firewall-bouncer = {
|
||||||
|
enable = true;
|
||||||
|
registerBouncer.enable = false;
|
||||||
|
secrets.apiKeyPath = "/var/lib/crowdsec/firewall-bouncer-key";
|
||||||
|
};
|
||||||
vaultwarden = {
|
vaultwarden = {
|
||||||
enable = true;
|
enable = true;
|
||||||
environmentFile = config.sops.secrets."vaultwarden.env".path;
|
environmentFile = config.sops.secrets."vaultwarden.env".path;
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@
|
||||||
server = {
|
server = {
|
||||||
host = "0.0.0.0";
|
host = "0.0.0.0";
|
||||||
port = 15835;
|
port = 15835;
|
||||||
assets-path = "/var/lib/glance/assets";
|
|
||||||
};
|
};
|
||||||
theme = {
|
theme = {
|
||||||
light = false;
|
light = false;
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
vaultwarden.env: ENC[AES256_GCM,data:PLNb5cFoJaOyUo5U/gpXH0RGVwwQxL3kCE/OLw7MaLWazuBGHIPUEhH+kDMP2cfF916D63w8Ddgb/oH+lHGCw235YwgoqZ9yjWYPG4VB2Jdw+17LeCbirdh3zv8nNzFnSZDJmhz5Pj82+iswju6sYO/H7UfZ3aeASWonKW9LGHVltKSY1rAVhZRu4SvhqPiAxNpEzN0/EDTl46RIxrgEoUraN+Ie8fh1wU9SKevExkPU3NXGO1gG2tWRxclMPgc=,iv:es40/5HpBAhOy2xmU/yCUD43fVVsAXk6qJ3OasKjK3U=,tag:bneErU9pPZkQ2VzbQ1NrJA==,type:str]
|
vaultwarden.env: ENC[AES256_GCM,data:PLNb5cFoJaOyUo5U/gpXH0RGVwwQxL3kCE/OLw7MaLWazuBGHIPUEhH+kDMP2cfF916D63w8Ddgb/oH+lHGCw235YwgoqZ9yjWYPG4VB2Jdw+17LeCbirdh3zv8nNzFnSZDJmhz5Pj82+iswju6sYO/H7UfZ3aeASWonKW9LGHVltKSY1rAVhZRu4SvhqPiAxNpEzN0/EDTl46RIxrgEoUraN+Ie8fh1wU9SKevExkPU3NXGO1gG2tWRxclMPgc=,iv:es40/5HpBAhOy2xmU/yCUD43fVVsAXk6qJ3OasKjK3U=,tag:bneErU9pPZkQ2VzbQ1NrJA==,type:str]
|
||||||
rsyncd.secrets: ENC[AES256_GCM,data:VjHRoZa6/lDtCheKSJyM,iv:kxygNaKOuK0iH/bFY/uKxcbMcYSR8nWDUx+4aDNqTMk=,tag:uYYPWAPCWtvLLGwmOWyH+A==,type:str]
|
rsyncd.secrets: ENC[AES256_GCM,data:VjHRoZa6/lDtCheKSJyM,iv:kxygNaKOuK0iH/bFY/uKxcbMcYSR8nWDUx+4aDNqTMk=,tag:uYYPWAPCWtvLLGwmOWyH+A==,type:str]
|
||||||
|
caddy.env: ENC[AES256_GCM,data:xzYvGvtu1DDBWvcLmohHUAOTNQfUuLbOJ18UPgLokkWlzf7peNgN3Qt9A/ZCuEm5cg4PLtJy0LYbWk6ykm20vgDW+TmouJ8dxqwSDvJHdmnhoPYCfu0KA1d3iHPL5f8unqXxxhAbcfp0VSzxUo685on9Aw==,iv:E+o8dJ+t4BPuoiEfkTaOO6lVDAZnG9D1btNYN9oX3ek=,tag:oar1at1PkK4tgIDIXCyXrg==,type:str]
|
||||||
|
crowdsec-console-token: ENC[AES256_GCM,data:0K2kGXAf7uPhSRSRBIQ5cWjtp9l5oEcCSJg=,iv:O11ZhGU3bM+Ao5IUW0/sKT3L0CTeMsRpJTrCya6T674=,tag:R064lQrFBAIi33N4YVB/5Q==,type:str]
|
||||||
sops:
|
sops:
|
||||||
age:
|
age:
|
||||||
- recipient: age1sqssntfzzlhcgp0wuf9wmeavg0hmwmq349npsq8vaxj9sxey5s9ssc82sw
|
- enc: |
|
||||||
enc: |
|
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBXSERvcGNXdDlUb3NBUm40
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBXSERvcGNXdDlUb3NBUm40
|
||||||
WW1mVlY5YlpxclBxT3htQ1orbHpxTnBUTEJNCkZaZnUzZUZNQmk0RmU2U2RkOUVI
|
WW1mVlY5YlpxclBxT3htQ1orbHpxTnBUTEJNCkZaZnUzZUZNQmk0RmU2U2RkOUVI
|
||||||
|
|
@ -11,7 +12,8 @@ sops:
|
||||||
eDUxR1V0ZEFSYnZTYnYzakFydEliaFUKoa/gHecAy01vTk7I02KMGGPHZBql5K48
|
eDUxR1V0ZEFSYnZTYnYzakFydEliaFUKoa/gHecAy01vTk7I02KMGGPHZBql5K48
|
||||||
hkLDjoWK9dkGRX8kqRd028cuMCQRenLpULEECWp6oV+evUdMf7wRtg==
|
hkLDjoWK9dkGRX8kqRd028cuMCQRenLpULEECWp6oV+evUdMf7wRtg==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
lastmodified: "2026-04-03T15:46:07Z"
|
recipient: age1sqssntfzzlhcgp0wuf9wmeavg0hmwmq349npsq8vaxj9sxey5s9ssc82sw
|
||||||
mac: ENC[AES256_GCM,data:gh9Voy28Lo4G1qwQ7/WVAt/L3SAXIY5bs5fdCE0Oywi0ZV4YTJI5VCAcfxuE0Fc3DXdHF0/LORGjKa2l0yp5msMdBVpzI46FBiwYvU+w7EfEoEmhu0yMLf0SZmXkVLEq8u2uVFHGVbR1dOKcdFef+qTIGTlz4cE9VQ01xg/nh7g=,iv:fasXOAm2hjB4ULKT4vPOFnFpAcEgSeNvNM7Zrnk6MvM=,tag:1hWtpuTVdC3H8flA1m0Z0A==,type:str]
|
lastmodified: "2026-08-14T15:56:25Z"
|
||||||
|
mac: ENC[AES256_GCM,data:Y0rf6PzXBXgV4J8Zjs73L3Fvl96o/AMFXAqe/FN3w68yIbKvClDegiF2V5SQwpYchcr7xN9Qxwcl+5/OnF6wIoyOa4b94xmwd1ZKMU4MM2omFaT5mUov0lW26PkAGbB8ioMiCjibdXHnFVJMKHYO2cuMfTo3YH1nOUMuQvCQGyg=,iv:aatrE+/Wa5VGHVswrkh6PBkoCi19FBttVJJXZ/JG2+Q=,tag:KAk6sk5NmdB6nwx493hUQw==,type:str]
|
||||||
unencrypted_suffix: _unencrypted
|
unencrypted_suffix: _unencrypted
|
||||||
version: 3.12.2
|
version: 3.13.3
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue