2023-09-10 15:22:33 +02:00
|
|
|
{
|
2023-09-11 20:23:04 +02:00
|
|
|
config,
|
|
|
|
lib,
|
|
|
|
fn,
|
|
|
|
mailserver,
|
|
|
|
...
|
|
|
|
}:
|
|
|
|
with lib;
|
|
|
|
{
|
|
|
|
imports = [
|
|
|
|
mailserver.nixosModules.mailserver
|
|
|
|
];
|
|
|
|
}
|
|
|
|
// mkIf (elem "mailserver" config.machine.services) {
|
|
|
|
mailserver = let
|
|
|
|
cfg = config.machine;
|
|
|
|
domain = cfg.domain;
|
|
|
|
fdomain = (findFirst (s: s.service == "mail") cfg cfg.vHosts).domain;
|
|
|
|
mkFqdnAlias = name: ["${name}@${domain}" "${name}@${fdomain}"];
|
|
|
|
mkExDomAlias = name: (map (exDom: "${name}@${exDom}") cfg.extraDomains);
|
|
|
|
mkUser = user: rec {
|
|
|
|
name = "${user.name}@${domain}";
|
|
|
|
value = {
|
|
|
|
hashedPasswordFile = config.sops.secrets."users/${user.name}/mail".path;
|
|
|
|
aliases =
|
|
|
|
["${user.name}@${fdomain}"]
|
|
|
|
++ (flatten (map mkFqdnAlias user.aliases))
|
|
|
|
++ (flatten (map mkExDomAlias ([user.name] ++ user.aliases)));
|
|
|
|
};
|
2019-08-27 16:01:04 +02:00
|
|
|
};
|
2023-09-11 20:23:04 +02:00
|
|
|
in rec {
|
|
|
|
enable = true;
|
|
|
|
fqdn = fdomain;
|
|
|
|
domains = [fdomain domain] ++ cfg.extraDomains;
|
|
|
|
loginAccounts = listToAttrs (map mkUser cfg.mailAccounts);
|
2019-08-27 16:01:04 +02:00
|
|
|
|
2023-09-11 20:23:04 +02:00
|
|
|
# Use Let's Encrypt certificates. Note that this needs to set up a stripped
|
|
|
|
# down nginx and opens port 80.
|
|
|
|
certificateScheme = "manual";
|
|
|
|
certificateFile = "/var/lib/acme/" + fdomain + "/fullchain.pem";
|
|
|
|
keyFile = "/var/lib/acme/" + fdomain + "/key.pem";
|
2019-02-26 13:44:40 +01:00
|
|
|
|
2023-09-11 20:23:04 +02:00
|
|
|
#dhParamBitLength = 4096; # this doesn't exist???
|
2019-02-26 13:44:40 +01:00
|
|
|
|
2023-09-11 20:23:04 +02:00
|
|
|
# Enable IMAP and POP3
|
|
|
|
enableImap = true;
|
|
|
|
enablePop3 = false;
|
|
|
|
enableImapSsl = true;
|
|
|
|
enablePop3Ssl = false;
|
2019-02-26 13:44:40 +01:00
|
|
|
|
2023-09-11 20:23:04 +02:00
|
|
|
# Enable the ManageSieve protocol
|
|
|
|
enableManageSieve = true;
|
2019-02-26 13:44:40 +01:00
|
|
|
|
2023-09-11 20:23:04 +02:00
|
|
|
# whether to scan inbound emails for viruses (note that this requires at least
|
|
|
|
# 1 Gb RAM for the server. Without virus scanning 256 MB RAM should be plenty)
|
|
|
|
virusScanning = false;
|
|
|
|
};
|
|
|
|
sops.secrets =
|
|
|
|
fn.sopsHelper
|
|
|
|
(user: "users/${user.name}/mail")
|
|
|
|
config.machine.mailAccounts
|
|
|
|
{};
|
|
|
|
}
|