diff options
Diffstat (limited to 'hosts')
22 files changed, 312 insertions, 218 deletions
diff --git a/hosts/eostre/default.nix b/hosts/eostre/default.nix index fd4b15f2..d4113024 100644 --- a/hosts/eostre/default.nix +++ b/hosts/eostre/default.nix | |||
@@ -37,14 +37,10 @@ with lib; | |||
37 | powerManagement.enable = true; | 37 | powerManagement.enable = true; |
38 | }; | 38 | }; |
39 | 39 | ||
40 | opengl.enable = true; | 40 | graphics.enable = true; |
41 | }; | 41 | }; |
42 | 42 | ||
43 | environment.etc."machine-id".text = "f457b21333f1491e916521151ff5d468"; | ||
44 | |||
45 | networking = { | 43 | networking = { |
46 | hostId = "f457b213"; | ||
47 | |||
48 | domain = "lan.yggdrasil"; | 44 | domain = "lan.yggdrasil"; |
49 | search = [ "lan.yggdrasil" "yggdrasil" ]; | 45 | search = [ "lan.yggdrasil" "yggdrasil" ]; |
50 | 46 | ||
@@ -83,19 +79,14 @@ with lib; | |||
83 | ]; | 79 | ]; |
84 | }; | 80 | }; |
85 | 81 | ||
86 | 82 | services.displayManager.sddm = { | |
87 | services.xserver = { | ||
88 | enable = true; | 83 | enable = true; |
89 | displayManager.sddm = { | 84 | wayland.enable = true; |
90 | enable = true; | 85 | settings = { |
91 | settings = { | 86 | Users.HideUsers = "gkleen"; |
92 | Users.HideUsers = "gkleen"; | ||
93 | }; | ||
94 | }; | 87 | }; |
95 | desktopManager.plasma5.enable = true; | ||
96 | |||
97 | videoDrivers = [ "nvidia" ]; | ||
98 | }; | 88 | }; |
89 | services.desktopManager.plasma6.enable = true; | ||
99 | 90 | ||
100 | 91 | ||
101 | services.openssh = { | 92 | services.openssh = { |
diff --git a/hosts/sif/default.nix b/hosts/sif/default.nix index b50cad60..ed85ca17 100644 --- a/hosts/sif/default.nix +++ b/hosts/sif/default.nix | |||
@@ -12,10 +12,9 @@ let | |||
12 | in { | 12 | in { |
13 | imports = with flake.nixosModules.systemProfiles; [ | 13 | imports = with flake.nixosModules.systemProfiles; [ |
14 | ./hw.nix | 14 | ./hw.nix |
15 | ./mail ./libvirt ./greetd | 15 | ./email ./libvirt ./greetd |
16 | tmpfs-root bcachefs initrd-all-crypto-modules default-locale openssh rebuild-machines niri-unstable networkmanager | 16 | tmpfs-root bcachefs initrd-all-crypto-modules default-locale openssh rebuild-machines niri-unstable networkmanager lanzaboote |
17 | flakeInputs.nixos-hardware.nixosModules.lenovo-thinkpad-p1 | 17 | flakeInputs.nixos-hardware.nixosModules.lenovo-thinkpad-p1 |
18 | flakeInputs.impermanence.nixosModules.impermanence | ||
19 | flakeInputs.nixVirt.nixosModules.default | 18 | flakeInputs.nixVirt.nixosModules.default |
20 | ]; | 19 | ]; |
21 | 20 | ||
@@ -34,6 +33,10 @@ in { | |||
34 | initrd = { | 33 | initrd = { |
35 | systemd = { | 34 | systemd = { |
36 | emergencyAccess = config.users.users.root.hashedPassword; | 35 | emergencyAccess = config.users.users.root.hashedPassword; |
36 | extraBin = { | ||
37 | "vim" = lib.getExe pkgs.vim; | ||
38 | "grep" = lib.getExe pkgs.gnugrep; | ||
39 | }; | ||
37 | }; | 40 | }; |
38 | luks.devices = { | 41 | luks.devices = { |
39 | nvm0 = { device = "/dev/disk/by-uuid/bef17e86-d929-4a60-97cb-6bfa133face7"; bypassWorkqueues = true; }; | 42 | nvm0 = { device = "/dev/disk/by-uuid/bef17e86-d929-4a60-97cb-6bfa133face7"; bypassWorkqueues = true; }; |
@@ -47,13 +50,8 @@ in { | |||
47 | 50 | ||
48 | blacklistedKernelModules = [ "nouveau" ]; | 51 | blacklistedKernelModules = [ "nouveau" ]; |
49 | 52 | ||
50 | # Use the systemd-boot EFI boot loader. | 53 | lanzaboote.configurationLimit = 15; |
51 | loader = { | 54 | loader = { |
52 | systemd-boot = { | ||
53 | enable = true; | ||
54 | configurationLimit = 15; | ||
55 | netbootxyz.enable = true; | ||
56 | }; | ||
57 | efi.canTouchEfiVariables = true; | 55 | efi.canTouchEfiVariables = true; |
58 | timeout = null; | 56 | timeout = null; |
59 | }; | 57 | }; |
@@ -64,19 +62,27 @@ in { | |||
64 | kernelPatches = [ | 62 | kernelPatches = [ |
65 | { name = "edac-config"; | 63 | { name = "edac-config"; |
66 | patch = null; | 64 | patch = null; |
67 | extraStructuredConfig = with lib.kernel; { | 65 | structuredExtraConfig = with lib.kernel; { |
68 | EDAC = yes; | 66 | EDAC = yes; |
69 | EDAC_IE31200 = yes; | 67 | EDAC_IE31200 = yes; |
70 | }; | 68 | }; |
71 | } | 69 | } |
72 | { name = "zswap-default"; | 70 | { name = "zswap-default"; |
73 | patch = null; | 71 | patch = null; |
74 | extraStructuredConfig = with lib.kernel; { | 72 | structuredExtraConfig = with lib.kernel; { |
75 | ZSWAP_DEFAULT_ON = yes; | 73 | ZSWAP_DEFAULT_ON = yes; |
76 | ZSWAP_SHRINKER_DEFAULT_ON = yes; | 74 | ZSWAP_SHRINKER_DEFAULT_ON = yes; |
77 | }; | 75 | }; |
78 | } | 76 | } |
79 | ]; | 77 | ]; |
78 | consoleLogLevel = 3; | ||
79 | kernelParams = [ | ||
80 | "quiet" | ||
81 | "boot.shell_on_fail" | ||
82 | "udev.log_priority=3" | ||
83 | "rd.systemd.show_status=auto" | ||
84 | "plymouth.use-simpledrm" | ||
85 | ]; | ||
80 | 86 | ||
81 | tmp.useTmpfs = true; | 87 | tmp.useTmpfs = true; |
82 | 88 | ||
@@ -98,6 +104,8 @@ in { | |||
98 | server ptbtime2.ptb.de prefer iburst nts | 104 | server ptbtime2.ptb.de prefer iburst nts |
99 | server ptbtime3.ptb.de prefer iburst nts | 105 | server ptbtime3.ptb.de prefer iburst nts |
100 | server ptbtime4.ptb.de prefer iburst nts | 106 | server ptbtime4.ptb.de prefer iburst nts |
107 | pool ntppool1.time.nl prefer iburst nts | ||
108 | pool ntppool2.time.nl prefer iburst nts | ||
101 | 109 | ||
102 | authselectmode require | 110 | authselectmode require |
103 | minsources 3 | 111 | minsources 3 |
@@ -130,6 +138,12 @@ in { | |||
130 | useNetworkd = true; | 138 | useNetworkd = true; |
131 | }; | 139 | }; |
132 | 140 | ||
141 | environment.etc."NetworkManager/dnsmasq.d/dnssec.conf" = { | ||
142 | text = '' | ||
143 | conf-file=${pkgs.dnsmasq}/share/dnsmasq/trust-anchors.conf | ||
144 | dnssec | ||
145 | ''; | ||
146 | }; | ||
133 | environment.etc."NetworkManager/dnsmasq.d/libvirt_dnsmasq.conf" = { | 147 | environment.etc."NetworkManager/dnsmasq.d/libvirt_dnsmasq.conf" = { |
134 | text = '' | 148 | text = '' |
135 | except-interface=virbr0 | 149 | except-interface=virbr0 |
@@ -372,19 +386,6 @@ in { | |||
372 | ]; | 386 | ]; |
373 | 387 | ||
374 | services = { | 388 | services = { |
375 | uucp = { | ||
376 | enable = true; | ||
377 | nodeName = "sif"; | ||
378 | remoteNodes = { | ||
379 | "ymir" = { | ||
380 | publicKeys = ["ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG6KNtsCOl5fsZ4rV7udTulGMphJweLBoKapzerWNoLY root@ymir"]; | ||
381 | hostnames = ["ymir.yggdrasil.li" "ymir.niflheim.yggdrasil"]; | ||
382 | }; | ||
383 | }; | ||
384 | |||
385 | defaultCommands = lib.mkForce []; | ||
386 | }; | ||
387 | |||
388 | avahi.enable = true; | 389 | avahi.enable = true; |
389 | 390 | ||
390 | fwupd.enable = true; | 391 | fwupd.enable = true; |
@@ -446,11 +447,6 @@ in { | |||
446 | 447 | ||
447 | systemd.tmpfiles.settings = { | 448 | systemd.tmpfiles.settings = { |
448 | "10-localtime"."/etc/localtime".L.argument = "/.bcachefs/etc/localtime"; | 449 | "10-localtime"."/etc/localtime".L.argument = "/.bcachefs/etc/localtime"; |
449 | |||
450 | # "10-regreet"."/var/cache/regreet/cache.toml".C.argument = toString ((pkgs.formats.toml {}).generate "cache.toml" { | ||
451 | # last_user = "gkleen"; | ||
452 | # user_to_last_sess.gkleen = "Niri"; | ||
453 | # }); | ||
454 | }; | 450 | }; |
455 | 451 | ||
456 | users = { | 452 | users = { |
@@ -679,25 +675,15 @@ in { | |||
679 | "/var/lib/bluetooth" | 675 | "/var/lib/bluetooth" |
680 | "/var/lib/upower" | 676 | "/var/lib/upower" |
681 | "/var/lib/postfix" | 677 | "/var/lib/postfix" |
678 | "/var/lib/regreet" | ||
682 | "/etc/NetworkManager/system-connections" | 679 | "/etc/NetworkManager/system-connections" |
683 | { directory = "/var/uucp"; user = "uucp"; group = "uucp"; mode = "0700"; } | 680 | config.boot.lanzaboote.pkiBundle |
684 | { directory = "/var/spool/uucp"; user = "uucp"; group = "uucp"; mode = "0750"; } | ||
685 | ]; | 681 | ]; |
686 | files = [ | 682 | files = [ |
687 | ]; | 683 | ]; |
684 | timezone = true; | ||
688 | }; | 685 | }; |
689 | 686 | ||
690 | systemd.services.timezone = { | ||
691 | wantedBy = [ "multi-user.target" ]; | ||
692 | serviceConfig = { | ||
693 | Type = "oneshot"; | ||
694 | RemainAfterExit = true; | ||
695 | ExecStart = "${pkgs.coreutils}/bin/cp -vP /.bcachefs/etc/localtime /etc/localtime"; | ||
696 | ExecStop = "${pkgs.coreutils}/bin/cp -vP /etc/localtime /.bcachefs/etc/localtime"; | ||
697 | }; | ||
698 | }; | ||
699 | services.tzupdate.enable = true; | ||
700 | |||
701 | security.pam.services.gtklock = {}; | 687 | security.pam.services.gtklock = {}; |
702 | 688 | ||
703 | home-manager.sharedModules = [ flakeInputs.nixVirt.homeModules.default ]; | 689 | home-manager.sharedModules = [ flakeInputs.nixVirt.homeModules.default ]; |
diff --git a/hosts/sif/email/default.nix b/hosts/sif/email/default.nix new file mode 100644 index 00000000..bebf7980 --- /dev/null +++ b/hosts/sif/email/default.nix | |||
@@ -0,0 +1,111 @@ | |||
1 | { config, lib, pkgs, ... }: | ||
2 | { | ||
3 | services.postfix = { | ||
4 | enable = true; | ||
5 | enableSmtp = false; | ||
6 | enableSubmission = false; | ||
7 | setSendmail = true; | ||
8 | # networksStyle = "host"; | ||
9 | settings.main = { | ||
10 | recpipient_delimiter = "+"; | ||
11 | mydestination = []; | ||
12 | myhostname = "sif.midgard.yggdrasil"; | ||
13 | |||
14 | mydomain = "yggdrasil.li"; | ||
15 | |||
16 | local_transport = "error:5.1.1 No local delivery"; | ||
17 | alias_database = []; | ||
18 | alias_maps = []; | ||
19 | local_recipient_maps = []; | ||
20 | |||
21 | inet_interfaces = "loopback-only"; | ||
22 | |||
23 | message_size_limit = 0; | ||
24 | |||
25 | authorized_submit_users = "inline:{ gkleen= }"; | ||
26 | authorized_flush_users = "inline:{ gkleen= }"; | ||
27 | authorized_mailq_users = "inline:{ gkleen= }"; | ||
28 | |||
29 | smtp_generic_maps = "inline:{ root=root+sif }"; | ||
30 | |||
31 | mynetworks = ["127.0.0.0/8" "[::1]/128"]; | ||
32 | smtpd_client_restrictions = ["permit_mynetworks" "reject"]; | ||
33 | smtpd_relay_restrictions = ["permit_mynetworks" "reject"]; | ||
34 | |||
35 | sender_dependent_default_transport_maps = ''regexp:${pkgs.writeText "sender_relay" '' | ||
36 | /@(cip|stud)\.ifi\.(lmu|uni-muenchen)\.de$/ smtp:smtp.ifi.lmu.de | ||
37 | /@ifi\.(lmu|uni-muenchen)\.de$/ smtp:smtpin1.ifi.lmu.de:587 | ||
38 | /@math(ematik)?\.(lmu|uni-muenchen)\.de$/ smtps:smtp.math.lmu.de:465 | ||
39 | /@(campus\.)?lmu\.de$/ smtp:postout.lrz.de | ||
40 | ''}''; | ||
41 | sender_bcc_maps = ''regexp:${pkgs.writeText "sender_bcc" '' | ||
42 | /^uni2work(-[^@]*)?@ifi\.lmu\.de$/ uni2work@ifi.lmu.de | ||
43 | /@ifi\.lmu\.de$/ gregor.kleen@ifi.lmu.de | ||
44 | ''}''; | ||
45 | relayhost = ["[surtr.yggdrasil.li]:465"]; | ||
46 | default_transport = "relay"; | ||
47 | |||
48 | smtp_sasl_auth_enable = true; | ||
49 | smtp_sender_dependent_authentication = true; | ||
50 | smtp_sasl_tls_security_options = "noanonymous"; | ||
51 | smtp_sasl_mechanism_filter = ["plain"]; | ||
52 | smtp_sasl_password_maps = "regexp:/run/credentials/postfix.service/sasl_passwd"; | ||
53 | smtp_cname_overrides_servername = false; | ||
54 | smtp_always_send_ehlo = true; | ||
55 | smtp_tls_security_level = "dane"; | ||
56 | |||
57 | smtp_tls_loglevel = "1"; | ||
58 | smtp_dns_support_level = "dnssec"; | ||
59 | }; | ||
60 | settings.master = { | ||
61 | submission = { | ||
62 | type = "inet"; | ||
63 | private = false; | ||
64 | command = "smtpd"; | ||
65 | args = [ | ||
66 | "-o" "syslog_name=postfix/$service_name" | ||
67 | ]; | ||
68 | }; | ||
69 | smtp = { }; | ||
70 | smtps = { | ||
71 | type = "unix"; | ||
72 | private = true; | ||
73 | privileged = true; | ||
74 | chroot = false; | ||
75 | command = "smtp"; | ||
76 | args = [ | ||
77 | "-o" "smtp_tls_wrappermode=yes" | ||
78 | "-o" "smtp_tls_security_level=encrypt" | ||
79 | ]; | ||
80 | }; | ||
81 | relay = { | ||
82 | command = "smtp"; | ||
83 | args = [ | ||
84 | "-o" "smtp_fallback_relay=" | ||
85 | "-o" "smtp_tls_security_level=verify" | ||
86 | "-o" "smtp_tls_wrappermode=yes" | ||
87 | "-o" "smtp_tls_cert_file=${./relay.crt}" | ||
88 | "-o" "smtp_tls_key_file=/run/credentials/postfix.service/relay.key" | ||
89 | ]; | ||
90 | }; | ||
91 | }; | ||
92 | }; | ||
93 | |||
94 | systemd.services.postfix = { | ||
95 | serviceConfig.LoadCredential = [ | ||
96 | "sasl_passwd:${config.sops.secrets."postfix-sasl-passwd".path}" | ||
97 | "relay.key:${config.sops.secrets."relay-key".path}" | ||
98 | ]; | ||
99 | }; | ||
100 | |||
101 | sops.secrets = { | ||
102 | postfix-sasl-passwd = { | ||
103 | key = "sasl-passwd"; | ||
104 | sopsFile = ./secrets.yaml; | ||
105 | }; | ||
106 | relay-key = { | ||
107 | format = "binary"; | ||
108 | sopsFile = ./relay.key; | ||
109 | }; | ||
110 | }; | ||
111 | } | ||
diff --git a/hosts/sif/email/relay.crt b/hosts/sif/email/relay.crt new file mode 100644 index 00000000..ac13e7cb --- /dev/null +++ b/hosts/sif/email/relay.crt | |||
@@ -0,0 +1,11 @@ | |||
1 | -----BEGIN CERTIFICATE----- | ||
2 | MIIBjDCCAQygAwIBAgIPQAAAAGgLfNoL/PSMAsutMAUGAytlcTAXMRUwEwYDVQQD | ||
3 | DAx5Z2dkcmFzaWwubGkwHhcNMjUwNDI1MTIwOTQ1WhcNMzUwNDI2MTIxNDQ1WjAR | ||
4 | MQ8wDQYDVQQDDAZna2xlZW4wKjAFBgMrZXADIQB3outi3/3F4YO7Q97WAAaMHW0a | ||
5 | m+Blldrgee+EZnWnD6N1MHMwHwYDVR0jBBgwFoAUTtn+VjMw6Ge1f68KD8dT1CWn | ||
6 | l3YwHQYDVR0OBBYEFFOa4rYZYMbXUVdKv98NB504GUhjMA4GA1UdDwEB/wQEAwID | ||
7 | 6DAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMAUGAytlcQNzABC0 | ||
8 | 0UgIt7gLZrU1TmzGoqPBris8R1DbKOJacicF5CU0MIIjHcX7mPFW8KtB4qm6KcPq | ||
9 | kF6IaEPmgKpX3Nubk8HJik9vhIy9ysfINcVTvzXx8pO1bxbvREJRyA/apj10nzav | ||
10 | yauId0cXHvN6g5RLAMsMAA== | ||
11 | -----END CERTIFICATE----- | ||
diff --git a/hosts/sif/email/relay.key b/hosts/sif/email/relay.key new file mode 100644 index 00000000..412a44e0 --- /dev/null +++ b/hosts/sif/email/relay.key | |||
@@ -0,0 +1,19 @@ | |||
1 | { | ||
2 | "data": "ENC[AES256_GCM,data:lBlTuzOS75pvRmcTKT4KhHMH44RlE2SvCFAUP+GfsXws1Uai7DZ1MmbhvxxCa+pcLW19+sQYxrXLRNZWby1yOeKBJ2UQeYV5LOk9LSL/WIE3FZkCo5Dv0O0gSFKjjb61WN22a4JnHbLWADf/mLT3GZv91XfvFDo=,iv:ho8wQH3UNzX9JPW5gVcUGtxZzdVwsMFus0Z4KYe5t48=,tag:dAgZyHOva2xVVhE1nTl+lg==,type:str]", | ||
3 | "sops": { | ||
4 | "age": [ | ||
5 | { | ||
6 | "recipient": "age1rmmhetcmllq0ahl5qznlr0eya2zdxwl9h6y5wnl97d2wtyx5t99sm2u866", | ||
7 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB6eTVRSUdFNUZGZmcxSUlT\nWmlsOGNyWXIzMGNTZjlKbXlhcEdZUXFRVkR3Cll0T0RMd0h2UW16QkR3SHlhYmNZ\nNDFrYXh3Rkp5NWsvcWc3UFJJaHVwT1UKLS0tIHhXVEI0VHBZVkpDQ1FzWENjMmJH\nb1FQWXVUUTBiZ1pKWG00MTNqVEo2SjAKK3VOU+QgRuxWYWEcrJiVMRFCprBICz4F\ngD+9zuPUzPezyJkYwTs+M+wX5GYkXppqm5W58yQLS2UDD38sr+SRjg==\n-----END AGE ENCRYPTED FILE-----\n" | ||
8 | }, | ||
9 | { | ||
10 | "recipient": "age1fj65apkhfkrwyv5tx6zcs9nkjg8267fy733qph30sc7zfn7vapjqkd5kne", | ||
11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzWmJmZDVFazN2bDY1TkNG\nNXpJN2twMFFjZUxMTVdSNzJwQTFiYktrcGdrCjk4eFVHTko0bFVMSlFFWm9tbjMr\nbWNHMEQ1Rm1qUVhodlB1RGw2aDc4TUEKLS0tIERBK0J5NkN4OXJEZ1ZOZXhNc1Jm\naWNnUmZGbTIxdmNkYi9TZ2h2bGs3MVEKPQGaEf7M/5/xvSOfawpIp50fB3QfFSuz\nPgkrPMneaBeUx+uBYMyEFX4rpzLIBR3pnYMjAfoc+bjWaOtGQuEqyQ==\n-----END AGE ENCRYPTED FILE-----\n" | ||
12 | } | ||
13 | ], | ||
14 | "lastmodified": "2025-04-25T12:14:44Z", | ||
15 | "mac": "ENC[AES256_GCM,data:pObl2bJA93az9E3Ya+hA3ekI8TKKZ9NNTi0KzmWZBOiQwi9FuQYtpnmmT80L1KXWyOKJV6wGdAri3mNe/ue2S0TziSbQ/4+Dj4ubFKgkH7thb5q2dFyxw5FzhYzRQiXFqD/pxcNN9uL0lQI2Al0Eci0zX8Kcd1rAQ6RzLEoSmco=,iv:zo/3QFKTUEDxLy1k5yyU7Z1JMZ7cKdYUc6GHjaTTZKQ=,tag:f63Eja3lBfwJCYAOyEt56g==,type:str]", | ||
16 | "unencrypted_suffix": "_unencrypted", | ||
17 | "version": "3.10.2" | ||
18 | } | ||
19 | } | ||
diff --git a/hosts/sif/mail/secrets.yaml b/hosts/sif/email/secrets.yaml index 3c74b710..3c74b710 100644 --- a/hosts/sif/mail/secrets.yaml +++ b/hosts/sif/email/secrets.yaml | |||
diff --git a/hosts/sif/hw.nix b/hosts/sif/hw.nix index 1bcf0261..e567c37d 100644 --- a/hosts/sif/hw.nix +++ b/hosts/sif/hw.nix | |||
@@ -25,7 +25,7 @@ | |||
25 | # system.etc.overlay.enable = false; | 25 | # system.etc.overlay.enable = false; |
26 | 26 | ||
27 | boot.initrd.systemd.packages = [ | 27 | boot.initrd.systemd.packages = [ |
28 | (pkgs.writeTextDir "/etc/systemd/system/\\x2ebcachefs.mount.d/block_scan.conf" '' | 28 | (pkgs.writeTextDir "/etc/systemd/system/sysroot-.bcachefs.mount.d/block_scan.conf" '' |
29 | [Mount] | 29 | [Mount] |
30 | Environment=BCACHEFS_BLOCK_SCAN=1 | 30 | Environment=BCACHEFS_BLOCK_SCAN=1 |
31 | '') | 31 | '') |
diff --git a/hosts/sif/mail/default.nix b/hosts/sif/mail/default.nix deleted file mode 100644 index 8d6cd705..00000000 --- a/hosts/sif/mail/default.nix +++ /dev/null | |||
@@ -1,70 +0,0 @@ | |||
1 | { config, lib, pkgs, ... }: | ||
2 | { | ||
3 | services.postfix = { | ||
4 | enable = true; | ||
5 | enableSmtp = true; | ||
6 | enableSubmission = false; | ||
7 | setSendmail = true; | ||
8 | networksStyle = "host"; | ||
9 | hostname = "sif.midgard.yggdrasil"; | ||
10 | destination = []; | ||
11 | relayHost = "uucp:ymir"; | ||
12 | recipientDelimiter = "+"; | ||
13 | masterConfig = { | ||
14 | uucp = { | ||
15 | type = "unix"; | ||
16 | private = true; | ||
17 | privileged = true; | ||
18 | chroot = false; | ||
19 | command = "pipe"; | ||
20 | args = [ "flags=Fqhu" "user=uucp" ''argv=${config.security.wrapperDir}/uux -z -a $sender - $nexthop!rmail ($recipient)'' ]; | ||
21 | }; | ||
22 | smtps = { | ||
23 | type = "unix"; | ||
24 | private = true; | ||
25 | privileged = true; | ||
26 | chroot = false; | ||
27 | command = "smtp"; | ||
28 | args = [ "-o" "smtp_tls_wrappermode=yes" "-o" "smtp_tls_security_level=encrypt" ]; | ||
29 | }; | ||
30 | }; | ||
31 | config = { | ||
32 | default_transport = "uucp:ymir"; | ||
33 | |||
34 | inet_interfaces = "loopback-only"; | ||
35 | |||
36 | authorized_submit_users = ["!uucp" "static:anyone"]; | ||
37 | message_size_limit = "0"; | ||
38 | |||
39 | sender_dependent_default_transport_maps = ''regexp:${pkgs.writeText "sender_relay" '' | ||
40 | /@(cip|stud)\.ifi\.(lmu|uni-muenchen)\.de$/ smtp:smtp.ifi.lmu.de | ||
41 | /@ifi\.(lmu|uni-muenchen)\.de$/ smtp:smtpin1.ifi.lmu.de:587 | ||
42 | /@math(ematik)?\.(lmu|uni-muenchen)\.de$/ smtps:smtp.math.lmu.de:465 | ||
43 | /@(campus\.)?lmu\.de$/ smtp:postout.lrz.de | ||
44 | ''}''; | ||
45 | sender_bcc_maps = ''regexp:${pkgs.writeText "sender_bcc" '' | ||
46 | /^uni2work(-[^@]*)?@ifi\.lmu\.de$/ uni2work@ifi.lmu.de | ||
47 | /@ifi\.lmu\.de$/ gregor.kleen@ifi.lmu.de | ||
48 | ''}''; | ||
49 | |||
50 | smtp_sasl_auth_enable = true; | ||
51 | smtp_sender_dependent_authentication = true; | ||
52 | smtp_sasl_tls_security_options = "noanonymous"; | ||
53 | smtp_sasl_mechanism_filter = ["plain"]; | ||
54 | smtp_sasl_password_maps = "regexp:/var/db/postfix/sasl_passwd"; | ||
55 | smtp_cname_overrides_servername = false; | ||
56 | smtp_always_send_ehlo = true; | ||
57 | smtp_tls_security_level = "dane"; | ||
58 | |||
59 | smtp_tls_loglevel = "1"; | ||
60 | smtp_dns_support_level = "dnssec"; | ||
61 | }; | ||
62 | }; | ||
63 | |||
64 | sops.secrets.postfix-sasl-passwd = { | ||
65 | key = "sasl-passwd"; | ||
66 | path = "/var/db/postfix/sasl_passwd"; | ||
67 | owner = "postfix"; | ||
68 | sopsFile = ./secrets.yaml; | ||
69 | }; | ||
70 | } | ||
diff --git a/hosts/surtr/default.nix b/hosts/surtr/default.nix index 9d3101c0..1c66df2b 100644 --- a/hosts/surtr/default.nix +++ b/hosts/surtr/default.nix | |||
@@ -22,7 +22,6 @@ with lib; | |||
22 | device = "/dev/vda"; | 22 | device = "/dev/vda"; |
23 | }; | 23 | }; |
24 | 24 | ||
25 | |||
26 | tmp.useTmpfs = true; | 25 | tmp.useTmpfs = true; |
27 | 26 | ||
28 | zfs.devNodes = "/dev"; # /dev/vda2 does not show up in /dev/disk/by-id | 27 | zfs.devNodes = "/dev"; # /dev/vda2 does not show up in /dev/disk/by-id |
@@ -31,7 +30,7 @@ with lib; | |||
31 | kernelPatches = [ | 30 | kernelPatches = [ |
32 | { name = "zswap-default"; | 31 | { name = "zswap-default"; |
33 | patch = null; | 32 | patch = null; |
34 | extraStructuredConfig = with lib.kernel; { | 33 | structuredExtraConfig = with lib.kernel; { |
35 | ZSWAP_DEFAULT_ON = yes; | 34 | ZSWAP_DEFAULT_ON = yes; |
36 | ZSWAP_SHRINKER_DEFAULT_ON = yes; | 35 | ZSWAP_SHRINKER_DEFAULT_ON = yes; |
37 | }; | 36 | }; |
diff --git a/hosts/surtr/dns/zones/email.nights.soa b/hosts/surtr/dns/zones/email.nights.soa index 913a88d4..34209a99 100644 --- a/hosts/surtr/dns/zones/email.nights.soa +++ b/hosts/surtr/dns/zones/email.nights.soa | |||
@@ -1,7 +1,7 @@ | |||
1 | $ORIGIN nights.email. | 1 | $ORIGIN nights.email. |
2 | $TTL 3600 | 2 | $TTL 3600 |
3 | @ IN SOA ns.yggdrasil.li. hostmaster.yggdrasil.li ( | 3 | @ IN SOA ns.yggdrasil.li. hostmaster.yggdrasil.li ( |
4 | 2023013000 ; serial | 4 | 2025060700 ; serial |
5 | 10800 ; refresh | 5 | 10800 ; refresh |
6 | 3600 ; retry | 6 | 3600 ; retry |
7 | 604800 ; expire | 7 | 604800 ; expire |
@@ -27,11 +27,7 @@ $TTL 3600 | |||
27 | 27 | ||
28 | _acme-challenge IN NS ns.yggdrasil.li. | 28 | _acme-challenge IN NS ns.yggdrasil.li. |
29 | 29 | ||
30 | ymir._domainkey IN TXT ( | 30 | ymir._domainkey IN CNAME ymir._domainkey.yggdrasil.li. |
31 | "v=DKIM1;k=rsa;p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq3cCKlk+VPhyAanLZTM0BCzUT/+fmxHioZcFk0uJk1akBYj7BRofR7eVNcLKpm3rwYMQgE+9vJH9p8SV6tws9EcWc8SMCqqGZlREYM7PmLDiTSK/vjCzkygfgFCb0EBNsY2A/fpP4rTeoxrbcBSvMkq97iY5rwyw4wXZVZXLiDaCj23s8POoxTk1ClqUJZJQ5x2" | ||
32 | "qzrC0RfN5kLZ9A7Gq2jB09vNxpXHYqABA0bJv88JiZM7hfkp9IafJZ+yCVMaBcJs4DAxnTjNAuFD9gm+qSFVY8+yeXqL6Qjo5PbruhyZRBW8RgRYT8t5n07XRglMGKKGMwOGLanrltcyXqB+GsDZBD36RAAwjFadnxdpDyRv4SgRP7ff2tKRrORYpmpN+mKdqw5j3J/nP6bXV1oAkyh9XQkPEIDi81WT87EZziTElDzVp6A2qFOxqucAovoRk24" | ||
33 | "7vlsns1FApFRsp9mja0UZNObyKD1M6tP9Ep7lS76tFGMk+WDvXRJH5LEsyCpu7sSyl1r/O0M4K+KldRCqLlZd7rf8F5P8T0dn1azk05g7F4p0N/y9GNdzXbPZ9u0eZdI7SEdh8ZoOZp7NVZiBFfbWLSS5ZtyA2kbBa4i7GJ/cuAbEKOmqAkeQPiu96TGIcyjkXjS6mTPI+9UmKZYZC+OM8XdJ02y5KRoonCc19ZS8CAwEAAQ==" | ||
34 | ) | ||
35 | 31 | ||
36 | _xmpp-client._tcp IN SRV 5 0 5222 ymir.yggdrasil.li. | 32 | _xmpp-client._tcp IN SRV 5 0 5222 ymir.yggdrasil.li. |
37 | _xmpp-server._tcp IN SRV 5 0 5269 ymir.yggdrasil.li. | 33 | _xmpp-server._tcp IN SRV 5 0 5269 ymir.yggdrasil.li. |
diff --git a/hosts/surtr/dns/zones/li.141.soa b/hosts/surtr/dns/zones/li.141.soa index ab117f09..78d137bb 100644 --- a/hosts/surtr/dns/zones/li.141.soa +++ b/hosts/surtr/dns/zones/li.141.soa | |||
@@ -1,7 +1,7 @@ | |||
1 | $ORIGIN 141.li. | 1 | $ORIGIN 141.li. |
2 | $TTL 3600 | 2 | $TTL 3600 |
3 | @ IN SOA ns.yggdrasil.li. hostmaster.yggdrasil.li ( | 3 | @ IN SOA ns.yggdrasil.li. hostmaster.yggdrasil.li ( |
4 | 2025020900 ; serial | 4 | 2025060701 ; serial |
5 | 10800 ; refresh | 5 | 10800 ; refresh |
6 | 3600 ; retry | 6 | 3600 ; retry |
7 | 604800 ; expire | 7 | 604800 ; expire |
@@ -45,11 +45,8 @@ ymir IN AAAA 2a03:4000:6:d004:: | |||
45 | ymir IN MX 0 ymir.yggdrasil.li | 45 | ymir IN MX 0 ymir.yggdrasil.li |
46 | ymir IN TXT "v=spf1 redirect=ymir.yggdrasil.li" | 46 | ymir IN TXT "v=spf1 redirect=ymir.yggdrasil.li" |
47 | 47 | ||
48 | ymir._domainkey IN TXT ( | 48 | ymir._domainkey IN CNAME ymir._domainkey.yggdrasil.li. |
49 | "v=DKIM1;k=rsa;p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq3cCKlk+VPhyAanLZTM0BCzUT/+fmxHioZcFk0uJk1akBYj7BRofR7eVNcLKpm3rwYMQgE+9vJH9p8SV6tws9EcWc8SMCqqGZlREYM7PmLDiTSK/vjCzkygfgFCb0EBNsY2A/fpP4rTeoxrbcBSvMkq97iY5rwyw4wXZVZXLiDaCj23s8POoxTk1ClqUJZJQ5x2" | 49 | surtr._domainkey IN CNAME surtr._domainkey.yggdrasil.li. |
50 | "qzrC0RfN5kLZ9A7Gq2jB09vNxpXHYqABA0bJv88JiZM7hfkp9IafJZ+yCVMaBcJs4DAxnTjNAuFD9gm+qSFVY8+yeXqL6Qjo5PbruhyZRBW8RgRYT8t5n07XRglMGKKGMwOGLanrltcyXqB+GsDZBD36RAAwjFadnxdpDyRv4SgRP7ff2tKRrORYpmpN+mKdqw5j3J/nP6bXV1oAkyh9XQkPEIDi81WT87EZziTElDzVp6A2qFOxqucAovoRk24" | ||
51 | "7vlsns1FApFRsp9mja0UZNObyKD1M6tP9Ep7lS76tFGMk+WDvXRJH5LEsyCpu7sSyl1r/O0M4K+KldRCqLlZd7rf8F5P8T0dn1azk05g7F4p0N/y9GNdzXbPZ9u0eZdI7SEdh8ZoOZp7NVZiBFfbWLSS5ZtyA2kbBa4i7GJ/cuAbEKOmqAkeQPiu96TGIcyjkXjS6mTPI+9UmKZYZC+OM8XdJ02y5KRoonCc19ZS8CAwEAAQ==" | ||
52 | ) | ||
53 | 50 | ||
54 | _xmpp-client._tcp IN SRV 5 0 5222 ymir.yggdrasil.li. | 51 | _xmpp-client._tcp IN SRV 5 0 5222 ymir.yggdrasil.li. |
55 | _xmpp-server._tcp IN SRV 5 0 5269 ymir.yggdrasil.li. | 52 | _xmpp-server._tcp IN SRV 5 0 5269 ymir.yggdrasil.li. |
diff --git a/hosts/surtr/dns/zones/li.kleen.soa b/hosts/surtr/dns/zones/li.kleen.soa index a1c7d35a..5dd3e697 100644 --- a/hosts/surtr/dns/zones/li.kleen.soa +++ b/hosts/surtr/dns/zones/li.kleen.soa | |||
@@ -1,7 +1,7 @@ | |||
1 | $ORIGIN kleen.li. | 1 | $ORIGIN kleen.li. |
2 | $TTL 3600 | 2 | $TTL 3600 |
3 | @ IN SOA ns.yggdrasil.li. hostmaster.yggdrasil.li ( | 3 | @ IN SOA ns.yggdrasil.li. hostmaster.yggdrasil.li ( |
4 | 2023013000 ; serial | 4 | 2025060701 ; serial |
5 | 10800 ; refresh | 5 | 10800 ; refresh |
6 | 3600 ; retry | 6 | 3600 ; retry |
7 | 604800 ; expire | 7 | 604800 ; expire |
@@ -27,11 +27,8 @@ $TTL 3600 | |||
27 | 27 | ||
28 | _acme-challenge IN NS ns.yggdrasil.li. | 28 | _acme-challenge IN NS ns.yggdrasil.li. |
29 | 29 | ||
30 | ymir._domainkey IN TXT ( | 30 | ymir._domainkey IN CNAME ymir._domainkey.yggdrasil.li. |
31 | "v=DKIM1;k=rsa;p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq3cCKlk+VPhyAanLZTM0BCzUT/+fmxHioZcFk0uJk1akBYj7BRofR7eVNcLKpm3rwYMQgE+9vJH9p8SV6tws9EcWc8SMCqqGZlREYM7PmLDiTSK/vjCzkygfgFCb0EBNsY2A/fpP4rTeoxrbcBSvMkq97iY5rwyw4wXZVZXLiDaCj23s8POoxTk1ClqUJZJQ5x2" | 31 | surtr._domainkey IN CNAME surtr._domainkey.yggdrasil.li. |
32 | "qzrC0RfN5kLZ9A7Gq2jB09vNxpXHYqABA0bJv88JiZM7hfkp9IafJZ+yCVMaBcJs4DAxnTjNAuFD9gm+qSFVY8+yeXqL6Qjo5PbruhyZRBW8RgRYT8t5n07XRglMGKKGMwOGLanrltcyXqB+GsDZBD36RAAwjFadnxdpDyRv4SgRP7ff2tKRrORYpmpN+mKdqw5j3J/nP6bXV1oAkyh9XQkPEIDi81WT87EZziTElDzVp6A2qFOxqucAovoRk24" | ||
33 | "7vlsns1FApFRsp9mja0UZNObyKD1M6tP9Ep7lS76tFGMk+WDvXRJH5LEsyCpu7sSyl1r/O0M4K+KldRCqLlZd7rf8F5P8T0dn1azk05g7F4p0N/y9GNdzXbPZ9u0eZdI7SEdh8ZoOZp7NVZiBFfbWLSS5ZtyA2kbBa4i7GJ/cuAbEKOmqAkeQPiu96TGIcyjkXjS6mTPI+9UmKZYZC+OM8XdJ02y5KRoonCc19ZS8CAwEAAQ==" | ||
34 | ) | ||
35 | 32 | ||
36 | _xmpp-client._tcp IN SRV 5 0 5222 ymir.yggdrasil.li. | 33 | _xmpp-client._tcp IN SRV 5 0 5222 ymir.yggdrasil.li. |
37 | _xmpp-server._tcp IN SRV 5 0 5269 ymir.yggdrasil.li. | 34 | _xmpp-server._tcp IN SRV 5 0 5269 ymir.yggdrasil.li. |
diff --git a/hosts/surtr/dns/zones/li.synapse.soa b/hosts/surtr/dns/zones/li.synapse.soa index 086d4a85..247cf025 100644 --- a/hosts/surtr/dns/zones/li.synapse.soa +++ b/hosts/surtr/dns/zones/li.synapse.soa | |||
@@ -1,7 +1,7 @@ | |||
1 | $ORIGIN synapse.li. | 1 | $ORIGIN synapse.li. |
2 | $TTL 3600 | 2 | $TTL 3600 |
3 | @ IN SOA ns.yggdrasil.li. hostmaster.yggdrasil.li ( | 3 | @ IN SOA ns.yggdrasil.li. hostmaster.yggdrasil.li ( |
4 | 2023092100 ; serial | 4 | 2025060701 ; serial |
5 | 10800 ; refresh | 5 | 10800 ; refresh |
6 | 3600 ; retry | 6 | 3600 ; retry |
7 | 604800 ; expire | 7 | 604800 ; expire |
diff --git a/hosts/surtr/dns/zones/li.yggdrasil.soa b/hosts/surtr/dns/zones/li.yggdrasil.soa index ebb298b4..500194ae 100644 --- a/hosts/surtr/dns/zones/li.yggdrasil.soa +++ b/hosts/surtr/dns/zones/li.yggdrasil.soa | |||
@@ -1,7 +1,7 @@ | |||
1 | $ORIGIN yggdrasil.li. | 1 | $ORIGIN yggdrasil.li. |
2 | $TTL 3600 | 2 | $TTL 3600 |
3 | @ IN SOA ns.yggdrasil.li. hostmaster.yggdrasil.li ( | 3 | @ IN SOA ns.yggdrasil.li. hostmaster.yggdrasil.li ( |
4 | 2025052400 ; serial | 4 | 2025060700 ; serial |
5 | 10800 ; refresh | 5 | 10800 ; refresh |
6 | 3600 ; retry | 6 | 3600 ; retry |
7 | 604800 ; expire | 7 | 604800 ; expire |
@@ -115,6 +115,8 @@ vidhar IN TXT "v=spf1 redirect=yggdrasil.li" | |||
115 | 115 | ||
116 | mailout IN A 188.68.51.254 | 116 | mailout IN A 188.68.51.254 |
117 | mailout IN AAAA 2a03:4000:6:d004:: | 117 | mailout IN AAAA 2a03:4000:6:d004:: |
118 | mailout IN A 202.61.241.61 | ||
119 | mailout IN AAAA 2a03:4000:52:ada:: | ||
118 | mailout IN MX 0 ymir.yggdrasil.li | 120 | mailout IN MX 0 ymir.yggdrasil.li |
119 | mailout IN TXT "v=spf1 redirect=yggdrasil.li" | 121 | mailout IN TXT "v=spf1 redirect=yggdrasil.li" |
120 | 122 | ||
diff --git a/hosts/surtr/dns/zones/org.praseodym.soa b/hosts/surtr/dns/zones/org.praseodym.soa index df505b4c..2b97ca19 100644 --- a/hosts/surtr/dns/zones/org.praseodym.soa +++ b/hosts/surtr/dns/zones/org.praseodym.soa | |||
@@ -1,7 +1,7 @@ | |||
1 | $ORIGIN praseodym.org. | 1 | $ORIGIN praseodym.org. |
2 | $TTL 3600 | 2 | $TTL 3600 |
3 | @ IN SOA ns.yggdrasil.li. hostmaster.yggdrasil.li ( | 3 | @ IN SOA ns.yggdrasil.li. hostmaster.yggdrasil.li ( |
4 | 2023013000 ; serial | 4 | 2025060701 ; serial |
5 | 10800 ; refresh | 5 | 10800 ; refresh |
6 | 3600 ; retry | 6 | 3600 ; retry |
7 | 604800 ; expire | 7 | 604800 ; expire |
@@ -32,11 +32,8 @@ surtr IN AAAA 2a03:4000:52:ada:: | |||
32 | surtr IN MX 0 ymir.yggdrasil.li | 32 | surtr IN MX 0 ymir.yggdrasil.li |
33 | surtr IN TXT "v=spf1 redirect=yggdrasil.li" | 33 | surtr IN TXT "v=spf1 redirect=yggdrasil.li" |
34 | 34 | ||
35 | ymir._domainkey IN TXT ( | 35 | ymir._domainkey IN CNAME ymir._domainkey.yggdrasil.li. |
36 | "v=DKIM1;k=rsa;p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq3cCKlk+VPhyAanLZTM0BCzUT/+fmxHioZcFk0uJk1akBYj7BRofR7eVNcLKpm3rwYMQgE+9vJH9p8SV6tws9EcWc8SMCqqGZlREYM7PmLDiTSK/vjCzkygfgFCb0EBNsY2A/fpP4rTeoxrbcBSvMkq97iY5rwyw4wXZVZXLiDaCj23s8POoxTk1ClqUJZJQ5x2" | 36 | surtr._domainkey IN CNAME surtr._domainkey.yggdrasil.li. |
37 | "qzrC0RfN5kLZ9A7Gq2jB09vNxpXHYqABA0bJv88JiZM7hfkp9IafJZ+yCVMaBcJs4DAxnTjNAuFD9gm+qSFVY8+yeXqL6Qjo5PbruhyZRBW8RgRYT8t5n07XRglMGKKGMwOGLanrltcyXqB+GsDZBD36RAAwjFadnxdpDyRv4SgRP7ff2tKRrORYpmpN+mKdqw5j3J/nP6bXV1oAkyh9XQkPEIDi81WT87EZziTElDzVp6A2qFOxqucAovoRk24" | ||
38 | "7vlsns1FApFRsp9mja0UZNObyKD1M6tP9Ep7lS76tFGMk+WDvXRJH5LEsyCpu7sSyl1r/O0M4K+KldRCqLlZd7rf8F5P8T0dn1azk05g7F4p0N/y9GNdzXbPZ9u0eZdI7SEdh8ZoOZp7NVZiBFfbWLSS5ZtyA2kbBa4i7GJ/cuAbEKOmqAkeQPiu96TGIcyjkXjS6mTPI+9UmKZYZC+OM8XdJ02y5KRoonCc19ZS8CAwEAAQ==" | ||
39 | ) | ||
40 | 37 | ||
41 | _xmpp-client._tcp IN SRV 5 0 5222 ymir.yggdrasil.li. | 38 | _xmpp-client._tcp IN SRV 5 0 5222 ymir.yggdrasil.li. |
42 | _xmpp-server._tcp IN SRV 5 0 5269 ymir.yggdrasil.li. | 39 | _xmpp-server._tcp IN SRV 5 0 5269 ymir.yggdrasil.li. |
diff --git a/hosts/surtr/email/ccert-policy-server/ccert_policy_server/__main__.py b/hosts/surtr/email/ccert-policy-server/ccert_policy_server/__main__.py index 7117eb63..7c931559 100644 --- a/hosts/surtr/email/ccert-policy-server/ccert_policy_server/__main__.py +++ b/hosts/surtr/email/ccert-policy-server/ccert_policy_server/__main__.py | |||
@@ -28,10 +28,12 @@ class PolicyHandler(StreamRequestHandler): | |||
28 | 28 | ||
29 | allowed = False | 29 | allowed = False |
30 | user = None | 30 | user = None |
31 | relay_eligible = False | ||
31 | if self.args['sasl_username']: | 32 | if self.args['sasl_username']: |
32 | user = self.args['sasl_username'] | 33 | user = self.args['sasl_username'] |
33 | if self.args['ccert_subject']: | 34 | if self.args['ccert_subject']: |
34 | user = self.args['ccert_subject'] | 35 | user = self.args['ccert_subject'] |
36 | relay_eligible = True | ||
35 | 37 | ||
36 | if user: | 38 | if user: |
37 | with self.server.db_pool.connection() as conn: | 39 | with self.server.db_pool.connection() as conn: |
@@ -44,9 +46,16 @@ class PolicyHandler(StreamRequestHandler): | |||
44 | 46 | ||
45 | with conn.cursor() as cur: | 47 | with conn.cursor() as cur: |
46 | cur.row_factory = namedtuple_row | 48 | cur.row_factory = namedtuple_row |
47 | cur.execute('SELECT EXISTS(SELECT true FROM "mailbox" INNER JOIN "mailbox_mapping" ON "mailbox".id = "mailbox_mapping"."mailbox" WHERE "mailbox"."mailbox" = %(user)s AND ("local" = %(local)s OR "local" IS NULL) AND ("extension" = %(extension)s OR "extension" IS NULL) AND "domain" = %(domain)s) as "exists"', params = {'user': user, 'local': local, 'extension': extension if extension is not None else '', 'domain': domain}, prepare=True) | 49 | |
48 | if (row := cur.fetchone()) is not None: | 50 | if relay_eligible: |
49 | allowed = row.exists | 51 | cur.execute('SELECT EXISTS(SELECT true FROM "mailbox" INNER JOIN "relay_access" ON "mailbox".id = "relay_access"."mailbox" WHERE "mailbox"."mailbox" = %(user)s AND ("domain" = %(domain)s OR %(domain)s ilike CONCAT(\'%%_.\', "domain"))) as "exists"', params = {'user': user, 'domain': domain}) |
52 | if (row := cur.fetchone()) is not None: | ||
53 | allowed = row.exists | ||
54 | |||
55 | if not allowed: | ||
56 | cur.execute('SELECT EXISTS(SELECT true FROM "mailbox" INNER JOIN "mailbox_mapping" ON "mailbox".id = "mailbox_mapping"."mailbox" WHERE "mailbox"."mailbox" = %(user)s AND ("local" = %(local)s OR "local" IS NULL) AND ("extension" = %(extension)s OR "extension" IS NULL) AND "domain" = %(domain)s) as "exists"', params = {'user': user, 'local': local, 'extension': extension if extension is not None else '', 'domain': domain}, prepare=True) | ||
57 | if (row := cur.fetchone()) is not None: | ||
58 | allowed = row.exists | ||
50 | 59 | ||
51 | action = '550 5.7.0 Sender address not authorized for current user' | 60 | action = '550 5.7.0 Sender address not authorized for current user' |
52 | if allowed: | 61 | if allowed: |
diff --git a/hosts/surtr/email/default.nix b/hosts/surtr/email/default.nix index c6253e4c..a3e06ca6 100644 --- a/hosts/surtr/email/default.nix +++ b/hosts/surtr/email/default.nix | |||
@@ -124,19 +124,20 @@ in { | |||
124 | services.postfix = { | 124 | services.postfix = { |
125 | enable = true; | 125 | enable = true; |
126 | enableSmtp = false; | 126 | enableSmtp = false; |
127 | hostname = "surtr.yggdrasil.li"; | ||
128 | recipientDelimiter = ""; | ||
129 | setSendmail = true; | 127 | setSendmail = true; |
130 | postmasterAlias = ""; rootAlias = ""; extraAliases = ""; | 128 | postmasterAlias = ""; rootAlias = ""; extraAliases = ""; |
131 | destination = []; | 129 | settings.main = { |
132 | sslCert = "/run/credentials/postfix.service/surtr.yggdrasil.li.pem"; | 130 | recpipient_delimiter = ""; |
133 | sslKey = "/run/credentials/postfix.service/surtr.yggdrasil.li.key.pem"; | 131 | mydestination = []; |
134 | networks = []; | 132 | mynetworks = []; |
135 | config = let | 133 | myhostname = "surtr.yggdrasil.li"; |
136 | relay_ccert = "texthash:${pkgs.writeText "relay_ccert" ""}"; | 134 | |
137 | in { | ||
138 | smtpd_tls_security_level = "may"; | 135 | smtpd_tls_security_level = "may"; |
139 | 136 | ||
137 | smtpd_tls_chain_files = [ | ||
138 | "/run/credentials/postfix.service/surtr.yggdrasil.li.full.pem" | ||
139 | ]; | ||
140 | |||
140 | #the dh params | 141 | #the dh params |
141 | smtpd_tls_dh1024_param_file = toString config.security.dhparams.params."postfix-1024".path; | 142 | smtpd_tls_dh1024_param_file = toString config.security.dhparams.params."postfix-1024".path; |
142 | smtpd_tls_dh512_param_file = toString config.security.dhparams.params."postfix-512".path; | 143 | smtpd_tls_dh512_param_file = toString config.security.dhparams.params."postfix-512".path; |
@@ -171,21 +172,14 @@ in { | |||
171 | 172 | ||
172 | smtp_tls_connection_reuse = true; | 173 | smtp_tls_connection_reuse = true; |
173 | 174 | ||
174 | tls_server_sni_maps = ''texthash:${pkgs.writeText "sni" ( | 175 | tls_server_sni_maps = "inline:{${concatMapStringsSep ", " (domain: "{ ${domain} = /run/credentials/postfix.service/${removePrefix "." domain}.full.pem }") (concatMap (domain: [domain "mailin.${domain}" "mailsub.${domain}" ".${domain}"]) emailDomains)}}"; |
175 | concatMapStringsSep "\n\n" (domain: | ||
176 | concatMapStringsSep "\n" (subdomain: "${subdomain} /run/credentials/postfix.service/${removePrefix "." subdomain}.full.pem") | ||
177 | [domain "mailin.${domain}" "mailsub.${domain}" ".${domain}"] | ||
178 | ) emailDomains | ||
179 | )}''; | ||
180 | 176 | ||
181 | smtp_tls_policy_maps = "socketmap:unix:${config.services.postfix-mta-sts-resolver.settings.path}:postfix"; | 177 | smtp_tls_policy_maps = "socketmap:unix:${config.services.postfix-mta-sts-resolver.settings.path}:postfix"; |
182 | 178 | ||
183 | local_recipient_maps = ""; | 179 | local_recipient_maps = ""; |
184 | 180 | ||
185 | # 10 GiB | 181 | message_size_limit = 10 * 1024 * 1024 * 1024; |
186 | message_size_limit = "10737418240"; | 182 | mailbox_size_limit = 10 * 1024 * 1024 * 1024; |
187 | # 10 GiB | ||
188 | mailbox_size_limit = "10737418240"; | ||
189 | 183 | ||
190 | smtpd_delay_reject = true; | 184 | smtpd_delay_reject = true; |
191 | smtpd_helo_required = true; | 185 | smtpd_helo_required = true; |
@@ -200,7 +194,6 @@ in { | |||
200 | dbname = email | 194 | dbname = email |
201 | query = SELECT action FROM virtual_mailbox_access WHERE lookup = '%s' | 195 | query = SELECT action FROM virtual_mailbox_access WHERE lookup = '%s' |
202 | ''}" | 196 | ''}" |
203 | "check_ccert_access ${relay_ccert}" | ||
204 | "reject_non_fqdn_helo_hostname" | 197 | "reject_non_fqdn_helo_hostname" |
205 | "reject_invalid_helo_hostname" | 198 | "reject_invalid_helo_hostname" |
206 | "reject_unauth_destination" | 199 | "reject_unauth_destination" |
@@ -221,7 +214,6 @@ in { | |||
221 | address_verify_sender_ttl = "30045s"; | 214 | address_verify_sender_ttl = "30045s"; |
222 | 215 | ||
223 | smtpd_relay_restrictions = [ | 216 | smtpd_relay_restrictions = [ |
224 | "check_ccert_access ${relay_ccert}" | ||
225 | "reject_unauth_destination" | 217 | "reject_unauth_destination" |
226 | ]; | 218 | ]; |
227 | 219 | ||
@@ -268,13 +260,26 @@ in { | |||
268 | virtual_transport = "dvlmtp:unix:/run/dovecot-lmtp"; | 260 | virtual_transport = "dvlmtp:unix:/run/dovecot-lmtp"; |
269 | smtputf8_enable = false; | 261 | smtputf8_enable = false; |
270 | 262 | ||
271 | authorized_submit_users = "inline:{ root= postfwd= dovecot2= }"; | 263 | authorized_submit_users = "inline:{ root= postfwd= ${config.services.dovecot2.user}= }"; |
264 | authorized_flush_users = "inline:{ root= }"; | ||
265 | authorized_mailq_users = "inline:{ root= }"; | ||
272 | 266 | ||
273 | postscreen_access_list = ""; | 267 | postscreen_access_list = ""; |
274 | postscreen_denylist_action = "drop"; | 268 | postscreen_denylist_action = "drop"; |
275 | postscreen_greet_action = "enforce"; | 269 | postscreen_greet_action = "enforce"; |
270 | |||
271 | sender_bcc_maps = ''pgsql:${pkgs.writeText "sender_bcc_maps.cf" '' | ||
272 | hosts = postgresql:///email | ||
273 | dbname = email | ||
274 | query = SELECT value FROM sender_bcc_maps WHERE key = '%s' | ||
275 | ''}''; | ||
276 | recipient_bcc_maps = ''pgsql:${pkgs.writeText "recipient_bcc_maps.cf" '' | ||
277 | hosts = postgresql:///email | ||
278 | dbname = email | ||
279 | query = SELECT value FROM recipient_bcc_maps WHERE key = '%s' | ||
280 | ''}''; | ||
276 | }; | 281 | }; |
277 | masterConfig = { | 282 | settings.master = { |
278 | "465" = { | 283 | "465" = { |
279 | type = "inet"; | 284 | type = "inet"; |
280 | private = false; | 285 | private = false; |
@@ -342,7 +347,10 @@ in { | |||
342 | maxproc = 0; | 347 | maxproc = 0; |
343 | args = [ | 348 | args = [ |
344 | "-o" "header_checks=pcre:${pkgs.writeText "header_checks_submission" '' | 349 | "-o" "header_checks=pcre:${pkgs.writeText "header_checks_submission" '' |
350 | if /^Received: / | ||
351 | !/by surtr\.yggdrasil\.li/ STRIP | ||
345 | /^Received: from [^ ]+ \([^ ]+ [^ ]+\)\s+(.*)$/ REPLACE Received: $1 | 352 | /^Received: from [^ ]+ \([^ ]+ [^ ]+\)\s+(.*)$/ REPLACE Received: $1 |
353 | endif | ||
346 | ''}" | 354 | ''}" |
347 | ]; | 355 | ]; |
348 | }; | 356 | }; |
@@ -390,7 +398,7 @@ in { | |||
390 | enable = true; | 398 | enable = true; |
391 | user = "postfix"; group = "postfix"; | 399 | user = "postfix"; group = "postfix"; |
392 | socket = "local:/run/opendkim/opendkim.sock"; | 400 | socket = "local:/run/opendkim/opendkim.sock"; |
393 | domains = ''csl:${concatStringsSep "," (["surtr.yggdrasil.li"] ++ emailDomains)}''; | 401 | domains = ''csl:${concatStringsSep "," (["surtr.yggdrasil.li" "yggdrasil.li" "141.li" "kleen.li" "synapse.li" "praseodym.org"] ++ emailDomains)}''; |
394 | selector = "surtr"; | 402 | selector = "surtr"; |
395 | configFile = builtins.toFile "opendkim.conf" '' | 403 | configFile = builtins.toFile "opendkim.conf" '' |
396 | Syslog true | 404 | Syslog true |
@@ -494,7 +502,7 @@ in { | |||
494 | }; | 502 | }; |
495 | }; | 503 | }; |
496 | 504 | ||
497 | users.groups.${config.services.rspamd.group}.members = [ config.services.postfix.user "dovecot2" ]; | 505 | users.groups.${config.services.rspamd.group}.members = [ config.services.postfix.user config.services.dovecot2.user ]; |
498 | 506 | ||
499 | services.redis.servers.rspamd.enable = true; | 507 | services.redis.servers.rspamd.enable = true; |
500 | 508 | ||
@@ -504,22 +512,22 @@ in { | |||
504 | services.dovecot2 = { | 512 | services.dovecot2 = { |
505 | enable = true; | 513 | enable = true; |
506 | enablePAM = false; | 514 | enablePAM = false; |
507 | sslServerCert = "/run/credentials/dovecot2.service/surtr.yggdrasil.li.pem"; | 515 | sslServerCert = "/run/credentials/dovecot.service/surtr.yggdrasil.li.pem"; |
508 | sslServerKey = "/run/credentials/dovecot2.service/surtr.yggdrasil.li.key.pem"; | 516 | sslServerKey = "/run/credentials/dovecot.service/surtr.yggdrasil.li.key.pem"; |
509 | sslCACert = toString ./ca/ca.crt; | 517 | sslCACert = toString ./ca/ca.crt; |
510 | mailLocation = "maildir:/var/lib/mail/%u/maildir:UTF-8:INDEX=/var/lib/dovecot/indices/%u"; | 518 | mailLocation = "maildir:/var/lib/mail/%u/maildir:UTF-8:INDEX=/var/lib/dovecot/indices/%u"; |
511 | mailPlugins.globally.enable = [ "fts" "fts_xapian" ]; | 519 | mailPlugins.globally.enable = [ "fts" "fts_xapian" ]; |
512 | protocols = [ "lmtp" "sieve" ]; | 520 | protocols = [ "lmtp" "sieve" ]; |
513 | sieve = { | 521 | sieve = { |
514 | extensions = ["copy" "imapsieve" "variables" "imap4flags" "vacation"]; | 522 | extensions = ["copy" "imapsieve" "variables" "imap4flags" "vacation" "vacation-seconds" "vnd.dovecot.debug"]; |
515 | globalExtensions = ["copy" "imapsieve" "variables" "imap4flags" "vacation"]; | 523 | globalExtensions = ["copy" "imapsieve" "variables" "imap4flags" "vacation" "vacation-seconds" "vnd.dovecot.debug"]; |
516 | }; | 524 | }; |
517 | extraConfig = let | 525 | extraConfig = let |
518 | dovecotSqlConf = pkgs.writeText "dovecot-sql.conf" '' | 526 | dovecotSqlConf = pkgs.writeText "dovecot-sql.conf" '' |
519 | driver = pgsql | 527 | driver = pgsql |
520 | connect = dbname=email | 528 | connect = dbname=email |
521 | password_query = SELECT (CASE WHEN '%k' = 'valid' AND '%m' = 'EXTERNAL' THEN NULL ELSE "password" END) as password, (CASE WHEN '%k' = 'valid' AND '%m' = 'EXTERNAL' THEN true WHEN password IS NULL THEN true ELSE NULL END) as nopassword, "user", quota_rule, 'dovecot2' as uid, 'dovecot2' as gid FROM imap_user WHERE "user" = '%n' | 529 | password_query = SELECT (CASE WHEN '%k' = 'valid' AND '%m' = 'EXTERNAL' THEN NULL ELSE "password" END) as password, (CASE WHEN '%k' = 'valid' AND '%m' = 'EXTERNAL' THEN true WHEN password IS NULL THEN true ELSE NULL END) as nopassword, "user", quota_rule, '${config.services.dovecot2.user}' as uid, '${config.services.dovecot2.group}' as gid FROM imap_user WHERE "user" = '%n' |
522 | user_query = SELECT "user", quota_rule, 'dovecot2' as uid, 'dovecot2' as gid FROM imap_user WHERE "user" = '%n' | 530 | user_query = SELECT "user", quota_rule, '${config.services.dovecot2.user}' as uid, 'dovecot2' as gid FROM imap_user WHERE "user" = '%n' |
523 | iterate_query = SELECT "user" FROM imap_user | 531 | iterate_query = SELECT "user" FROM imap_user |
524 | ''; | 532 | ''; |
525 | in '' | 533 | in '' |
@@ -527,16 +535,16 @@ in { | |||
527 | 535 | ||
528 | mail_plugins = $mail_plugins quota | 536 | mail_plugins = $mail_plugins quota |
529 | 537 | ||
530 | first_valid_uid = ${toString config.users.users.dovecot2.uid} | 538 | first_valid_uid = ${toString config.users.users.${config.services.dovecot2.user}.uid} |
531 | last_valid_uid = ${toString config.users.users.dovecot2.uid} | 539 | last_valid_uid = ${toString config.users.users.${config.services.dovecot2.user}.uid} |
532 | first_valid_gid = ${toString config.users.groups.dovecot2.gid} | 540 | first_valid_gid = ${toString config.users.groups.${config.services.dovecot2.group}.gid} |
533 | last_valid_gid = ${toString config.users.groups.dovecot2.gid} | 541 | last_valid_gid = ${toString config.users.groups.${config.services.dovecot2.group}.gid} |
534 | 542 | ||
535 | ${concatMapStringsSep "\n\n" (domain: | 543 | ${concatMapStringsSep "\n\n" (domain: |
536 | concatMapStringsSep "\n" (subdomain: '' | 544 | concatMapStringsSep "\n" (subdomain: '' |
537 | local_name ${subdomain} { | 545 | local_name ${subdomain} { |
538 | ssl_cert = </run/credentials/dovecot2.service/${subdomain}.pem | 546 | ssl_cert = </run/credentials/dovecot.service/${subdomain}.pem |
539 | ssl_key = </run/credentials/dovecot2.service/${subdomain}.key.pem | 547 | ssl_key = </run/credentials/dovecot.service/${subdomain}.key.pem |
540 | } | 548 | } |
541 | '') ["imap.${domain}" domain] | 549 | '') ["imap.${domain}" domain] |
542 | ) emailDomains} | 550 | ) emailDomains} |
@@ -557,10 +565,10 @@ in { | |||
557 | auth_debug = yes | 565 | auth_debug = yes |
558 | 566 | ||
559 | service auth { | 567 | service auth { |
560 | user = dovecot2 | 568 | user = ${config.services.dovecot2.user} |
561 | } | 569 | } |
562 | service auth-worker { | 570 | service auth-worker { |
563 | user = dovecot2 | 571 | user = ${config.services.dovecot2.user} |
564 | } | 572 | } |
565 | 573 | ||
566 | userdb { | 574 | userdb { |
@@ -581,7 +589,7 @@ in { | |||
581 | args = ${pkgs.writeText "dovecot-sql.conf" '' | 589 | args = ${pkgs.writeText "dovecot-sql.conf" '' |
582 | driver = pgsql | 590 | driver = pgsql |
583 | connect = dbname=email | 591 | connect = dbname=email |
584 | user_query = SELECT DISTINCT ON (extension IS NULL, local IS NULL) "user", quota_rule, 'dovecot2' as uid, 'dovecot2' as gid FROM lmtp_mapping WHERE CASE WHEN extension IS NOT NULL AND local IS NOT NULL THEN ('%n' :: citext) = local || '+' || extension AND domain = ('%d' :: citext) WHEN local IS NOT NULL THEN (local = ('%n' :: citext) OR ('%n' :: citext) ILIKE local || '+%%') AND domain = ('%d' :: citext) WHEN extension IS NOT NULL THEN ('%n' :: citext) ILIKE '%%+' || extension AND domain = ('%d' :: citext) ELSE domain = ('%d' :: citext) END ORDER BY (extension IS NULL) ASC, (local IS NULL) ASC | 592 | user_query = SELECT DISTINCT ON (extension IS NULL, local IS NULL) "user", quota_rule, '${config.services.dovecot2.user}' as uid, '${config.services.dovecot2.group}' as gid FROM lmtp_mapping WHERE CASE WHEN extension IS NOT NULL AND local IS NOT NULL THEN ('%n' :: citext) = local || '+' || extension AND domain = ('%d' :: citext) WHEN local IS NOT NULL THEN (local = ('%n' :: citext) OR ('%n' :: citext) ILIKE local || '+%%') AND domain = ('%d' :: citext) WHEN extension IS NOT NULL THEN ('%n' :: citext) ILIKE '%%+' || extension AND domain = ('%d' :: citext) ELSE domain = ('%d' :: citext) END ORDER BY (extension IS NULL) ASC, (local IS NULL) ASC |
585 | ''} | 593 | ''} |
586 | 594 | ||
587 | skip = never | 595 | skip = never |
@@ -651,7 +659,7 @@ in { | |||
651 | quota_status_success = DUNNO | 659 | quota_status_success = DUNNO |
652 | quota_status_nouser = DUNNO | 660 | quota_status_nouser = DUNNO |
653 | quota_grace = 10%% | 661 | quota_grace = 10%% |
654 | quota_max_mail_size = ${config.services.postfix.config.message_size_limit} | 662 | quota_max_mail_size = ${toString config.services.postfix.settings.main.message_size_limit} |
655 | quota_vsizes = yes | 663 | quota_vsizes = yes |
656 | } | 664 | } |
657 | 665 | ||
@@ -704,8 +712,8 @@ in { | |||
704 | 712 | ||
705 | systemd.services.dovecot-fts-xapian-optimize = { | 713 | systemd.services.dovecot-fts-xapian-optimize = { |
706 | description = "Optimize dovecot indices for fts_xapian"; | 714 | description = "Optimize dovecot indices for fts_xapian"; |
707 | requisite = [ "dovecot2.service" ]; | 715 | requisite = [ "dovecot.service" ]; |
708 | after = [ "dovecot2.service" ]; | 716 | after = [ "dovecot.service" ]; |
709 | startAt = "*-*-* 22:00:00 Europe/Berlin"; | 717 | startAt = "*-*-* 22:00:00 Europe/Berlin"; |
710 | serviceConfig = { | 718 | serviceConfig = { |
711 | Type = "oneshot"; | 719 | Type = "oneshot"; |
@@ -770,28 +778,26 @@ in { | |||
770 | 778 | ||
771 | security.acme.rfc2136Domains = { | 779 | security.acme.rfc2136Domains = { |
772 | "surtr.yggdrasil.li" = { | 780 | "surtr.yggdrasil.li" = { |
773 | restartUnits = [ "postfix.service" "dovecot2.service" ]; | 781 | restartUnits = [ "postfix.service" "dovecot.service" ]; |
774 | }; | 782 | }; |
775 | } // listToAttrs (map (domain: nameValuePair "spm.${domain}" { restartUnits = ["nginx.service"]; }) spmDomains) | 783 | } // listToAttrs (map (domain: nameValuePair "spm.${domain}" { restartUnits = ["nginx.service"]; }) spmDomains) |
776 | // listToAttrs (concatMap (domain: [ | 784 | // listToAttrs (concatMap (domain: [ |
777 | (nameValuePair domain { restartUnits = ["postfix.service" "dovecot2.service"]; }) | 785 | (nameValuePair domain { restartUnits = ["postfix.service" "dovecot.service"]; }) |
778 | (nameValuePair "mailin.${domain}" { restartUnits = ["postfix.service"]; }) | 786 | (nameValuePair "mailin.${domain}" { restartUnits = ["postfix.service"]; }) |
779 | (nameValuePair "mailsub.${domain}" { restartUnits = ["postfix.service"]; }) | 787 | (nameValuePair "mailsub.${domain}" { restartUnits = ["postfix.service"]; }) |
780 | (nameValuePair "imap.${domain}" { restartUnits = ["dovecot2.service"]; }) | 788 | (nameValuePair "imap.${domain}" { restartUnits = ["dovecot.service"]; }) |
781 | (nameValuePair "mta-sts.${domain}" { restartUnits = ["nginx.service"]; }) | 789 | (nameValuePair "mta-sts.${domain}" { restartUnits = ["nginx.service"]; }) |
782 | ]) emailDomains); | 790 | ]) emailDomains); |
783 | 791 | ||
784 | systemd.services.postfix = { | 792 | systemd.services.postfix = { |
785 | serviceConfig.LoadCredential = [ | 793 | serviceConfig.LoadCredential = let |
786 | "surtr.yggdrasil.li.key.pem:${config.security.acme.certs."surtr.yggdrasil.li".directory}/key.pem" | 794 | tlsCredential = domain: "${domain}.full.pem:${config.security.acme.certs.${domain}.directory}/full.pem"; |
787 | "surtr.yggdrasil.li.pem:${config.security.acme.certs."surtr.yggdrasil.li".directory}/fullchain.pem" | 795 | in [ |
788 | ] ++ concatMap (domain: | 796 | (tlsCredential "surtr.yggdrasil.li") |
789 | map (subdomain: "${subdomain}.full.pem:${config.security.acme.certs.${subdomain}.directory}/full.pem") | 797 | ] ++ concatMap (domain: map tlsCredential [domain "mailin.${domain}" "mailsub.${domain}"]) emailDomains; |
790 | [domain "mailin.${domain}" "mailsub.${domain}"] | ||
791 | ) emailDomains; | ||
792 | }; | 798 | }; |
793 | 799 | ||
794 | systemd.services.dovecot2 = { | 800 | systemd.services.dovecot = { |
795 | preStart = '' | 801 | preStart = '' |
796 | for f in /etc/dovecot/sieve_flag.d/*.sieve /etc/dovecot/sieve_before.d/*.sieve; do | 802 | for f in /etc/dovecot/sieve_flag.d/*.sieve /etc/dovecot/sieve_before.d/*.sieve; do |
797 | ${getExe' pkgs.dovecot_pigeonhole "sievec"} $f | 803 | ${getExe' pkgs.dovecot_pigeonhole "sievec"} $f |
diff --git a/hosts/surtr/kimai.nix b/hosts/surtr/kimai.nix index a3712bb2..454b3d80 100644 --- a/hosts/surtr/kimai.nix +++ b/hosts/surtr/kimai.nix | |||
@@ -47,6 +47,8 @@ | |||
47 | client_max_body_size 0; | 47 | client_max_body_size 0; |
48 | proxy_request_buffering off; | 48 | proxy_request_buffering off; |
49 | proxy_buffering off; | 49 | proxy_buffering off; |
50 | |||
51 | proxy_read_timeout 300; | ||
50 | ''; | 52 | ''; |
51 | }; | 53 | }; |
52 | }; | 54 | }; |
diff --git a/hosts/surtr/postgresql/default.nix b/hosts/surtr/postgresql/default.nix index 0ae29058..3786ea7c 100644 --- a/hosts/surtr/postgresql/default.nix +++ b/hosts/surtr/postgresql/default.nix | |||
@@ -297,6 +297,47 @@ in { | |||
297 | 297 | ||
298 | COMMIT; | 298 | COMMIT; |
299 | 299 | ||
300 | BEGIN; | ||
301 | SELECT _v.register_patch('014-relay', ARRAY['000-base'], null); | ||
302 | |||
303 | CREATE TABLE relay_access ( | ||
304 | id uuid PRIMARY KEY NOT NULL DEFAULT gen_random_uuid(), | ||
305 | mailbox uuid REFERENCES mailbox(id), | ||
306 | domain citext NOT NULL CONSTRAINT domain_non_empty CHECK (domain <> ''') | ||
307 | ); | ||
308 | |||
309 | COMMIT; | ||
310 | |||
311 | BEGIN; | ||
312 | SELECT _v.register_patch('015-relay-unique', ARRAY['000-base', '014-relay'], null); | ||
313 | |||
314 | CREATE UNIQUE INDEX relay_unique ON relay_access (mailbox, domain); | ||
315 | |||
316 | COMMIT; | ||
317 | |||
318 | BEGIN; | ||
319 | SELECT _v.register_patch('015-sender_bcc', null, null); | ||
320 | |||
321 | CREATE TABLE sender_bcc_maps ( | ||
322 | id uuid PRIMARY KEY NOT NULL DEFAULT gen_random_uuid(), | ||
323 | key text NOT NULL CONSTRAINT key_not_empty CHECK (key <> '''), | ||
324 | value text NOT NULL CONSTRAINT value_not_empty CHECK (value <> '''), | ||
325 | CONSTRAINT key_unique UNIQUE (key) | ||
326 | ); | ||
327 | |||
328 | COMMIT; | ||
329 | |||
330 | BEGIN; | ||
331 | SELECT _v.register_patch('016-recipient_bcc', null, null); | ||
332 | |||
333 | CREATE TABLE recipient_bcc_maps ( | ||
334 | id uuid PRIMARY KEY NOT NULL DEFAULT gen_random_uuid(), | ||
335 | key text NOT NULL CONSTRAINT key_not_empty CHECK (key <> '''), | ||
336 | value text NOT NULL CONSTRAINT value_not_empty CHECK (value <> '''), | ||
337 | CONSTRAINT recipient_bcc_maps_key_unique UNIQUE (key) | ||
338 | ); | ||
339 | |||
340 | COMMIT; | ||
300 | ''} | 341 | ''} |
301 | 342 | ||
302 | psql etebase postgres -eXf ${pkgs.writeText "etebase.sql" '' | 343 | psql etebase postgres -eXf ${pkgs.writeText "etebase.sql" '' |
diff --git a/hosts/surtr/tls/default.nix b/hosts/surtr/tls/default.nix index b1c05888..b25bd2ea 100644 --- a/hosts/surtr/tls/default.nix +++ b/hosts/surtr/tls/default.nix | |||
@@ -41,7 +41,7 @@ in { | |||
41 | 41 | ||
42 | acceptTerms = true; | 42 | acceptTerms = true; |
43 | # DNS challenge is slow | 43 | # DNS challenge is slow |
44 | preliminarySelfsigned = true; | 44 | # preliminarySelfsigned = true; |
45 | defaults = { | 45 | defaults = { |
46 | email = "phikeebaogobaegh@141.li"; | 46 | email = "phikeebaogobaegh@141.li"; |
47 | # We don't like NIST curves and Let's Encrypt doesn't support | 47 | # We don't like NIST curves and Let's Encrypt doesn't support |
diff --git a/hosts/vidhar/audiobookshelf/abs-podcast-autoplaylist-gkleen.toml b/hosts/vidhar/audiobookshelf/abs-podcast-autoplaylist-gkleen.toml index a5319e38..42920069 100644 --- a/hosts/vidhar/audiobookshelf/abs-podcast-autoplaylist-gkleen.toml +++ b/hosts/vidhar/audiobookshelf/abs-podcast-autoplaylist-gkleen.toml | |||
@@ -1,5 +1,5 @@ | |||
1 | { | 1 | { |
2 | "data": "ENC[AES256_GCM,data:60OmHwuLC7RJVNNn8lsCFjIFrtDlmmT3yAm3DYn/K2b8OJB/lzKBhMUCyPpoI2lfMm6y47/DMwXI3ExH3QwfgGRf4i/Tcv7p6FCkjFgDc0RhAM7cXNSnh1gKTff8QYtPoNIzmycFCThNr7iZsPsf2/1npVaVHTnt9nTc+cmDLc+lELlvjSE00JOXch/if7KPwFww9K83XlrFmoRvwybfXR0unJqxK2XLvj+dQuKD4Bhyb88iSgu4dX1yw2uBSZBD16S4Io0DaZ+as5Yw4Kon7WMj3Jd5kz8ZxK+0NCy1CVJHOfJIwgYl0SVPp4DpbAPtJO4R/ciXyDQ/XGpoLtHjxnKXaJlJoSiA7FhuSEk+jB/peLHrYV1obdIRE5Dstly01S5cydKlfQ+A0TSjxFSWBYMEiD89sD09Br3iSJX5FejOoS8d2IQJ5faVzgQl4T5aBKsxCNNwmYrEe8m9HN7o2eer8nTKMln5IxZi3ZWhnjgJfrJ4QTXFndxCb78jo8HroN3+7VhoM136UZkqH1OMrIgAH/XSlW08G8m9MRamKsAWklq9aVflcEsPWTHmYW7rjAapQYf+jyK6BbfHcYmyKM82TFZ5iNB60Pth6EJgb2V8PZiChGvDzQvFYYOO3p9a/J8bVqsnPZBXXYcIBt42ZuRPvyyUTfM+75V1eYE9ZGFML+QlofwNCAg+/Rnl+RRy4z+8xQxd8Dn06geDpHsr4yND72FRUTKLbjxF5xfbzBRcZEXjGkyFdEAF7rB78I8xIqii+n6Yt8uEURmd4geI9KWXRQnwofTz9pklaAnRbER8zy/BJIiIYy8zecUHJn9v/DPnsnksfL6RRmG4tHaRBDbpAag0kVkCrpO/flK6dZOl/wvoVVVqT2O69a9/RpHLSV2f//ZS6L9s6vaYe4pXL0M6QymgA22sNHaws6XggJlTxVOFGRejMGYrKqVWtC+2UNbnel+/J0N1qj4luWfQaf9+1j+fq7vyLSzXYFCiyOLAznpqOhzKu6VWy2IbR0UnCoL5ZbhIba9e2MXM7Czy9Yee4xc=,iv:M0GbtFFl1XUeq+y9H+MiD+9z/ASB9hsd06KhpPzSwEo=,tag:vTLIIf+CeZN6DU25CSP8tw==,type:str]", | 2 | "data": "ENC[AES256_GCM,data:7STcG1J3zLHzlHi2LZgSa+pmKlYU6X1eLvjXcx7gvCuHFkXwa/ldrHdzaBXAMrQ+C+DWM4+cyhdal3ypxXueBuBEvH3P7/KofPP2A519sdZo1vDkXCzYRD3Ow74M+hX5ej6hL1mv21HayrRMPnYfH8HUWk1kd/y69EjpjvDHyCpQuw1WG5M4FDUaTd4Vh51QRCSG/Is29dEkvQowhIvNqnAR4KW9PpfjlbUPHauZ6PQLnlJmI9QCcAGJ8hHtp5T+xctTym82GAlXugTJpHnkqcxnGteu9H7UuiDMQ3aKKGYzZCpWkNHrbD1IRhzPzSjVlN2nIX3Ydp8ENNf61EGOrp5hzmV0MhwRHKfz5rE1FRVuyHcwhwBdJzfhzrL9zXZYzn9Zuf9KWwsF+1+58i9u9hPym63r4c1+RbMjNKzHc1/yhhsRDCrTwvMd/Hc6KfUi3H1wW/r02Va2bOCkYrOkWIQpBdx4ThMgkTaHr94DBMqT8n3Fzhc7+uaUsl6I9gMwTn8QCV3g4U7Mp3+/gnQLOdsCTgKr69x1iPfp7jzzbC29MWhIk+2aig+iWRMVT0n4AWIxooc3cYnfOJNtCdJwKuPUl4xNlZ22NK3XQfxBURSw0pi5KyDO1wgTVRoRJMnXZyin3bZ10OU8QKBqLp22FXpG/+mHrm3Y6yLkqfIP5ry+b86Rb7nWJlxDTwTGSoGi8sJzwNb+H9ioG7LjaSmvr7V+2aSq0+72WopAkIFSBq/yIWX3J/rNZuia6jKMY/8bSLDJz3V/YuzeUJ5feUkOS4KW1J1UkaYd6XxZ9Y8szCS/B7Ocz0YiV8fHmOzZKRn8BTmmXUIoyxO07MmwQ1shYfiVCwXjdjq2f3/CZbXNVOPvhGBYOcutUztftu3H9DRDTKrVae1TnztCVSkBSk1o52uSj0r8t6f4l1r7UG1TviOnVLVh1/6iiJVQey0m8G6ugw22zxfhI0Uea/rB70i+2UuoxrmsOfg+TgnvKBuakEBifp4rx0S5wyz05RYXkBLJTIwi2fVGmulqjZuCQNQnI3cfPI+oGcykob9IQqdo/Dwd118hNPVAwdDHyaiGXGh8eu8N2OCLQxlGZDtkVUveaEasJaZ0WWWaK97FUeoNJfUnB7Y3lNjv5u2rzviZyk4=,iv:jT21FNnHod6btDlBa3UflK3au5VmcsABs5OTMXF6oFA=,tag:Oh8cOL+edT5Wp0I1L5+vwg==,type:str]", |
3 | "sops": { | 3 | "sops": { |
4 | "age": [ | 4 | "age": [ |
5 | { | 5 | { |
@@ -11,8 +11,8 @@ | |||
11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiRWFqSHNlY1IvMkkwaEto\ncHZHa2p1Y25SakFkS2JYMlRFcFhnZGY1dVRFCkxSWmxvcHZMampQKzdKRHI0ZVMx\nUTFtR0pHbzFaQ0xQUFA2ZERDSWpwS0UKLS0tIFBaSGczY3VWdy9TKzRDZWZ2SElY\nbVQ4dDNhQllmVmViWGs5c3V4TmNscjQKeugevQJFAN/8JrzeAm4hm2JsQGb26BCb\n3dKYnN1kJU7oVHr1aVfXwMpELNYt9poX6WTY2h9lsdHuRlqoFXAA5Q==\n-----END AGE ENCRYPTED FILE-----\n" | 11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiRWFqSHNlY1IvMkkwaEto\ncHZHa2p1Y25SakFkS2JYMlRFcFhnZGY1dVRFCkxSWmxvcHZMampQKzdKRHI0ZVMx\nUTFtR0pHbzFaQ0xQUFA2ZERDSWpwS0UKLS0tIFBaSGczY3VWdy9TKzRDZWZ2SElY\nbVQ4dDNhQllmVmViWGs5c3V4TmNscjQKeugevQJFAN/8JrzeAm4hm2JsQGb26BCb\n3dKYnN1kJU7oVHr1aVfXwMpELNYt9poX6WTY2h9lsdHuRlqoFXAA5Q==\n-----END AGE ENCRYPTED FILE-----\n" |
12 | } | 12 | } |
13 | ], | 13 | ], |
14 | "lastmodified": "2025-05-10T10:25:15Z", | 14 | "lastmodified": "2025-08-11T07:08:36Z", |
15 | "mac": "ENC[AES256_GCM,data:dhj7e+vF3uiR6I22PR5tdNdM8EyrWmGGTIqjj8H7IdNIsZBHzjeHlBDFOwN7z/JMO0BVwIi4DmhApg2BSPGsQZGDQZ28UTCC8TDtd1zmfGtSP8R8AFHADYdLK/desMtHg6BZTnLv5tpba34WWdflMNOQpwgWPZsIk/DkLaoXdvk=,iv:qkoAZngTz2sfWdxDs+h8Mb2IrkF8gqnQoR5iRoeKjbY=,tag:zXrkBJmPM4ItJxMnX8IDxQ==,type:str]", | 15 | "mac": "ENC[AES256_GCM,data:ZL/dOz+NC8sr8vPBsux+gFOWxUhQqMSmG1az7udhB0ckmOXtnrPBzMM1gs+5pwXLvfLux0m4xzT87+o87axIECnCq35FSuMjtEBK24OUJXsLG/q/tDv5dfRBy/976dM5W7YkBVX/uc03p8CLKf5w4XYNeRKnSwjLvWGd9runDOU=,iv:9ZIeJ5aDVVPHi3/oHqWkWtEfeivV/nFFyQ1lJWJwMu8=,tag:TfkHaopMa+Z0zk38A6/NTA==,type:str]", |
16 | "unencrypted_suffix": "_unencrypted", | 16 | "unencrypted_suffix": "_unencrypted", |
17 | "version": "3.10.2" | 17 | "version": "3.10.2" |
18 | } | 18 | } |
diff --git a/hosts/vidhar/default.nix b/hosts/vidhar/default.nix index 7da17e6f..547572c6 100644 --- a/hosts/vidhar/default.nix +++ b/hosts/vidhar/default.nix | |||
@@ -136,7 +136,7 @@ with lib; | |||
136 | wantedBy = ["basic.target"]; | 136 | wantedBy = ["basic.target"]; |
137 | serviceConfig = { | 137 | serviceConfig = { |
138 | ExecStart = pkgs.writeShellScript "limit-pstate-start" '' | 138 | ExecStart = pkgs.writeShellScript "limit-pstate-start" '' |
139 | echo 50 > /sys/devices/system/cpu/intel_pstate/max_perf_pct | 139 | echo 40 > /sys/devices/system/cpu/intel_pstate/max_perf_pct |
140 | ''; | 140 | ''; |
141 | RemainAfterExit = true; | 141 | RemainAfterExit = true; |
142 | ExecStop = pkgs.writeShellScript "limit-pstate-stop" '' | 142 | ExecStop = pkgs.writeShellScript "limit-pstate-stop" '' |