Compare commits
10 Commits
0659809c22
...
f8c7183594
Author | SHA1 | Date | |
---|---|---|---|
f8c7183594 | |||
17324455de | |||
a94c778e10 | |||
4f8bdc1219 | |||
02eb96fe46 | |||
14f1f5b575 | |||
9df8a450e8 | |||
7b9045586f | |||
3f01baae38 | |||
2dbc8b398b |
@ -15,7 +15,7 @@ in
|
|||||||
experimental-features = nix-command flakes ca-derivations repl-flake
|
experimental-features = nix-command flakes ca-derivations repl-flake
|
||||||
#substituters = https://nix-cache.nul.ie https://cache.nixos.org
|
#substituters = https://nix-cache.nul.ie https://cache.nixos.org
|
||||||
substituters = https://cache.nixos.org
|
substituters = https://cache.nixos.org
|
||||||
trusted-public-keys = ${concatStringsSep " " lib.my.nix.cacheKeys}
|
trusted-public-keys = ${concatStringsSep " " lib.my.c.nix.cacheKeys}
|
||||||
'');
|
'');
|
||||||
|
|
||||||
INSTALLER_SSH_OPTS = "-i .keys/deploy.key";
|
INSTALLER_SSH_OPTS = "-i .keys/deploy.key";
|
||||||
|
@ -240,13 +240,13 @@ in
|
|||||||
#"https://nix-cache.nul.ie"
|
#"https://nix-cache.nul.ie"
|
||||||
"https://cache.nixos.org"
|
"https://cache.nixos.org"
|
||||||
];
|
];
|
||||||
trusted-public-keys = lib.my.nix.cacheKeys;
|
trusted-public-keys = lib.my.c.nix.cacheKeys;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
(mkIf config.my.isStandalone {
|
(mkIf config.my.isStandalone {
|
||||||
my = {
|
my = {
|
||||||
ssh.authKeys.files = [ lib.my.sshKeyFiles.me ];
|
ssh.authKeys.files = [ lib.my.c.sshKeyFiles.me ];
|
||||||
};
|
};
|
||||||
|
|
||||||
nix.package = mkIf (versionAtLeast config.home.stateVersion "22.05") pkgs.nix;
|
nix.package = mkIf (versionAtLeast config.home.stateVersion "22.05") pkgs.nix;
|
||||||
|
108
lib/constants.nix
Normal file
108
lib/constants.nix
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
{ lib }: rec {
|
||||||
|
# See https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/misc/ids.nix
|
||||||
|
ids = {
|
||||||
|
uids = {
|
||||||
|
matrix-syncv3 = 400;
|
||||||
|
gitea-runner = 401;
|
||||||
|
};
|
||||||
|
gids = {
|
||||||
|
matrix-syncv3 = 400;
|
||||||
|
gitea-runner = 401;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
nginx = {
|
||||||
|
proxyHeaders = ''
|
||||||
|
# Setting any proxy_header in a child (e.g. location) will nuke the parents...
|
||||||
|
proxy_set_header X-Origin-URI $request_uri;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Host $http_host;
|
||||||
|
proxy_set_header X-Forwarded-Host $http_host;
|
||||||
|
proxy_set_header X-Forwarded-Server $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Forwarded-Protocol $scheme;
|
||||||
|
proxy_set_header X-Scheme $scheme;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
nix = {
|
||||||
|
cacheKeys = [
|
||||||
|
"nix-cache.nul.ie-1:XofkqdHQSGFoPjB6aRohQbCU2ILKFqhNjWfoOdQgF5Y="
|
||||||
|
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
pubDomain = "nul.ie";
|
||||||
|
colony = {
|
||||||
|
domain = "ams1.int.${pubDomain}";
|
||||||
|
prefixes = with lib.my.net.cidr; rec {
|
||||||
|
all = {
|
||||||
|
v4 = "10.100.0.0/16";
|
||||||
|
v6 = "2a0e:97c0:4d2:10::/60";
|
||||||
|
};
|
||||||
|
base = {
|
||||||
|
v4 = subnet 8 0 all.v4;
|
||||||
|
v6 = subnet 4 0 all.v6;
|
||||||
|
};
|
||||||
|
vms = {
|
||||||
|
v4 = subnet 8 1 all.v4;
|
||||||
|
v6 = subnet 4 1 all.v6;
|
||||||
|
};
|
||||||
|
ctrs = {
|
||||||
|
v4 = subnet 8 2 all.v4;
|
||||||
|
v6 = subnet 4 2 all.v6;
|
||||||
|
};
|
||||||
|
oci = {
|
||||||
|
v4 = subnet 8 3 all.v4;
|
||||||
|
v6 = subnet 4 3 all.v6;
|
||||||
|
};
|
||||||
|
|
||||||
|
cust = {
|
||||||
|
v4 = subnet 8 100 all.v4; # single ip for routing only
|
||||||
|
v6 = "2a0e:97c0:4d2:2000::/56";
|
||||||
|
};
|
||||||
|
mail = {
|
||||||
|
v4 = "94.142.241.227/32";
|
||||||
|
v6 = subnet 8 0 cust.v6;
|
||||||
|
};
|
||||||
|
darts = {
|
||||||
|
v4 = "94.142.242.255/32";
|
||||||
|
v6 = subnet 8 1 cust.v6;
|
||||||
|
};
|
||||||
|
|
||||||
|
vip1 = "94.142.241.224/30";
|
||||||
|
vip2 = "94.142.242.254/31";
|
||||||
|
};
|
||||||
|
fstrimConfig = {
|
||||||
|
enable = true;
|
||||||
|
# backup happens at 05:00
|
||||||
|
interval = "04:45";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
kelder = {
|
||||||
|
groups = {
|
||||||
|
storage = 2000;
|
||||||
|
media = 2010;
|
||||||
|
};
|
||||||
|
|
||||||
|
domain = "hentai.engineer";
|
||||||
|
vpn = {
|
||||||
|
port = 51820;
|
||||||
|
};
|
||||||
|
prefixes = with lib.my.net.cidr; rec {
|
||||||
|
all.v4 = "172.16.64.0/20";
|
||||||
|
ctrs.v4 = subnet 4 0 all.v4;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
sshKeyFiles = {
|
||||||
|
me = ../.keys/me.pub;
|
||||||
|
deploy = ../.keys/deploy.pub;
|
||||||
|
rsyncNet = ../.keys/zh2855.rsync.net.pub;
|
||||||
|
mailcowAcme = ../.keys/mailcow-acme.pub;
|
||||||
|
};
|
||||||
|
sshHostKeys = {
|
||||||
|
mail-vm = ../.keys/mail-vm-host.pub;
|
||||||
|
};
|
||||||
|
}
|
102
lib/default.nix
102
lib/default.nix
@ -1,9 +1,9 @@
|
|||||||
{ lib }:
|
{ lib }:
|
||||||
let
|
let
|
||||||
inherit (builtins) length match replaceStrings elemAt mapAttrs head split filter;
|
inherit (builtins) length match elemAt filter;
|
||||||
inherit (lib)
|
inherit (lib)
|
||||||
genAttrs mapAttrs' mapAttrsToList filterAttrsRecursive nameValuePair types
|
genAttrs mapAttrsToList filterAttrsRecursive nameValuePair types
|
||||||
mkOption mkOverride mkForce mkIf mergeEqualOption optional hasPrefix
|
mkOption mkOverride mkForce mkIf mergeEqualOption optional
|
||||||
showWarnings concatStringsSep flatten unique;
|
showWarnings concatStringsSep flatten unique;
|
||||||
inherit (lib.flake) defaultSystems;
|
inherit (lib.flake) defaultSystems;
|
||||||
in
|
in
|
||||||
@ -12,6 +12,7 @@ rec {
|
|||||||
|
|
||||||
inherit (import ./net.nix { inherit lib; }) net;
|
inherit (import ./net.nix { inherit lib; }) net;
|
||||||
dns = import ./dns.nix { inherit lib; };
|
dns = import ./dns.nix { inherit lib; };
|
||||||
|
c = import ./constants.nix { inherit lib; };
|
||||||
|
|
||||||
# Yoinked from nixpkgs/nixos/modules/services/networking/nat.nix
|
# Yoinked from nixpkgs/nixos/modules/services/networking/nat.nix
|
||||||
isIPv6 = ip: length (lib.splitString ":" ip) > 2;
|
isIPv6 = ip: length (lib.splitString ":" ip) > 2;
|
||||||
@ -128,6 +129,8 @@ rec {
|
|||||||
UseDomains = true;
|
UseDomains = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
dockerNetAssignment =
|
||||||
|
assignments: name: with assignments."${name}".internal; "ip=${ipv4.address},ip=${ipv6.address}";
|
||||||
|
|
||||||
systemdAwaitPostgres = pkg: host: {
|
systemdAwaitPostgres = pkg: host: {
|
||||||
after = [ "systemd-networkd-wait-online.service" ];
|
after = [ "systemd-networkd-wait-online.service" ];
|
||||||
@ -185,97 +188,4 @@ rec {
|
|||||||
|
|
||||||
filterOpts = filterAttrsRecursive (_: v: v != null);
|
filterOpts = filterAttrsRecursive (_: v: v != null);
|
||||||
};
|
};
|
||||||
|
|
||||||
nginx = {
|
|
||||||
proxyHeaders = ''
|
|
||||||
# Setting any proxy_header in a child (e.g. location) will nuke the parents...
|
|
||||||
proxy_set_header X-Origin-URI $request_uri;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Host $http_host;
|
|
||||||
proxy_set_header X-Forwarded-Host $http_host;
|
|
||||||
proxy_set_header X-Forwarded-Server $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_set_header X-Forwarded-Protocol $scheme;
|
|
||||||
proxy_set_header X-Scheme $scheme;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
nix = {
|
|
||||||
cacheKeys = [
|
|
||||||
"nix-cache.nul.ie-1:XofkqdHQSGFoPjB6aRohQbCU2ILKFqhNjWfoOdQgF5Y="
|
|
||||||
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
pubDomain = "nul.ie";
|
|
||||||
dockerNetAssignment =
|
|
||||||
assignments: name: with assignments."${name}".internal; "ip=${ipv4.address},ip=${ipv6.address}";
|
|
||||||
colony = {
|
|
||||||
domain = "ams1.int.${pubDomain}";
|
|
||||||
prefixes = with net.cidr; rec {
|
|
||||||
all = {
|
|
||||||
v4 = "10.100.0.0/16";
|
|
||||||
v6 = "2a0e:97c0:4d2:10::/60";
|
|
||||||
};
|
|
||||||
base = {
|
|
||||||
v4 = subnet 8 0 all.v4;
|
|
||||||
v6 = subnet 4 0 all.v6;
|
|
||||||
};
|
|
||||||
vms = {
|
|
||||||
v4 = subnet 8 1 all.v4;
|
|
||||||
v6 = subnet 4 1 all.v6;
|
|
||||||
};
|
|
||||||
ctrs = {
|
|
||||||
v4 = subnet 8 2 all.v4;
|
|
||||||
v6 = subnet 4 2 all.v6;
|
|
||||||
};
|
|
||||||
oci = {
|
|
||||||
v4 = subnet 8 3 all.v4;
|
|
||||||
v6 = subnet 4 3 all.v6;
|
|
||||||
};
|
|
||||||
|
|
||||||
cust = {
|
|
||||||
v4 = subnet 8 100 all.v4; # single ip for routing only
|
|
||||||
v6 = "2a0e:97c0:4d2:2000::/56";
|
|
||||||
};
|
|
||||||
mail = {
|
|
||||||
v4 = "94.142.241.227/32";
|
|
||||||
v6 = subnet 8 0 cust.v6;
|
|
||||||
};
|
|
||||||
|
|
||||||
vip1 = "94.142.241.224/30";
|
|
||||||
vip2 = "94.142.242.254/31";
|
|
||||||
};
|
|
||||||
fstrimConfig = {
|
|
||||||
enable = true;
|
|
||||||
# backup happens at 05:00
|
|
||||||
interval = "04:45";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
kelder = {
|
|
||||||
groups = {
|
|
||||||
storage = 2000;
|
|
||||||
media = 2010;
|
|
||||||
};
|
|
||||||
|
|
||||||
domain = "hentai.engineer";
|
|
||||||
vpn = {
|
|
||||||
port = 51820;
|
|
||||||
};
|
|
||||||
prefixes = with net.cidr; rec {
|
|
||||||
all.v4 = "172.16.64.0/20";
|
|
||||||
ctrs.v4 = subnet 4 0 all.v4;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
sshKeyFiles = {
|
|
||||||
me = ../.keys/me.pub;
|
|
||||||
deploy = ../.keys/deploy.pub;
|
|
||||||
rsyncNet = ../.keys/zh2855.rsync.net.pub;
|
|
||||||
mailcowAcme = ../.keys/mailcow-acme.pub;
|
|
||||||
};
|
|
||||||
sshHostKeys = {
|
|
||||||
mail-vm = ../.keys/mail-vm-host.pub;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
networking = {
|
networking = {
|
||||||
domain = "h.${lib.my.pubDomain}";
|
domain = "h.${lib.my.c.pubDomain}";
|
||||||
firewall.enable = false;
|
firewall.enable = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.colony) domain prefixes;
|
inherit (lib.my.c.colony) domain prefixes;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./vms ];
|
imports = [ ./vms ];
|
||||||
@ -53,6 +53,7 @@ in
|
|||||||
cpu = {
|
cpu = {
|
||||||
amd.updateMicrocode = true;
|
amd.updateMicrocode = true;
|
||||||
};
|
};
|
||||||
|
rasdaemon.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
boot = {
|
boot = {
|
||||||
@ -93,11 +94,11 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
programs.ssh.knownHostsFiles = [
|
programs.ssh.knownHostsFiles = [
|
||||||
lib.my.sshKeyFiles.rsyncNet
|
lib.my.c.sshKeyFiles.rsyncNet
|
||||||
];
|
];
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
fstrim = lib.my.colony.fstrimConfig;
|
fstrim = lib.my.c.colony.fstrimConfig;
|
||||||
lvm = {
|
lvm = {
|
||||||
boot.thin.enable = true;
|
boot.thin.enable = true;
|
||||||
dmeventd.enable = true;
|
dmeventd.enable = true;
|
||||||
@ -137,6 +138,23 @@ in
|
|||||||
"serial-getty@ttyS0".enable = true;
|
"serial-getty@ttyS0".enable = true;
|
||||||
"serial-getty@ttyS1".enable = true;
|
"serial-getty@ttyS1".enable = true;
|
||||||
|
|
||||||
|
rsync-lvm-meta = {
|
||||||
|
description = "rsync lvm metadata backups / archives to rsync.net";
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
|
||||||
|
# Only run when no other process is using CPU or disk
|
||||||
|
CPUSchedulingPolicy = "idle";
|
||||||
|
IOSchedulingClass = "idle";
|
||||||
|
};
|
||||||
|
script = ''
|
||||||
|
${pkgs.rsync}/bin/rsync -av --delete --delete-after \
|
||||||
|
-e "${pkgs.openssh}/bin/ssh -i ${config.age.secrets."colony/rsync.key".path}" \
|
||||||
|
/etc/lvm/{archive,backup} zh2855@zh2855.rsync.net:colony/lvm/
|
||||||
|
'';
|
||||||
|
wantedBy = [ "borgthin-job-main.service" ];
|
||||||
|
after = [ "borgthin-job-main.service" ];
|
||||||
|
};
|
||||||
borgthin-rsync = {
|
borgthin-rsync = {
|
||||||
description = "rsync borgthin backups to rsync.net";
|
description = "rsync borgthin backups to rsync.net";
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
@ -214,16 +232,16 @@ in
|
|||||||
};
|
};
|
||||||
ipv6Prefixes = [
|
ipv6Prefixes = [
|
||||||
{
|
{
|
||||||
ipv6PrefixConfig.Prefix = lib.my.colony.prefixes.vms.v6;
|
ipv6PrefixConfig.Prefix = prefixes.vms.v6;
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
routes = map (r: { routeConfig = r; }) [
|
routes = map (r: { routeConfig = r; }) [
|
||||||
{
|
{
|
||||||
Destination = lib.my.colony.prefixes.ctrs.v4;
|
Destination = prefixes.ctrs.v4;
|
||||||
Gateway = allAssignments.shill.routing.ipv4.address;
|
Gateway = allAssignments.shill.routing.ipv4.address;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
Destination = lib.my.colony.prefixes.ctrs.v6;
|
Destination = prefixes.ctrs.v6;
|
||||||
Gateway = allAssignments.shill.internal.ipv6.address;
|
Gateway = allAssignments.shill.internal.ipv6.address;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@ -232,11 +250,11 @@ in
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
Destination = lib.my.colony.prefixes.oci.v4;
|
Destination = prefixes.oci.v4;
|
||||||
Gateway = allAssignments.whale2.routing.ipv4.address;
|
Gateway = allAssignments.whale2.routing.ipv4.address;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
Destination = lib.my.colony.prefixes.oci.v6;
|
Destination = prefixes.oci.v6;
|
||||||
Gateway = allAssignments.whale2.internal.ipv6.address;
|
Gateway = allAssignments.whale2.internal.ipv6.address;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@ -275,6 +293,29 @@ in
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
"90-vm-darts" = {
|
||||||
|
matchConfig.Name = "vm-darts";
|
||||||
|
address = [
|
||||||
|
(net.cidr.subnet 8 2 prefixes.cust.v4)
|
||||||
|
prefixes.darts.v6
|
||||||
|
];
|
||||||
|
networkConfig = {
|
||||||
|
IPv6AcceptRA = false;
|
||||||
|
IPv6SendRA = true;
|
||||||
|
};
|
||||||
|
ipv6Prefixes = [
|
||||||
|
{
|
||||||
|
ipv6PrefixConfig.Prefix = prefixes.darts.v6;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
routes = map (r: { routeConfig = r; }) [
|
||||||
|
{
|
||||||
|
Destination = prefixes.darts.v4;
|
||||||
|
Scope = "link";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -306,7 +347,7 @@ in
|
|||||||
firewall = {
|
firewall = {
|
||||||
trustedInterfaces = [ "vms" ];
|
trustedInterfaces = [ "vms" ];
|
||||||
extraRules = ''
|
extraRules = ''
|
||||||
define cust = { vm-mail }
|
define cust = { vm-mail, vm-darts }
|
||||||
table inet filter {
|
table inet filter {
|
||||||
chain forward {
|
chain forward {
|
||||||
# Trust that the outer firewall has done the filtering!
|
# Trust that the outer firewall has done the filtering!
|
||||||
|
@ -31,7 +31,8 @@
|
|||||||
driver = "file";
|
driver = "file";
|
||||||
#filename = "${systems.installer.configuration.config.my.buildAs.iso}/iso/nixos-installer-devplayer0.iso";
|
#filename = "${systems.installer.configuration.config.my.buildAs.iso}/iso/nixos-installer-devplayer0.iso";
|
||||||
#filename = "/persist/home/dev/nixos-installer-devplayer0.iso";
|
#filename = "/persist/home/dev/nixos-installer-devplayer0.iso";
|
||||||
filename = "/persist/home/dev/debian-12.1.0-amd64-netinst.iso";
|
#filename = "/persist/home/dev/debian-12.1.0-amd64-netinst.iso";
|
||||||
|
filename = "/persist/home/dev/ubuntu-22.04.3-live-server-amd64.iso";
|
||||||
read-only = "on";
|
read-only = "on";
|
||||||
};
|
};
|
||||||
format.driver = "raw";
|
format.driver = "raw";
|
||||||
@ -166,6 +167,19 @@
|
|||||||
};
|
};
|
||||||
frontend = "virtio-blk";
|
frontend = "virtio-blk";
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
name = "git";
|
||||||
|
backend = {
|
||||||
|
driver = "host_device";
|
||||||
|
filename = "/dev/main/git";
|
||||||
|
discard = "unmap";
|
||||||
|
};
|
||||||
|
format = {
|
||||||
|
driver = "raw";
|
||||||
|
discard = "unmap";
|
||||||
|
};
|
||||||
|
frontend = "virtio-blk";
|
||||||
|
}
|
||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -217,6 +231,24 @@
|
|||||||
(vmLVM "mail" "data")
|
(vmLVM "mail" "data")
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
darts = {
|
||||||
|
uuid = "ee3882a9-5616-4fcb-83d7-89eb41a84d28";
|
||||||
|
cpu = "host,topoext";
|
||||||
|
smp = {
|
||||||
|
cpus = 4;
|
||||||
|
threads = 2;
|
||||||
|
};
|
||||||
|
memory = 16384;
|
||||||
|
networks.public = {
|
||||||
|
bridge = null;
|
||||||
|
mac = "52:54:00:a8:29:cd";
|
||||||
|
};
|
||||||
|
cleanShutdown.timeout = 120;
|
||||||
|
drives = [
|
||||||
|
(mkMerge [ (vmLVM "darts" "root") { frontendOpts.bootindex = 0; } ])
|
||||||
|
];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -14,12 +14,12 @@ in
|
|||||||
config = ''
|
config = ''
|
||||||
define OWNAS = 211024;
|
define OWNAS = 211024;
|
||||||
|
|
||||||
define CCVIP1 = ${lib.my.colony.prefixes.vip1};
|
define CCVIP1 = ${lib.my.c.colony.prefixes.vip1};
|
||||||
define CCVIP2 = ${lib.my.colony.prefixes.vip2};
|
define CCVIP2 = ${lib.my.c.colony.prefixes.vip2};
|
||||||
|
|
||||||
define OWNIP4 = ${assignments.internal.ipv4.address};
|
define OWNIP4 = ${assignments.internal.ipv4.address};
|
||||||
define OWNNETSET4 = [ ${assignments.internal.ipv4.address}/32 ];
|
define OWNNETSET4 = [ ${assignments.internal.ipv4.address}/32 ];
|
||||||
define CCNETSET4 = [ ${lib.my.colony.prefixes.vip1}, ${lib.my.colony.prefixes.vip2} ];
|
define CCNETSET4 = [ ${lib.my.c.colony.prefixes.vip1}, ${lib.my.c.colony.prefixes.vip2} ];
|
||||||
|
|
||||||
define INTNET6 = ${intnet6};
|
define INTNET6 = ${intnet6};
|
||||||
define AMSNET6 = ${amsnet6};
|
define AMSNET6 = ${amsnet6};
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.colony) domain prefixes;
|
inherit (lib.my.c.colony) domain prefixes;
|
||||||
|
|
||||||
pubV4 = "94.142.240.44";
|
pubV4 = "94.142.240.44";
|
||||||
in
|
in
|
||||||
@ -95,7 +95,7 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
fstrim = lib.my.colony.fstrimConfig;
|
fstrim = lib.my.c.colony.fstrimConfig;
|
||||||
lvm = {
|
lvm = {
|
||||||
dmeventd.enable = true;
|
dmeventd.enable = true;
|
||||||
};
|
};
|
||||||
@ -182,7 +182,7 @@ in
|
|||||||
};
|
};
|
||||||
wireguardConfig = {
|
wireguardConfig = {
|
||||||
PrivateKeyFile = config.age.secrets."estuary/kelder-wg.key".path;
|
PrivateKeyFile = config.age.secrets."estuary/kelder-wg.key".path;
|
||||||
ListenPort = lib.my.kelder.vpn.port;
|
ListenPort = lib.my.c.kelder.vpn.port;
|
||||||
};
|
};
|
||||||
wireguardPeers = [
|
wireguardPeers = [
|
||||||
{
|
{
|
||||||
@ -306,27 +306,31 @@ in
|
|||||||
};
|
};
|
||||||
ipv6Prefixes = [
|
ipv6Prefixes = [
|
||||||
{
|
{
|
||||||
ipv6PrefixConfig.Prefix = lib.my.colony.prefixes.base.v6;
|
ipv6PrefixConfig.Prefix = prefixes.base.v6;
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
routes = map (r: { routeConfig = r; }) (flatten
|
routes = map (r: { routeConfig = r; }) (flatten
|
||||||
([
|
([
|
||||||
{
|
{
|
||||||
Destination = lib.my.colony.prefixes.vip1;
|
Destination = prefixes.vip1;
|
||||||
Gateway = allAssignments.colony.routing.ipv4.address;
|
Gateway = allAssignments.colony.routing.ipv4.address;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
Destination = lib.my.colony.prefixes.cust.v6;
|
Destination = prefixes.darts.v4;
|
||||||
|
Gateway = allAssignments.colony.routing.ipv4.address;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
Destination = prefixes.cust.v6;
|
||||||
Gateway = allAssignments.colony.internal.ipv6.address;
|
Gateway = allAssignments.colony.internal.ipv6.address;
|
||||||
}
|
}
|
||||||
] ++
|
] ++
|
||||||
(map (pName: [
|
(map (pName: [
|
||||||
{
|
{
|
||||||
Gateway = allAssignments.colony.routing.ipv4.address;
|
Gateway = allAssignments.colony.routing.ipv4.address;
|
||||||
Destination = lib.my.colony.prefixes."${pName}".v4;
|
Destination = prefixes."${pName}".v4;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
Destination = lib.my.colony.prefixes."${pName}".v6;
|
Destination = prefixes."${pName}".v6;
|
||||||
Gateway = allAssignments.colony.internal.ipv6.address;
|
Gateway = allAssignments.colony.internal.ipv6.address;
|
||||||
}
|
}
|
||||||
]) [ "vms" "ctrs" "oci" ])));
|
]) [ "vms" "ctrs" "oci" ])));
|
||||||
@ -356,7 +360,6 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
my = {
|
my = {
|
||||||
#deploy.generate.system.mode = "boot";
|
|
||||||
secrets = {
|
secrets = {
|
||||||
key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF9up7pXu6M/OWCKufTOfSiGcxMUk4VqUe7fLuatNFFA";
|
key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF9up7pXu6M/OWCKufTOfSiGcxMUk4VqUe7fLuatNFFA";
|
||||||
files = {
|
files = {
|
||||||
@ -369,7 +372,7 @@ in
|
|||||||
|
|
||||||
firewall = {
|
firewall = {
|
||||||
trustedInterfaces = [ "as211024" ];
|
trustedInterfaces = [ "as211024" ];
|
||||||
udp.allowed = [ 5353 lib.my.kelder.vpn.port ];
|
udp.allowed = [ 5353 lib.my.c.kelder.vpn.port ];
|
||||||
tcp.allowed = [ 5353 "bgp" ];
|
tcp.allowed = [ 5353 "bgp" ];
|
||||||
nat = {
|
nat = {
|
||||||
enable = true;
|
enable = true;
|
||||||
@ -430,7 +433,7 @@ in
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
chain filter-routing {
|
chain filter-routing {
|
||||||
ip daddr ${prefixes.mail.v4} accept
|
ip daddr { ${prefixes.mail.v4}, ${prefixes.darts.v4} } accept
|
||||||
ip6 daddr ${prefixes.cust.v6} accept
|
ip6 daddr ${prefixes.cust.v6} accept
|
||||||
|
|
||||||
tcp flags & (fin|syn|rst|ack) == syn ct state new jump routing-tcp
|
tcp flags & (fin|syn|rst|ack) == syn ct state new jump routing-tcp
|
||||||
@ -456,9 +459,11 @@ in
|
|||||||
table inet nat {
|
table inet nat {
|
||||||
chain prerouting {
|
chain prerouting {
|
||||||
${matchInet "meta l4proto { udp, tcp } th dport domain redirect to :5353" "estuary"}
|
${matchInet "meta l4proto { udp, tcp } th dport domain redirect to :5353" "estuary"}
|
||||||
|
ip daddr ${allAssignments.shill.internal.ipv4.address} tcp dport { http, https } dnat to ${allAssignments.middleman.internal.ipv4.address}
|
||||||
|
ip6 daddr ${allAssignments.shill.internal.ipv6.address} tcp dport { http, https } dnat to ${allAssignments.middleman.internal.ipv6.address}
|
||||||
}
|
}
|
||||||
chain postrouting {
|
chain postrouting {
|
||||||
ip saddr ${lib.my.colony.prefixes.all.v4} snat to ${assignments.internal.ipv4.address}
|
ip saddr ${prefixes.all.v4} snat to ${assignments.internal.ipv4.address}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
{ lib, pkgs, config, assignments, allAssignments, ... }:
|
{ lib, pkgs, config, assignments, allAssignments, ... }:
|
||||||
let
|
let
|
||||||
inherit (builtins) attrNames;
|
inherit (builtins) attrNames;
|
||||||
|
inherit (lib.my) net;
|
||||||
|
inherit (lib.my.c.colony) prefixes;
|
||||||
|
|
||||||
authZones = attrNames config.my.pdns.auth.bind.zones;
|
authZones = attrNames config.my.pdns.auth.bind.zones;
|
||||||
in
|
in
|
||||||
@ -49,7 +51,7 @@ in
|
|||||||
];
|
];
|
||||||
allowFrom = [
|
allowFrom = [
|
||||||
"127.0.0.0/8" "::1/128"
|
"127.0.0.0/8" "::1/128"
|
||||||
lib.my.colony.prefixes.all.v4 lib.my.colony.prefixes.all.v6
|
prefixes.all.v4 prefixes.all.v6
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -147,8 +149,11 @@ in
|
|||||||
valheim IN A ${assignments.internal.ipv4.address}
|
valheim IN A ${assignments.internal.ipv4.address}
|
||||||
valheim IN AAAA ${allAssignments.valheim-oci.internal.ipv6.address}
|
valheim IN AAAA ${allAssignments.valheim-oci.internal.ipv6.address}
|
||||||
|
|
||||||
mail-vm IN A ${lib.my.net.cidr.host 0 lib.my.colony.prefixes.mail.v4}
|
mail-vm IN A ${net.cidr.host 0 prefixes.mail.v4}
|
||||||
mail-vm IN AAAA ${lib.my.net.cidr.host 1 lib.my.colony.prefixes.mail.v6}
|
mail-vm IN AAAA ${net.cidr.host 1 prefixes.mail.v6}
|
||||||
|
|
||||||
|
darts-cust IN A ${net.cidr.host 0 prefixes.darts.v4}
|
||||||
|
darts-cust IN AAAA ${net.cidr.host 1 prefixes.darts.v6}
|
||||||
|
|
||||||
andrey-cust IN A ${allAssignments.kelder.estuary.ipv4.address}
|
andrey-cust IN A ${allAssignments.kelder.estuary.ipv4.address}
|
||||||
|
|
||||||
@ -200,6 +205,8 @@ in
|
|||||||
|
|
||||||
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2 IN PTR mail.nul.ie.
|
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2 IN PTR mail.nul.ie.
|
||||||
|
|
||||||
|
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.2 IN PTR darts-cust.${config.networking.domain}.
|
||||||
|
|
||||||
${lib.my.dns.ptr6Records {
|
${lib.my.dns.ptr6Records {
|
||||||
inherit allAssignments names;
|
inherit allAssignments names;
|
||||||
domain = config.networking.domain;
|
domain = config.networking.domain;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.colony) domain prefixes;
|
inherit (lib.my.c.colony) domain prefixes;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems.chatterbox = {
|
nixos.systems.chatterbox = {
|
||||||
@ -22,7 +22,7 @@ in
|
|||||||
|
|
||||||
configuration = { lib, pkgs, config, assignments, allAssignments, ... }:
|
configuration = { lib, pkgs, config, assignments, allAssignments, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib) mkMerge mkIf;
|
inherit (lib) mkMerge mkIf mkForce;
|
||||||
inherit (lib.my) networkdAssignment;
|
inherit (lib.my) networkdAssignment;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
@ -43,16 +43,41 @@ in
|
|||||||
owner = "matrix-synapse";
|
owner = "matrix-synapse";
|
||||||
group = "matrix-synapse";
|
group = "matrix-synapse";
|
||||||
};
|
};
|
||||||
|
"chatterbox/syncv3.env" = {
|
||||||
|
owner = "matrix-syncv3";
|
||||||
|
group = "matrix-syncv3";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
firewall = {
|
firewall = {
|
||||||
tcp.allowed = [ 19999 8008 ];
|
tcp.allowed = [ 19999 8008 8009 ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
users = with lib.my.c.ids; {
|
||||||
|
users = {
|
||||||
|
matrix-syncv3 = {
|
||||||
|
isSystemUser = true;
|
||||||
|
uid = uids.matrix-syncv3;
|
||||||
|
group = "matrix-syncv3";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
groups = {
|
||||||
|
matrix-syncv3.gid = gids.matrix-syncv3;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
systemd = {
|
systemd = {
|
||||||
network.networks."80-container-host0" = networkdAssignment "host0" assignments.internal;
|
network.networks."80-container-host0" = networkdAssignment "host0" assignments.internal;
|
||||||
|
services = {
|
||||||
|
matrix-sliding-sync.serviceConfig = {
|
||||||
|
# Needs to be able to read its secrets
|
||||||
|
DynamicUser = mkForce false;
|
||||||
|
User = "matrix-syncv3";
|
||||||
|
Group = "matrix-syncv3";
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
@ -128,7 +153,7 @@ in
|
|||||||
"2001:db8::/32"
|
"2001:db8::/32"
|
||||||
"ff00::/8"
|
"ff00::/8"
|
||||||
"fec0::/10"
|
"fec0::/10"
|
||||||
] ++ (with lib.my.colony.prefixes; [ all.v4 all.v6 ]);
|
] ++ (with lib.my.c.colony.prefixes; [ all.v4 all.v6 ]);
|
||||||
url_preview_ip_range_whitelist =
|
url_preview_ip_range_whitelist =
|
||||||
with allAssignments.middleman.internal;
|
with allAssignments.middleman.internal;
|
||||||
[ ipv4.address ipv6.address ];
|
[ ipv4.address ipv6.address ];
|
||||||
@ -142,6 +167,16 @@ in
|
|||||||
"/var/lib/heisenbridge/registration.yml"
|
"/var/lib/heisenbridge/registration.yml"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
sliding-sync = {
|
||||||
|
enable = true;
|
||||||
|
createDatabase = false;
|
||||||
|
environmentFile = config.age.secrets."chatterbox/syncv3.env".path;
|
||||||
|
settings = {
|
||||||
|
SYNCV3_BINDADDR = "[::]:8009";
|
||||||
|
SYNCV3_SERVER = "http://localhost:8008";
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
heisenbridge = {
|
heisenbridge = {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.colony) domain prefixes;
|
inherit (lib.my.c.colony) domain prefixes;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems.colony-psql = {
|
nixos.systems.colony-psql = {
|
||||||
@ -66,7 +66,7 @@ in
|
|||||||
enable = true;
|
enable = true;
|
||||||
enableTCPIP = true;
|
enableTCPIP = true;
|
||||||
|
|
||||||
authentication = with lib.my.colony.prefixes; ''
|
authentication = with lib.my.c.colony.prefixes; ''
|
||||||
local all postgres peer map=local
|
local all postgres peer map=local
|
||||||
|
|
||||||
host all all ${all.v4} md5
|
host all all ${all.v4} md5
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.colony) domain prefixes;
|
inherit (lib.my.c.colony) domain prefixes;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems.jackflix = {
|
nixos.systems.jackflix = {
|
||||||
@ -55,6 +55,12 @@ in
|
|||||||
|
|
||||||
radarr.serviceConfig.UMask = "0002";
|
radarr.serviceConfig.UMask = "0002";
|
||||||
sonarr.serviceConfig.UMask = "0002";
|
sonarr.serviceConfig.UMask = "0002";
|
||||||
|
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/258793#issuecomment-1748168206
|
||||||
|
transmission.serviceConfig = {
|
||||||
|
RootDirectoryStartOnly = lib.mkForce false;
|
||||||
|
RootDirectory = lib.mkForce "";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
let
|
let
|
||||||
inherit (lib) mkMerge mkIf;
|
inherit (lib) mkMerge mkIf;
|
||||||
inherit (lib.my) networkdAssignment;
|
inherit (lib.my) networkdAssignment;
|
||||||
|
inherit (lib.my.c.colony) prefixes;
|
||||||
|
|
||||||
wg = {
|
wg = {
|
||||||
keyFile = "jackflix/airvpn-privkey";
|
keyFile = "jackflix/airvpn-privkey";
|
||||||
@ -102,23 +103,23 @@ in
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
From = lib.my.colony.prefixes.all.v4;
|
From = prefixes.all.v4;
|
||||||
Table = "main";
|
Table = "main";
|
||||||
Priority = 100;
|
Priority = 100;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
To = lib.my.colony.prefixes.all.v4;
|
To = prefixes.all.v4;
|
||||||
Table = "main";
|
Table = "main";
|
||||||
Priority = 100;
|
Priority = 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
From = lib.my.colony.prefixes.all.v6;
|
From = prefixes.all.v6;
|
||||||
Table = "main";
|
Table = "main";
|
||||||
Priority = 100;
|
Priority = 100;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
To = lib.my.colony.prefixes.all.v6;
|
To = prefixes.all.v6;
|
||||||
Table = "main";
|
Table = "main";
|
||||||
Priority = 100;
|
Priority = 100;
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.colony) domain prefixes;
|
inherit (lib.my.c) pubDomain;
|
||||||
|
inherit (lib.my.c.colony) domain prefixes;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems.middleman = {
|
nixos.systems.middleman = {
|
||||||
@ -79,8 +80,8 @@ in
|
|||||||
port = 8082;
|
port = 8082;
|
||||||
};
|
};
|
||||||
login = {
|
login = {
|
||||||
title = "${lib.my.pubDomain} login";
|
title = "${pubDomain} login";
|
||||||
default_redirect = "https://${lib.my.pubDomain}";
|
default_redirect = "https://${pubDomain}";
|
||||||
default_method = "google_oauth";
|
default_method = "google_oauth";
|
||||||
names = {
|
names = {
|
||||||
google_oauth = "Google account";
|
google_oauth = "Google account";
|
||||||
@ -88,7 +89,7 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
cookie = {
|
cookie = {
|
||||||
domain = ".${lib.my.pubDomain}";
|
domain = ".${pubDomain}";
|
||||||
secure = true;
|
secure = true;
|
||||||
};
|
};
|
||||||
audit_log = {
|
audit_log = {
|
||||||
@ -109,14 +110,14 @@ in
|
|||||||
};
|
};
|
||||||
google_oauth = {
|
google_oauth = {
|
||||||
client_id = "545475967061-cag4g1qf0pk33g3pdbom4v69562vboc8.apps.googleusercontent.com";
|
client_id = "545475967061-cag4g1qf0pk33g3pdbom4v69562vboc8.apps.googleusercontent.com";
|
||||||
redirect_url = "https://sso.${lib.my.pubDomain}/login";
|
redirect_url = "https://sso.${pubDomain}/login";
|
||||||
user_id_method = "user-id";
|
user_id_method = "user-id";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
includes = {
|
includes = {
|
||||||
endpoint = "http://localhost:8082";
|
endpoint = "http://localhost:8082";
|
||||||
baseURL = "https://sso.${lib.my.pubDomain}";
|
baseURL = "https://sso.${pubDomain}";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -173,10 +174,10 @@ in
|
|||||||
EXEC_PATH=${script}
|
EXEC_PATH=${script}
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
"${lib.my.pubDomain}" = {
|
"${pubDomain}" = {
|
||||||
extraDomainNames = [
|
extraDomainNames = [
|
||||||
"*.${lib.my.pubDomain}"
|
"*.${pubDomain}"
|
||||||
"*.s3.${lib.my.pubDomain}"
|
"*.s3.${pubDomain}"
|
||||||
];
|
];
|
||||||
dnsProvider = "cloudflare";
|
dnsProvider = "cloudflare";
|
||||||
credentialsFile = config.age.secrets."middleman/cloudflare-credentials.conf".path;
|
credentialsFile = config.age.secrets."middleman/cloudflare-credentials.conf".path;
|
||||||
@ -194,7 +195,7 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
programs = {
|
programs = {
|
||||||
ssh.knownHostsFiles = [ lib.my.sshHostKeys.mail-vm ];
|
ssh.knownHostsFiles = [ lib.my.c.sshHostKeys.mail-vm ];
|
||||||
};
|
};
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
@ -265,7 +266,7 @@ in
|
|||||||
proxy_send_timeout 60s;
|
proxy_send_timeout 60s;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
|
|
||||||
${lib.my.nginx.proxyHeaders}
|
${lib.my.c.nginx.proxyHeaders}
|
||||||
|
|
||||||
# caching
|
# caching
|
||||||
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHE:10m inactive=7d max_size=4g;
|
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHE:10m inactive=7d max_size=4g;
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
let
|
let
|
||||||
inherit (builtins) mapAttrs toJSON;
|
inherit (builtins) mapAttrs toJSON;
|
||||||
inherit (lib) mkMerge mkDefault genAttrs flatten concatStringsSep;
|
inherit (lib) mkMerge mkDefault genAttrs flatten concatStringsSep;
|
||||||
|
inherit (lib.my.c) pubDomain;
|
||||||
|
inherit (lib.my.c.nginx) proxyHeaders;
|
||||||
|
inherit (config.networking) domain;
|
||||||
|
|
||||||
dualStackListen' = l: map (addr: l // { inherit addr; }) [ "0.0.0.0" "[::]" ];
|
dualStackListen' = l: map (addr: l // { inherit addr; }) [ "0.0.0.0" "[::]" ];
|
||||||
dualStackListen = ll: flatten (map dualStackListen' ll);
|
dualStackListen = ll: flatten (map dualStackListen' ll);
|
||||||
@ -32,6 +35,7 @@ let
|
|||||||
# For clients
|
# For clients
|
||||||
(mkWellKnown "matrix/client" (toJSON {
|
(mkWellKnown "matrix/client" (toJSON {
|
||||||
"m.homeserver".base_url = "https://matrix.nul.ie";
|
"m.homeserver".base_url = "https://matrix.nul.ie";
|
||||||
|
"org.matrix.msc3575.proxy".url = "https://matrix-syncv3.nul.ie";
|
||||||
}))
|
}))
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
@ -80,7 +84,7 @@ in
|
|||||||
}
|
}
|
||||||
wellKnown
|
wellKnown
|
||||||
];
|
];
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
};
|
};
|
||||||
"localhost" = {
|
"localhost" = {
|
||||||
forceSSL = false;
|
forceSSL = false;
|
||||||
@ -98,12 +102,12 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
"sso.${lib.my.pubDomain}" = {
|
"sso.${pubDomain}" = {
|
||||||
locations."/".proxyPass = config.my.nginx-sso.includes.endpoint;
|
locations."/".proxyPass = config.my.nginx-sso.includes.endpoint;
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
};
|
};
|
||||||
|
|
||||||
"netdata-colony.${lib.my.pubDomain}" =
|
"netdata-colony.${pubDomain}" =
|
||||||
let
|
let
|
||||||
hosts = [
|
hosts = [
|
||||||
"vm"
|
"vm"
|
||||||
@ -119,10 +123,10 @@ in
|
|||||||
"~ /(?<behost>${matchHosts})$".return = "301 https://$host/$behost/";
|
"~ /(?<behost>${matchHosts})$".return = "301 https://$host/$behost/";
|
||||||
"~ /(?<behost>${matchHosts})/(?<ndpath>.*)" = mkMerge [
|
"~ /(?<behost>${matchHosts})/(?<ndpath>.*)" = mkMerge [
|
||||||
{
|
{
|
||||||
proxyPass = "http://$behost.${config.networking.domain}:19999/$ndpath$is_args$args";
|
proxyPass = "http://$behost.${domain}:19999/$ndpath$is_args$args";
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
proxy_pass_request_headers on;
|
proxy_pass_request_headers on;
|
||||||
${lib.my.nginx.proxyHeaders}
|
${proxyHeaders}
|
||||||
proxy_set_header Connection "keep-alive";
|
proxy_set_header Connection "keep-alive";
|
||||||
proxy_store off;
|
proxy_store off;
|
||||||
|
|
||||||
@ -134,14 +138,14 @@ in
|
|||||||
(ssoLoc "generic")
|
(ssoLoc "generic")
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
}
|
}
|
||||||
(ssoServer "generic")
|
(ssoServer "generic")
|
||||||
];
|
];
|
||||||
|
|
||||||
"pass.${lib.my.pubDomain}" =
|
"pass.${pubDomain}" =
|
||||||
let
|
let
|
||||||
upstream = "http://vaultwarden-ctr.${config.networking.domain}";
|
upstream = "http://vaultwarden-ctr.${domain}";
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
locations = {
|
locations = {
|
||||||
@ -149,11 +153,11 @@ in
|
|||||||
"/notifications/hub" = {
|
"/notifications/hub" = {
|
||||||
proxyPass = upstream;
|
proxyPass = upstream;
|
||||||
proxyWebsockets = true;
|
proxyWebsockets = true;
|
||||||
extraConfig = lib.my.nginx.proxyHeaders;
|
extraConfig = proxyHeaders;
|
||||||
};
|
};
|
||||||
"/notifications/hub/negotiate".proxyPass = upstream;
|
"/notifications/hub/negotiate".proxyPass = upstream;
|
||||||
};
|
};
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
};
|
};
|
||||||
|
|
||||||
"matrix.nul.ie" = {
|
"matrix.nul.ie" = {
|
||||||
@ -171,15 +175,19 @@ in
|
|||||||
];
|
];
|
||||||
locations = mkMerge [
|
locations = mkMerge [
|
||||||
{
|
{
|
||||||
"/".proxyPass = "http://chatterbox-ctr.${config.networking.domain}:8008";
|
"/".proxyPass = "http://chatterbox-ctr.${domain}:8008";
|
||||||
"= /".return = "301 https://element.${lib.my.pubDomain}";
|
"= /".return = "301 https://element.${pubDomain}";
|
||||||
}
|
}
|
||||||
wellKnown
|
wellKnown
|
||||||
];
|
];
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
|
};
|
||||||
|
"matrix-syncv3.${pubDomain}" = {
|
||||||
|
locations."/".proxyPass = "http://chatterbox-ctr.${domain}:8009";
|
||||||
|
useACMEHost = pubDomain;
|
||||||
};
|
};
|
||||||
|
|
||||||
"element.${lib.my.pubDomain}" =
|
"element.${pubDomain}" =
|
||||||
let
|
let
|
||||||
headers = ''
|
headers = ''
|
||||||
# TODO: why are these here?
|
# TODO: why are these here?
|
||||||
@ -224,66 +232,66 @@ in
|
|||||||
'';
|
'';
|
||||||
}))
|
}))
|
||||||
];
|
];
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
};
|
};
|
||||||
|
|
||||||
"torrents.${lib.my.pubDomain}" = mkMerge [
|
"torrents.${pubDomain}" = mkMerge [
|
||||||
{
|
{
|
||||||
locations."/" = mkMerge [
|
locations."/" = mkMerge [
|
||||||
{
|
{
|
||||||
proxyPass = "http://jackflix-ctr.${config.networking.domain}:9091";
|
proxyPass = "http://jackflix-ctr.${domain}:9091";
|
||||||
}
|
}
|
||||||
(ssoLoc "generic")
|
(ssoLoc "generic")
|
||||||
];
|
];
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
}
|
}
|
||||||
(ssoServer "generic")
|
(ssoServer "generic")
|
||||||
];
|
];
|
||||||
|
|
||||||
"jackett.${lib.my.pubDomain}" = mkMerge [
|
"jackett.${pubDomain}" = mkMerge [
|
||||||
{
|
{
|
||||||
locations."/" = mkMerge [
|
locations."/" = mkMerge [
|
||||||
{
|
{
|
||||||
proxyPass = "http://jackflix-ctr.${config.networking.domain}:9117";
|
proxyPass = "http://jackflix-ctr.${domain}:9117";
|
||||||
}
|
}
|
||||||
(ssoLoc "generic")
|
(ssoLoc "generic")
|
||||||
];
|
];
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
}
|
}
|
||||||
(ssoServer "generic")
|
(ssoServer "generic")
|
||||||
];
|
];
|
||||||
"radarr.${lib.my.pubDomain}" = mkMerge [
|
"radarr.${pubDomain}" = mkMerge [
|
||||||
{
|
{
|
||||||
locations."/" = mkMerge [
|
locations."/" = mkMerge [
|
||||||
{
|
{
|
||||||
proxyPass = "http://jackflix-ctr.${config.networking.domain}:7878";
|
proxyPass = "http://jackflix-ctr.${domain}:7878";
|
||||||
proxyWebsockets = true;
|
proxyWebsockets = true;
|
||||||
extraConfig = lib.my.nginx.proxyHeaders;
|
extraConfig = proxyHeaders;
|
||||||
}
|
}
|
||||||
(ssoLoc "generic")
|
(ssoLoc "generic")
|
||||||
];
|
];
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
}
|
}
|
||||||
(ssoServer "generic")
|
(ssoServer "generic")
|
||||||
];
|
];
|
||||||
"sonarr.${lib.my.pubDomain}" = mkMerge [
|
"sonarr.${pubDomain}" = mkMerge [
|
||||||
{
|
{
|
||||||
locations."/" = mkMerge [
|
locations."/" = mkMerge [
|
||||||
{
|
{
|
||||||
proxyPass = "http://jackflix-ctr.${config.networking.domain}:8989";
|
proxyPass = "http://jackflix-ctr.${domain}:8989";
|
||||||
proxyWebsockets = true;
|
proxyWebsockets = true;
|
||||||
extraConfig = lib.my.nginx.proxyHeaders;
|
extraConfig = proxyHeaders;
|
||||||
}
|
}
|
||||||
(ssoLoc "generic")
|
(ssoLoc "generic")
|
||||||
];
|
];
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
}
|
}
|
||||||
(ssoServer "generic")
|
(ssoServer "generic")
|
||||||
];
|
];
|
||||||
|
|
||||||
"jackflix.${lib.my.pubDomain}" =
|
"jackflix.${pubDomain}" =
|
||||||
let
|
let
|
||||||
upstream = "http://jackflix-ctr.${config.networking.domain}:8096";
|
upstream = "http://jackflix-ctr.${domain}:8096";
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
@ -300,10 +308,10 @@ in
|
|||||||
"/socket" = {
|
"/socket" = {
|
||||||
proxyPass = upstream;
|
proxyPass = upstream;
|
||||||
proxyWebsockets = true;
|
proxyWebsockets = true;
|
||||||
extraConfig = lib.my.nginx.proxyHeaders;
|
extraConfig = proxyHeaders;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
};
|
};
|
||||||
|
|
||||||
"toot.nul.ie" =
|
"toot.nul.ie" =
|
||||||
@ -312,7 +320,7 @@ in
|
|||||||
tryFiles = "$uri =404";
|
tryFiles = "$uri =404";
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
add_header Cache-Control "public, max-age=2419200, must-revalidate";
|
add_header Cache-Control "public, max-age=2419200, must-revalidate";
|
||||||
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
|
add_header Strict-Transport-Security "max-age=63072000; includeSubpubDomains";
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
@ -333,20 +341,20 @@ in
|
|||||||
"/".tryFiles = "$uri @proxy";
|
"/".tryFiles = "$uri @proxy";
|
||||||
|
|
||||||
"^~ /api/v1/streaming" = {
|
"^~ /api/v1/streaming" = {
|
||||||
proxyPass = "http://toot-ctr.${config.networking.domain}:55000";
|
proxyPass = "http://toot-ctr.${domain}:55000";
|
||||||
proxyWebsockets = true;
|
proxyWebsockets = true;
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
${lib.my.nginx.proxyHeaders}
|
${proxyHeaders}
|
||||||
proxy_set_header Proxy "";
|
proxy_set_header Proxy "";
|
||||||
|
|
||||||
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
|
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
"@proxy" = {
|
"@proxy" = {
|
||||||
proxyPass = "http://toot-ctr.${config.networking.domain}:55001";
|
proxyPass = "http://toot-ctr.${domain}:55001";
|
||||||
proxyWebsockets = true;
|
proxyWebsockets = true;
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
${lib.my.nginx.proxyHeaders}
|
${proxyHeaders}
|
||||||
proxy_set_header Proxy "";
|
proxy_set_header Proxy "";
|
||||||
proxy_pass_header Server;
|
proxy_pass_header Server;
|
||||||
|
|
||||||
@ -359,19 +367,19 @@ in
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
};
|
};
|
||||||
|
|
||||||
"share.${lib.my.pubDomain}" = {
|
"share.${pubDomain}" = {
|
||||||
locations."/" = {
|
locations."/" = {
|
||||||
proxyPass = "http://object-ctr.${config.networking.domain}:9090";
|
proxyPass = "http://object-ctr.${domain}:9090";
|
||||||
proxyWebsockets = true;
|
proxyWebsockets = true;
|
||||||
extraConfig = lib.my.nginx.proxyHeaders;
|
extraConfig = proxyHeaders;
|
||||||
};
|
};
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
};
|
};
|
||||||
|
|
||||||
"stuff.${lib.my.pubDomain}" = {
|
"stuff.${pubDomain}" = {
|
||||||
locations."/" = {
|
locations."/" = {
|
||||||
basicAuthFile = config.age.secrets."middleman/htpasswd".path;
|
basicAuthFile = config.age.secrets."middleman/htpasswd".path;
|
||||||
root = "/mnt/media/stuff";
|
root = "/mnt/media/stuff";
|
||||||
@ -380,13 +388,18 @@ in
|
|||||||
fancyindex_show_dotfiles on;
|
fancyindex_show_dotfiles on;
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
|
};
|
||||||
|
|
||||||
|
"git.${pubDomain}" = {
|
||||||
|
locations."/".proxyPass = "http://shill-vm.${domain}:3000";
|
||||||
|
useACMEHost = pubDomain;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
minio =
|
minio =
|
||||||
let
|
let
|
||||||
host = "object-ctr.${config.networking.domain}";
|
host = "object-ctr.${domain}";
|
||||||
s3Upstream = "http://${host}:9000";
|
s3Upstream = "http://${host}:9000";
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
chunked_transfer_encoding off;
|
chunked_transfer_encoding off;
|
||||||
@ -401,7 +414,7 @@ in
|
|||||||
'';
|
'';
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
"minio.${lib.my.pubDomain}" = {
|
"minio.${pubDomain}" = {
|
||||||
inherit extraConfig;
|
inherit extraConfig;
|
||||||
locations = {
|
locations = {
|
||||||
"/" = {
|
"/" = {
|
||||||
@ -410,19 +423,19 @@ in
|
|||||||
"/ws" = {
|
"/ws" = {
|
||||||
proxyPass = "http://${host}:9001";
|
proxyPass = "http://${host}:9001";
|
||||||
proxyWebsockets = true;
|
proxyWebsockets = true;
|
||||||
extraConfig = lib.my.nginx.proxyHeaders;
|
extraConfig = proxyHeaders;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
};
|
};
|
||||||
"s3.${lib.my.pubDomain}" = {
|
"s3.${pubDomain}" = {
|
||||||
serverAliases = [ "*.s3.${lib.my.pubDomain}" ];
|
serverAliases = [ "*.s3.${pubDomain}" ];
|
||||||
inherit extraConfig;
|
inherit extraConfig;
|
||||||
locations."/".proxyPass = s3Upstream;
|
locations."/".proxyPass = s3Upstream;
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
};
|
};
|
||||||
|
|
||||||
"nix-cache.${lib.my.pubDomain}" = {
|
"nix-cache.${pubDomain}" = {
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
${extraConfig}
|
${extraConfig}
|
||||||
proxy_set_header Host "nix-cache.s3.nul.ie";
|
proxy_set_header Host "nix-cache.s3.nul.ie";
|
||||||
@ -434,14 +447,14 @@ in
|
|||||||
extraConfig = nixCacheHeaders;
|
extraConfig = nixCacheHeaders;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
useACMEHost = lib.my.pubDomain;
|
useACMEHost = pubDomain;
|
||||||
onlySSL = false;
|
onlySSL = false;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
defaultsFor = mapAttrs (n: _: {
|
defaultsFor = mapAttrs (n: _: {
|
||||||
onlySSL = mkDefault true;
|
onlySSL = mkDefault true;
|
||||||
useACMEHost = mkDefault "${config.networking.domain}";
|
useACMEHost = mkDefault "${domain}";
|
||||||
kTLS = mkDefault true;
|
kTLS = mkDefault true;
|
||||||
http2 = mkDefault true;
|
http2 = mkDefault true;
|
||||||
});
|
});
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.colony) domain prefixes;
|
inherit (lib.my.c.colony) domain prefixes;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems.object = {
|
nixos.systems.object = {
|
||||||
@ -92,7 +92,7 @@ in
|
|||||||
configOverridesFile = config.age.secrets."object/sharry.conf".path;
|
configOverridesFile = config.age.secrets."object/sharry.conf".path;
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
base-url = "https://share.${lib.my.pubDomain}";
|
base-url = "https://share.${lib.my.c.pubDomain}";
|
||||||
bind.address = "::";
|
bind.address = "::";
|
||||||
alias-member-enabled = true;
|
alias-member-enabled = true;
|
||||||
webapp = {
|
webapp = {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.colony) domain prefixes;
|
inherit (lib.my.c.colony) domain prefixes;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems.toot = {
|
nixos.systems.toot = {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.colony) domain prefixes;
|
inherit (lib.my.c.colony) domain prefixes;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems.vaultwarden = {
|
nixos.systems.vaultwarden = {
|
||||||
@ -62,7 +62,7 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
programs.ssh.knownHostsFiles = [
|
programs.ssh.knownHostsFiles = [
|
||||||
lib.my.sshKeyFiles.rsyncNet
|
lib.my.c.sshKeyFiles.rsyncNet
|
||||||
];
|
];
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
@ -79,7 +79,7 @@ in
|
|||||||
|
|
||||||
SIGNUPS_ALLOWED = false;
|
SIGNUPS_ALLOWED = false;
|
||||||
|
|
||||||
DOMAIN = "https://pass.${lib.my.pubDomain}";
|
DOMAIN = "https://pass.${lib.my.c.pubDomain}";
|
||||||
|
|
||||||
ROCKET_ADDRESS = "::";
|
ROCKET_ADDRESS = "::";
|
||||||
ROCKET_PORT = 80;
|
ROCKET_PORT = 80;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.colony) domain prefixes;
|
inherit (lib.my.c.colony) domain prefixes;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./containers ];
|
imports = [ ./containers ];
|
||||||
@ -49,7 +49,7 @@ in
|
|||||||
inherit (lib.my) networkdAssignment;
|
inherit (lib.my) networkdAssignment;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ "${modulesPath}/profiles/qemu-guest.nix" ./hercules.nix ];
|
imports = [ "${modulesPath}/profiles/qemu-guest.nix" ./hercules.nix ./gitea.nix ];
|
||||||
|
|
||||||
config = mkMerge [
|
config = mkMerge [
|
||||||
{
|
{
|
||||||
@ -97,7 +97,7 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
fstrim = lib.my.colony.fstrimConfig;
|
fstrim = lib.my.c.colony.fstrimConfig;
|
||||||
netdata.enable = true;
|
netdata.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -131,7 +131,7 @@ in
|
|||||||
};
|
};
|
||||||
ipv6Prefixes = [
|
ipv6Prefixes = [
|
||||||
{
|
{
|
||||||
ipv6PrefixConfig.Prefix = lib.my.colony.prefixes.ctrs.v6;
|
ipv6PrefixConfig.Prefix = prefixes.ctrs.v6;
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
113
nixos/boxes/colony/vms/shill/gitea.nix
Normal file
113
nixos/boxes/colony/vms/shill/gitea.nix
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
{ lib, pkgs, config, assignments, allAssignments, ... }:
|
||||||
|
let
|
||||||
|
inherit (lib.my.c) pubDomain;
|
||||||
|
inherit (lib.my.c.colony) prefixes;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = {
|
||||||
|
fileSystems = {
|
||||||
|
"/var/lib/gitea" = {
|
||||||
|
device = "/dev/disk/by-label/git";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
users = {
|
||||||
|
users.git = {
|
||||||
|
description = "Gitea Service";
|
||||||
|
home = config.services.gitea.stateDir;
|
||||||
|
useDefaultShell = true;
|
||||||
|
group = config.services.gitea.group;
|
||||||
|
isSystemUser = true;
|
||||||
|
};
|
||||||
|
groups.git = {};
|
||||||
|
};
|
||||||
|
|
||||||
|
services = {
|
||||||
|
gitea = {
|
||||||
|
enable = true;
|
||||||
|
user = "git";
|
||||||
|
group = "git";
|
||||||
|
appName = "/dev/player0 git";
|
||||||
|
stateDir = "/var/lib/gitea";
|
||||||
|
lfs.enable = true;
|
||||||
|
database = {
|
||||||
|
type = "postgres";
|
||||||
|
createDatabase = false;
|
||||||
|
host = "colony-psql";
|
||||||
|
user = "gitea";
|
||||||
|
passwordFile = config.age.secrets."gitea/db.txt".path;
|
||||||
|
};
|
||||||
|
mailerPasswordFile = config.age.secrets."gitea/mail.txt".path;
|
||||||
|
settings = {
|
||||||
|
server = {
|
||||||
|
DOMAIN = "git.${pubDomain}";
|
||||||
|
HTTP_ADDR = "::";
|
||||||
|
ROOT_URL = "https://git.${pubDomain}";
|
||||||
|
};
|
||||||
|
service = {
|
||||||
|
DISABLE_REGISTRATION = true;
|
||||||
|
ENABLE_NOTIFY_MAIL = true;
|
||||||
|
};
|
||||||
|
session = {
|
||||||
|
COOKIE_SECURE = true;
|
||||||
|
};
|
||||||
|
repository = {
|
||||||
|
DEFAULT_BRANCH = "master";
|
||||||
|
};
|
||||||
|
mailer = {
|
||||||
|
ENABLED = true;
|
||||||
|
PROTOCOL = "smtp+starttls";
|
||||||
|
SMTP_ADDR = "mail.nul.ie";
|
||||||
|
SMTP_PORT = 587;
|
||||||
|
USER = "git@nul.ie";
|
||||||
|
FROM = "Gitea <git@nul.ie>";
|
||||||
|
};
|
||||||
|
"email.incoming" = {
|
||||||
|
ENABLED = true;
|
||||||
|
HOST = "mail.nul.ie";
|
||||||
|
PORT = 993;
|
||||||
|
USE_TLS = true;
|
||||||
|
USERNAME = "git@nul.ie";
|
||||||
|
PASSWORD = "#mailerpass#";
|
||||||
|
REPLY_TO_ADDRESS = "git+%{token}@nul.ie";
|
||||||
|
};
|
||||||
|
actions = {
|
||||||
|
ENABLED = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
my = {
|
||||||
|
secrets = {
|
||||||
|
files =
|
||||||
|
let
|
||||||
|
ownedByGit = {
|
||||||
|
owner = "git";
|
||||||
|
group = "git";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
"gitea/db.txt" = ownedByGit;
|
||||||
|
"gitea/mail.txt" = ownedByGit;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
firewall.extraRules = ''
|
||||||
|
table inet filter {
|
||||||
|
chain input {
|
||||||
|
ip saddr ${prefixes.all.v4} tcp dport 3000 accept
|
||||||
|
ip6 saddr ${prefixes.all.v6} tcp dport 3000 accept
|
||||||
|
}
|
||||||
|
}
|
||||||
|
table inet nat {
|
||||||
|
chain prerouting {
|
||||||
|
ip daddr ${assignments.internal.ipv4.address} tcp dport { http, https } dnat to ${allAssignments.middleman.internal.ipv4.address}
|
||||||
|
ip6 daddr ${assignments.internal.ipv6.address} tcp dport { http, https } dnat to ${allAssignments.middleman.internal.ipv6.address}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -2,7 +2,7 @@
|
|||||||
let
|
let
|
||||||
inherit (builtins) mapAttrs;
|
inherit (builtins) mapAttrs;
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.colony) domain prefixes;
|
inherit (lib.my.c.colony) domain prefixes;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems.whale2 = {
|
nixos.systems.whale2 = {
|
||||||
@ -63,6 +63,7 @@ in
|
|||||||
"${modulesPath}/profiles/qemu-guest.nix"
|
"${modulesPath}/profiles/qemu-guest.nix"
|
||||||
|
|
||||||
./valheim.nix
|
./valheim.nix
|
||||||
|
./gitea-actions.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
config = mkMerge [
|
config = mkMerge [
|
||||||
@ -94,7 +95,7 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
fstrim = lib.my.colony.fstrimConfig;
|
fstrim = lib.my.c.colony.fstrimConfig;
|
||||||
netdata.enable = true;
|
netdata.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
62
nixos/boxes/colony/vms/whale2/gitea-actions.nix
Normal file
62
nixos/boxes/colony/vms/whale2/gitea-actions.nix
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
{ lib, pkgs, config, ... }:
|
||||||
|
let
|
||||||
|
inherit (builtins) toJSON;
|
||||||
|
inherit (lib) mkForce;
|
||||||
|
inherit (lib.my.c) pubDomain;
|
||||||
|
|
||||||
|
cfgFile = pkgs.writeText "gitea-actions-runner.yaml" (toJSON {
|
||||||
|
container = {
|
||||||
|
network = "colony";
|
||||||
|
};
|
||||||
|
});
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = {
|
||||||
|
services = {
|
||||||
|
gitea-actions-runner.instances = {
|
||||||
|
main = {
|
||||||
|
enable = true;
|
||||||
|
name = "main-docker";
|
||||||
|
labels = [ ];
|
||||||
|
url = "https://git.${pubDomain}";
|
||||||
|
tokenFile = config.age.secrets."gitea/actions-runner.env".path;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
users = with lib.my.c.ids; {
|
||||||
|
users = {
|
||||||
|
gitea-runner = {
|
||||||
|
isSystemUser = true;
|
||||||
|
uid = uids.gitea-runner;
|
||||||
|
group = "gitea-runner";
|
||||||
|
home = "/var/lib/gitea-runner";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
groups = {
|
||||||
|
gitea-runner.gid = gids.gitea-runner;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd = {
|
||||||
|
services = {
|
||||||
|
gitea-runner-main.serviceConfig = {
|
||||||
|
# Needs to be able to read its secrets
|
||||||
|
DynamicUser = mkForce false;
|
||||||
|
User = "gitea-runner";
|
||||||
|
Group = "gitea-runner";
|
||||||
|
ExecStart = mkForce "${config.services.gitea-actions-runner.package}/bin/act_runner -c ${cfgFile} daemon";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
my = {
|
||||||
|
secrets.files = {
|
||||||
|
"gitea/actions-runner.env" = {
|
||||||
|
owner = "gitea-runner";
|
||||||
|
group = "gitea-runner";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.kelder) domain prefixes;
|
inherit (lib.my.c.kelder) domain prefixes;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems.kelder-acquisition = {
|
nixos.systems.kelder-acquisition = {
|
||||||
@ -44,7 +44,7 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
users = {
|
users = {
|
||||||
groups.media.gid = lib.my.kelder.groups.media;
|
groups.media.gid = lib.my.c.kelder.groups.media;
|
||||||
users = {
|
users = {
|
||||||
"${config.my.user.config.name}".extraGroups = [ "media" ];
|
"${config.my.user.config.name}".extraGroups = [ "media" ];
|
||||||
|
|
||||||
|
@ -104,12 +104,12 @@ in
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
From = lib.my.kelder.prefixes.all.v4;
|
From = lib.my.c.kelder.prefixes.all.v4;
|
||||||
Table = "main";
|
Table = "main";
|
||||||
Priority = 100;
|
Priority = 100;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
To = lib.my.kelder.prefixes.all.v4;
|
To = lib.my.c.kelder.prefixes.all.v4;
|
||||||
Table = "main";
|
Table = "main";
|
||||||
Priority = 100;
|
Priority = 100;
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
let
|
let
|
||||||
inherit (lib) mkForce mkMerge;
|
inherit (lib) mkForce mkMerge;
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.kelder) domain prefixes;
|
inherit (lib.my.c.kelder) domain prefixes;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
nixos.systems.kelder-spoder = {
|
nixos.systems.kelder-spoder = {
|
||||||
@ -54,9 +54,9 @@ in
|
|||||||
dnsResolver = "8.8.8.8";
|
dnsResolver = "8.8.8.8";
|
||||||
};
|
};
|
||||||
certs = {
|
certs = {
|
||||||
"${lib.my.kelder.domain}" = {
|
"${domain}" = {
|
||||||
extraDomainNames = [
|
extraDomainNames = [
|
||||||
"*.${lib.my.kelder.domain}"
|
"*.${domain}"
|
||||||
];
|
];
|
||||||
dnsProvider = "cloudflare";
|
dnsProvider = "cloudflare";
|
||||||
credentialsFile = config.age.secrets."kelder/cloudflare-credentials.conf".path;
|
credentialsFile = config.age.secrets."kelder/cloudflare-credentials.conf".path;
|
||||||
@ -65,7 +65,7 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
users = {
|
users = {
|
||||||
groups.storage.gid = lib.my.kelder.groups.storage;
|
groups.storage.gid = lib.my.c.kelder.groups.storage;
|
||||||
users = {
|
users = {
|
||||||
nginx.extraGroups = [ "acme" ];
|
nginx.extraGroups = [ "acme" ];
|
||||||
|
|
||||||
@ -93,11 +93,11 @@ in
|
|||||||
enable = true;
|
enable = true;
|
||||||
package = pkgs.nextcloud27;
|
package = pkgs.nextcloud27;
|
||||||
datadir = "/mnt/storage/nextcloud";
|
datadir = "/mnt/storage/nextcloud";
|
||||||
hostName = "cloud.${lib.my.kelder.domain}";
|
hostName = "cloud.${domain}";
|
||||||
https = true;
|
https = true;
|
||||||
enableBrokenCiphersForSSE = false;
|
enableBrokenCiphersForSSE = false;
|
||||||
config = {
|
config = {
|
||||||
extraTrustedDomains = [ "cloud-local.${lib.my.kelder.domain}" ];
|
extraTrustedDomains = [ "cloud-local.${domain}" ];
|
||||||
adminpassFile = config.age.secrets."kelder/nextcloud-root.txt".path;
|
adminpassFile = config.age.secrets."kelder/nextcloud-root.txt".path;
|
||||||
defaultPhoneRegion = "IE";
|
defaultPhoneRegion = "IE";
|
||||||
};
|
};
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
let
|
let
|
||||||
inherit (builtins) mapAttrs;
|
inherit (builtins) mapAttrs;
|
||||||
inherit (lib) mkMerge mkIf mkDefault;
|
inherit (lib) mkMerge mkIf mkDefault;
|
||||||
|
inherit (lib.my.c.nginx) proxyHeaders;
|
||||||
|
inherit (lib.my.c.kelder) domain;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
config = {
|
config = {
|
||||||
@ -73,7 +75,7 @@ in
|
|||||||
proxy_send_timeout 60s;
|
proxy_send_timeout 60s;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
|
|
||||||
${lib.my.nginx.proxyHeaders}
|
${proxyHeaders}
|
||||||
|
|
||||||
# caching
|
# caching
|
||||||
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHE:10m inactive=7d max_size=4g;
|
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHE:10m inactive=7d max_size=4g;
|
||||||
@ -135,15 +137,15 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
"monitor.${lib.my.kelder.domain}" = withAuth {
|
"monitor.${domain}" = withAuth {
|
||||||
serverAliases = [ "monitor-local.${lib.my.kelder.domain}" ];
|
serverAliases = [ "monitor-local.${domain}" ];
|
||||||
extraConfig = localRedirect "monitor-local.${lib.my.kelder.domain}";
|
extraConfig = localRedirect "monitor-local.${domain}";
|
||||||
locations = {
|
locations = {
|
||||||
"/" = {
|
"/" = {
|
||||||
proxyPass = "http://${allAssignments.kelder.ctrs.ipv4.address}:19999";
|
proxyPass = "http://${allAssignments.kelder.ctrs.ipv4.address}:19999";
|
||||||
extraConfig = ''
|
extraConfig = ''
|
||||||
proxy_pass_request_headers on;
|
proxy_pass_request_headers on;
|
||||||
${lib.my.nginx.proxyHeaders}
|
${proxyHeaders}
|
||||||
proxy_set_header Connection "keep-alive";
|
proxy_set_header Connection "keep-alive";
|
||||||
proxy_store off;
|
proxy_store off;
|
||||||
|
|
||||||
@ -155,8 +157,8 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
"kontent.${lib.my.kelder.domain}" = {
|
"kontent.${domain}" = {
|
||||||
serverAliases = [ "kontent-local.${lib.my.kelder.domain}" ];
|
serverAliases = [ "kontent-local.${domain}" ];
|
||||||
locations = {
|
locations = {
|
||||||
"/".proxyPass = "${acquisition}:8096";
|
"/".proxyPass = "${acquisition}:8096";
|
||||||
"= /".return = "302 $scheme://$host/web/";
|
"= /".return = "302 $scheme://$host/web/";
|
||||||
@ -164,47 +166,47 @@ in
|
|||||||
"/socket" = {
|
"/socket" = {
|
||||||
proxyPass = "${acquisition}:8096/socket";
|
proxyPass = "${acquisition}:8096/socket";
|
||||||
proxyWebsockets = true;
|
proxyWebsockets = true;
|
||||||
extraConfig = lib.my.nginx.proxyHeaders;
|
extraConfig = proxyHeaders;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
"torrents.${lib.my.kelder.domain}" = withAuth {
|
"torrents.${domain}" = withAuth {
|
||||||
serverAliases = [ "torrents-local.${lib.my.kelder.domain}" ];
|
serverAliases = [ "torrents-local.${domain}" ];
|
||||||
extraConfig = localRedirect "torrents-local.${lib.my.kelder.domain}";
|
extraConfig = localRedirect "torrents-local.${domain}";
|
||||||
locations."/".proxyPass = "${acquisition}:9091";
|
locations."/".proxyPass = "${acquisition}:9091";
|
||||||
};
|
};
|
||||||
"jackett.${lib.my.kelder.domain}" = withAuth {
|
"jackett.${domain}" = withAuth {
|
||||||
serverAliases = [ "jackett-local.${lib.my.kelder.domain}" ];
|
serverAliases = [ "jackett-local.${domain}" ];
|
||||||
extraConfig = localRedirect "jackett-local.${lib.my.kelder.domain}";
|
extraConfig = localRedirect "jackett-local.${domain}";
|
||||||
locations."/".proxyPass = "${acquisition}:9117";
|
locations."/".proxyPass = "${acquisition}:9117";
|
||||||
};
|
};
|
||||||
"radarr.${lib.my.kelder.domain}" = withAuth {
|
"radarr.${domain}" = withAuth {
|
||||||
serverAliases = [ "radarr-local.${lib.my.kelder.domain}" ];
|
serverAliases = [ "radarr-local.${domain}" ];
|
||||||
extraConfig = localRedirect "radarr-local.${lib.my.kelder.domain}";
|
extraConfig = localRedirect "radarr-local.${domain}";
|
||||||
locations."/" = {
|
locations."/" = {
|
||||||
proxyPass = "${acquisition}:7878";
|
proxyPass = "${acquisition}:7878";
|
||||||
proxyWebsockets = true;
|
proxyWebsockets = true;
|
||||||
extraConfig = lib.my.nginx.proxyHeaders;
|
extraConfig = proxyHeaders;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
"sonarr.${lib.my.kelder.domain}" = withAuth {
|
"sonarr.${domain}" = withAuth {
|
||||||
serverAliases = [ "sonarr-local.${lib.my.kelder.domain}" ];
|
serverAliases = [ "sonarr-local.${domain}" ];
|
||||||
extraConfig = localRedirect "sonarr-local.${lib.my.kelder.domain}";
|
extraConfig = localRedirect "sonarr-local.${domain}";
|
||||||
locations."/" = {
|
locations."/" = {
|
||||||
proxyPass = "${acquisition}:8989";
|
proxyPass = "${acquisition}:8989";
|
||||||
proxyWebsockets = true;
|
proxyWebsockets = true;
|
||||||
extraConfig = lib.my.nginx.proxyHeaders;
|
extraConfig = proxyHeaders;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
"cloud.${lib.my.kelder.domain}" = {
|
"cloud.${domain}" = {
|
||||||
serverAliases = [ "cloud-local.${lib.my.kelder.domain}" ];
|
serverAliases = [ "cloud-local.${domain}" ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
defaultsFor = mapAttrs (n: _: {
|
defaultsFor = mapAttrs (n: _: {
|
||||||
onlySSL = mkDefault true;
|
onlySSL = mkDefault true;
|
||||||
useACMEHost = mkDefault lib.my.kelder.domain;
|
useACMEHost = mkDefault domain;
|
||||||
kTLS = mkDefault true;
|
kTLS = mkDefault true;
|
||||||
http2 = mkDefault true;
|
http2 = mkDefault true;
|
||||||
});
|
});
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{ lib, ... }:
|
{ lib, ... }:
|
||||||
let
|
let
|
||||||
inherit (lib.my) net;
|
inherit (lib.my) net;
|
||||||
inherit (lib.my.kelder) domain prefixes;
|
inherit (lib.my.c.kelder) domain prefixes;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ ./containers ];
|
imports = [ ./containers ];
|
||||||
@ -14,7 +14,7 @@ in
|
|||||||
assignments = {
|
assignments = {
|
||||||
estuary = {
|
estuary = {
|
||||||
ipv4 ={
|
ipv4 ={
|
||||||
address = net.cidr.host 0 lib.my.colony.prefixes.vip2;
|
address = net.cidr.host 0 lib.my.c.colony.prefixes.vip2;
|
||||||
mask = 32;
|
mask = 32;
|
||||||
gateway = null;
|
gateway = null;
|
||||||
};
|
};
|
||||||
@ -85,7 +85,7 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
users = {
|
users = {
|
||||||
groups = with lib.my.kelder.groups; {
|
groups = with lib.my.c.kelder.groups; {
|
||||||
storage.gid = storage;
|
storage.gid = storage;
|
||||||
media.gid = media;
|
media.gid = media;
|
||||||
};
|
};
|
||||||
@ -150,7 +150,7 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
networking = {
|
networking = {
|
||||||
domain = lib.my.kelder.domain;
|
inherit domain;
|
||||||
};
|
};
|
||||||
|
|
||||||
system.nixos.distroName = "KelderOS";
|
system.nixos.distroName = "KelderOS";
|
||||||
@ -180,7 +180,7 @@ in
|
|||||||
{
|
{
|
||||||
wireguardPeerConfig = {
|
wireguardPeerConfig = {
|
||||||
PublicKey = "bP1XUNxp9i8NLOXhgPaIaRzRwi5APbam44/xjvYcyjU=";
|
PublicKey = "bP1XUNxp9i8NLOXhgPaIaRzRwi5APbam44/xjvYcyjU=";
|
||||||
Endpoint = "estuary-vm.${lib.my.colony.domain}:${toString lib.my.kelder.vpn.port}";
|
Endpoint = "estuary-vm.${lib.my.c.colony.domain}:${toString lib.my.c.kelder.vpn.port}";
|
||||||
AllowedIPs = [ "0.0.0.0/0" ];
|
AllowedIPs = [ "0.0.0.0/0" ];
|
||||||
PersistentKeepalive = 25;
|
PersistentKeepalive = 25;
|
||||||
};
|
};
|
||||||
@ -270,7 +270,6 @@ in
|
|||||||
config.name = "kontent";
|
config.name = "kontent";
|
||||||
};
|
};
|
||||||
|
|
||||||
#deploy.generate.system.mode = "boot";
|
|
||||||
#deploy.node.hostname = "10.16.9.21";
|
#deploy.node.hostname = "10.16.9.21";
|
||||||
secrets = {
|
secrets = {
|
||||||
key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOFvUdJshXkqmchEgkZDn5rgtZ1NO9vbd6Px+S6YioWi";
|
key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOFvUdJshXkqmchEgkZDn5rgtZ1NO9vbd6Px+S6YioWi";
|
||||||
@ -311,7 +310,7 @@ in
|
|||||||
chain prerouting {
|
chain prerouting {
|
||||||
type filter hook prerouting priority mangle; policy accept;
|
type filter hook prerouting priority mangle; policy accept;
|
||||||
ip daddr ${assignments.estuary.ipv4.address} ct state new ct mark set ${toString dnatMark}
|
ip daddr ${assignments.estuary.ipv4.address} ct state new ct mark set ${toString dnatMark}
|
||||||
ip saddr ${lib.my.kelder.prefixes.all.v4} ct mark != 0 meta mark set ct mark
|
ip saddr ${lib.my.c.kelder.prefixes.all.v4} ct mark != 0 meta mark set ct mark
|
||||||
}
|
}
|
||||||
chain output {
|
chain output {
|
||||||
type filter hook output priority mangle; policy accept;
|
type filter hook output priority mangle; policy accept;
|
||||||
@ -320,7 +319,7 @@ in
|
|||||||
}
|
}
|
||||||
table inet nat {
|
table inet nat {
|
||||||
chain postrouting {
|
chain postrouting {
|
||||||
ip saddr ${lib.my.kelder.prefixes.all.v4} oifname et1g0 masquerade
|
ip saddr ${lib.my.c.kelder.prefixes.all.v4} oifname et1g0 masquerade
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
environment.sessionVariables = {
|
environment.sessionVariables = {
|
||||||
INSTALL_ROOT = installRoot;
|
INSTALL_ROOT = installRoot;
|
||||||
};
|
};
|
||||||
users.users.root.openssh.authorizedKeys.keyFiles = [ lib.my.sshKeyFiles.deploy ];
|
users.users.root.openssh.authorizedKeys.keyFiles = [ lib.my.c.sshKeyFiles.deploy ];
|
||||||
home-manager.users.root = {
|
home-manager.users.root = {
|
||||||
programs = {
|
programs = {
|
||||||
starship.settings = {
|
starship.settings = {
|
||||||
|
@ -47,7 +47,7 @@ in
|
|||||||
#"https://nix-cache.nul.ie"
|
#"https://nix-cache.nul.ie"
|
||||||
"https://cache.nixos.org"
|
"https://cache.nixos.org"
|
||||||
];
|
];
|
||||||
trusted-public-keys = lib.my.nix.cacheKeys;
|
trusted-public-keys = lib.my.c.nix.cacheKeys;
|
||||||
};
|
};
|
||||||
registry = {
|
registry = {
|
||||||
pkgs = {
|
pkgs = {
|
||||||
|
@ -86,7 +86,7 @@ in
|
|||||||
options.my.deploy = with lib.types; {
|
options.my.deploy = with lib.types; {
|
||||||
authorizedKeys = {
|
authorizedKeys = {
|
||||||
keys = mkOpt' (listOf singleLineStr) [ ] "SSH public keys to add to the default deployment user.";
|
keys = mkOpt' (listOf singleLineStr) [ ] "SSH public keys to add to the default deployment user.";
|
||||||
keyFiles = mkOpt' (listOf path) [ lib.my.sshKeyFiles.deploy ] "SSH public key files to add to the default deployment user.";
|
keyFiles = mkOpt' (listOf path) [ lib.my.c.sshKeyFiles.deploy ] "SSH public key files to add to the default deployment user.";
|
||||||
};
|
};
|
||||||
|
|
||||||
enable = mkBoolOpt' true "Whether to expose deploy-rs configuration for this system.";
|
enable = mkBoolOpt' true "Whether to expose deploy-rs configuration for this system.";
|
||||||
|
@ -6,7 +6,7 @@ in
|
|||||||
config = mkMerge [
|
config = mkMerge [
|
||||||
{
|
{
|
||||||
networking = {
|
networking = {
|
||||||
domain = mkDefault "int.${lib.my.pubDomain}";
|
domain = mkDefault "int.${lib.my.c.pubDomain}";
|
||||||
useDHCP = false;
|
useDHCP = false;
|
||||||
enableIPv6 = mkDefault true;
|
enableIPv6 = mkDefault true;
|
||||||
useNetworkd = mkDefault true;
|
useNetworkd = mkDefault true;
|
||||||
|
@ -256,6 +256,18 @@ in
|
|||||||
my.tmproot.persistence.config.files =
|
my.tmproot.persistence.config.files =
|
||||||
concatMap (k: [ k.path "${k.path}.pub" ]) config.services.openssh.hostKeys;
|
concatMap (k: [ k.path "${k.path}.pub" ]) config.services.openssh.hostKeys;
|
||||||
})
|
})
|
||||||
|
(mkIf config.services.lvm.enable {
|
||||||
|
my.tmproot.persistence.config.directories = [
|
||||||
|
{
|
||||||
|
directory = "/etc/lvm/archive";
|
||||||
|
mode = "0700";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
directory = "/etc/lvm/backup";
|
||||||
|
mode = "0700";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
})
|
||||||
(mkIf (config.security.acme.certs != { }) {
|
(mkIf (config.security.acme.certs != { }) {
|
||||||
my.tmproot.persistence.config.directories = [
|
my.tmproot.persistence.config.directories = [
|
||||||
{
|
{
|
||||||
@ -424,6 +436,19 @@ in
|
|||||||
"/var/lib/samba"
|
"/var/lib/samba"
|
||||||
];
|
];
|
||||||
})
|
})
|
||||||
|
(mkIf config.hardware.rasdaemon.enable {
|
||||||
|
my.tmproot.persistence.config.directories = [ "/var/lib/rasdaemon" ];
|
||||||
|
})
|
||||||
|
(mkIf (config.services.gitea-actions-runner.instances != { }) {
|
||||||
|
my.tmproot.persistence.config.directories = [
|
||||||
|
{
|
||||||
|
directory = "/var/lib/gitea-runner";
|
||||||
|
mode = "0750";
|
||||||
|
user = "gitea-runner";
|
||||||
|
group = "gitea-runner";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
})
|
||||||
]))
|
]))
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ in
|
|||||||
shell =
|
shell =
|
||||||
let shell = cfg.homeConfig.my.shell;
|
let shell = cfg.homeConfig.my.shell;
|
||||||
in mkIf (shell != null) (mkDefault' shell);
|
in mkIf (shell != null) (mkDefault' shell);
|
||||||
openssh.authorizedKeys.keyFiles = [ lib.my.sshKeyFiles.me ];
|
openssh.authorizedKeys.keyFiles = [ lib.my.c.sshKeyFiles.me ];
|
||||||
};
|
};
|
||||||
homeConfig = {
|
homeConfig = {
|
||||||
# In order for this option to evaluate on its own, home-manager expects the `name` (which is derived from the
|
# In order for this option to evaluate on its own, home-manager expects the `name` (which is derived from the
|
||||||
|
16
secrets/chatterbox/syncv3.env.age
Normal file
16
secrets/chatterbox/syncv3.env.age
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IFpCM2U2USBYUTlr
|
||||||
|
Mm1ubFFPTHhhb3NERHJPaXoxamt5bUtqQmRkUTFGZCsvaUtyZGdrCmVNUEtrSTVQ
|
||||||
|
MkdHWnd1OTNSN3lOaFdrdWsxUHM2S0VZVlNRWGt4R0FyZ0UKLT4gWDI1NTE5IFNZ
|
||||||
|
QUhpVU04WWpEZThEaE82WDJvT3NVVWxNRVFEZjluVW8rbGhOQ0Rua0kKOWlZYlFh
|
||||||
|
RjduNDAwS0NJa0lPNmx6dmIvdmFtcXJyaG5FQ2hVU01qby9sTQotPiBVJjEhLWdy
|
||||||
|
ZWFzZSBOYyllZE4KV0lYMmErd3RvUWp1UVRvdlpKTUZWWlJHK1laN2FoZGh2aVlM
|
||||||
|
dTdLbWZsVkozVTBwb2JyeGpFMy9FcjR0eDhxQQpUL05uT2ZSUytNV01wMjFYRWZL
|
||||||
|
NTRkSmlkcUl4LzJYTDQwMm43cVJVeTdkY0dxdkI1ZjA3Z2NoU3NBCi0tLSB4Y3lV
|
||||||
|
UVphTEtIWFhVQ1h4MUZzNDYzSEhDUFpMcE1ZdFNtd1A2Rk5lMUhRCp/F11nGICQA
|
||||||
|
L5uInKKk8jVGzpG93U4Kz3zut6jGF/is4cVuvkRHZLKiUVC4kILirdinnbxlJY2Y
|
||||||
|
Gkpef0zthmNhfFhsgjj5Tmxyiu1L+6GkY0z2GlKR8uRUG4bXsDQzDkZQm8Wcmrrt
|
||||||
|
9lG04SI0Dj7Gc2HJEwjl7ZPBi9qnFU49on+/Y5DIpzTllgE7luduFLjLM2Q+kNGK
|
||||||
|
cU8cF+gvrpyAFytiUZ3jhATtXsqC0dzsugjj8pmT1WQzZd6iqVJ84G2pMg+boVyn
|
||||||
|
aVLGrcn3qOnIIJLKrYEjyxSYMGs=
|
||||||
|
-----END AGE ENCRYPTED FILE-----
|
11
secrets/gitea/actions-runner.env.age
Normal file
11
secrets/gitea/actions-runner.env.age
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IC9FSlh2ZyA0Ynpx
|
||||||
|
ZU84aTNsaCsrd0ZXRHQxZmt6dnpGNUViQlhJSEs2d0lVQWhWN3gwCi9KQmJPN092
|
||||||
|
Tjl5UjFNeWtsdXhtNjhFdlNrS0Ezb1lqT1NjNDY2ZXd1cFUKLT4gWDI1NTE5IFRT
|
||||||
|
Rld4NUNOaHB0b0l2eTQ5STB5V0dnZS9YUjF1RTZ5VndDaW5SYzg3aU0KcU9jbDlx
|
||||||
|
czZkVm5pUVlmdEw1MEVheU9QN3hpRzlUbFR1WTdNOEpKU3lNTQotPiBkXDItZ3Jl
|
||||||
|
YXNlCnQrY3FaendQNVF6RXNUWGZ4TE81QXJycC9kVTZjMDY4dnVLVkhIVWlMSlRS
|
||||||
|
NjRsL0o0YVlUUQotLS0gY0tlekNPbzdaa1EySlA2bkdqbmRMbUhUVm01NjJ1MEgv
|
||||||
|
K2dqcDhQL3BCdwpUfh9ODJOtZ0jkeOSdCj17XbuALje7tBa41o2nl6at+WIgiodJ
|
||||||
|
xZ+COxUZ4W1ehK2Nrjqe0zGL08JwHB3vt3Y5oitdlrjZcQRsBmM/GRKu
|
||||||
|
-----END AGE ENCRYPTED FILE-----
|
10
secrets/gitea/db.txt.age
Normal file
10
secrets/gitea/db.txt.age
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IEJhUWxSZyBRK3Zp
|
||||||
|
OTVnQ2lZRzloWE1hYmxMYWZERDdXL0pTdFVGYUN3Vk0wbkhBWTFBCkg1YkVidmwy
|
||||||
|
ZVhDSWJOTXB6Qmw5OXNVU0RVUlFyQkE4MVE2eUp6ZXZBOHMKLT4gWDI1NTE5IG9u
|
||||||
|
YUMxZkhHc0RVZkQ3UEEvazArRnl5NGpvTkJPRWdFbm9qYzdjZjNZZ28KRU1FdmMz
|
||||||
|
cVlzbHRFWUZqbkw2Ry9QVXppTFdNRTIwWnJBYzc0NUxieUMvRQotPiAxbn4nYSxC
|
||||||
|
LWdyZWFzZSBNRyAxO0EgVDoKQklPUS93Ci0tLSBoTXhqZ2VjNTlOVzdBN25CeUdD
|
||||||
|
VFJtT2pDWi9taXh1SHpNTG9oeHJsbE9jCgGD+69tbzN5f1FlBBSMb/2GgJW2cmXI
|
||||||
|
97MXqA888ugf0vppdqy5yu+D4GdjoIvkKv0=
|
||||||
|
-----END AGE ENCRYPTED FILE-----
|
11
secrets/gitea/mail.txt.age
Normal file
11
secrets/gitea/mail.txt.age
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IEJhUWxSZyBGekxK
|
||||||
|
ZFVBQkpTeGtzcHJuektzS0hPUFBIelg5UzQvVzg3SXJmSE9NbG5nCjFMbDBMcmFw
|
||||||
|
dG9xaHpGV2RvZDg3WjRueTZtUGR3TnUyZE8yM1Rhdi83MGcKLT4gWDI1NTE5IGRu
|
||||||
|
Ry9ZNVIyWEYvcWhCOWx0eEVVcnFaYm5IK3Fhc1Z1Ykg0VDFEbE0wU28KcnFGN3Rs
|
||||||
|
bEtUazc3dkFCMEN2V2hTNFhlK2Z0OWQyNjNjaW5kbVU2OVozQQotPiAlfj84LWdy
|
||||||
|
ZWFzZSBNLzc9fUcgNi5nKCBdRk50dSB1ClJkdmx0VjVUK0o3cmxrY1JycktXVkFS
|
||||||
|
Yk10a3plZmsKLS0tIEVzUEhoUEE5TkZFK01BckxpZ0tKV2hZRERRbnFQUnlXRjQx
|
||||||
|
RExPb1B3dHMKUaxZI1wEt10kHnWMgn3Na0UVpn/bhGpwXpToyH0Gzdjy5mQiPvcl
|
||||||
|
X8RKm1wpkrLhXA==
|
||||||
|
-----END AGE ENCRYPTED FILE-----
|
Loading…
x
Reference in New Issue
Block a user