Files
sp-config/sp-modules/simple-nixos-mailserver/config.nix

178 lines
5.6 KiB
Nix
Raw Normal View History

2025-06-18 19:53:44 +03:00
{
config,
lib,
pkgs,
...
}@nixos-args:
let
sp = config.selfprivacy;
inherit (import ./common.nix { inherit config pkgs; })
auth-passthru
group
is-auth-enabled
;
mailserver-service-account = {
mailserver-service-account-name = "sp.mailserver.service-account";
mailserver-service-account-token-name = "mailserver-service-account-token";
2025-06-18 19:53:44 +03:00
mailserver-service-account-token-fp = "/run/keys/${group}/kanidm-service-account-token"; # FIXME sync with auth module
};
2025-09-13 15:44:04 +03:00
modulesConfig = builtins.mapAttrs (
_: value: {
inherit (value) hashedPasswordFile sendOnly;
}
2025-09-13 16:36:41 +03:00
) sp.email;
extraDomains = lib.mapAttrsToList (_: value: "${value.subdomain}.${sp.domain}") sp.email;
2025-09-13 16:36:41 +03:00
extraTargets = lib.mapAttrsToList (_: value: value.systemdTargets) sp.email;
in
2025-06-18 19:53:44 +03:00
lib.mkIf sp.modules.simple-nixos-mailserver.enable (
lib.mkMerge [
{
assertions = [
{
assertion =
config.selfprivacy.modules.simple-nixos-mailserver.enableSso -> config.selfprivacy.sso.enable;
message = "SSO cannot be enabled for Mailserver when SSO is disabled globally.";
}
];
fileSystems = lib.mkIf sp.useBinds {
"/var/vmail" = {
2025-06-18 19:53:44 +03:00
device = "/volumes/${sp.modules.simple-nixos-mailserver.location}/vmail";
options = [
"bind"
"x-systemd.required-by=postfix.service"
"x-systemd.before=postfix.service"
];
};
"/var/sieve" = {
2025-06-18 19:53:44 +03:00
device = "/volumes/${sp.modules.simple-nixos-mailserver.location}/sieve";
options = [
"bind"
"x-systemd.required-by=dovecot2.service"
"x-systemd.before=dovecot2.service"
];
};
};
2025-06-18 19:53:44 +03:00
users.users = {
virtualMail = {
isNormalUser = false;
};
};
2025-06-18 19:53:44 +03:00
users.groups.acmereceivers.members = [
"dovecot2"
"postfix"
"virtualMail"
];
2025-06-18 19:53:44 +03:00
mailserver = {
enable = true;
fqdn = sp.domain;
2025-09-13 15:44:04 +03:00
domains = [ sp.domain ] ++ extraDomains;
2025-06-18 19:53:44 +03:00
localDnsResolver = false;
2025-06-18 19:53:44 +03:00
# A list of all login accounts. To create the password hashes, use
# mkpasswd -m sha-512 "super secret password"
loginAccounts = (
{
"${sp.username}@${sp.domain}" = {
hashedPassword = sp.hashedMasterPassword;
sieveScript = ''
require ["fileinto", "mailbox"];
if header :contains "Chat-Version" "1.0"
{
fileinto :create "DeltaChat";
stop;
}
'';
};
}
// builtins.listToAttrs (
builtins.map (user: {
name = "${user.username}@${sp.domain}";
value = {
hashedPassword = user.hashedPassword;
sieveScript = ''
require ["fileinto", "mailbox"];
if header :contains "Chat-Version" "1.0"
{
fileinto :create "DeltaChat";
stop;
}
'';
};
}) sp.users
)
2025-09-13 15:44:04 +03:00
// modulesConfig
2025-06-18 19:53:44 +03:00
);
2025-06-18 19:53:44 +03:00
extraVirtualAliases = {
"admin@${sp.domain}" = "${sp.username}@${sp.domain}";
};
2025-06-18 19:53:44 +03:00
certificateScheme = "manual";
certificateFile = "/var/lib/acme/root-${sp.domain}/fullchain.pem";
keyFile = "/var/lib/acme/root-${sp.domain}/key.pem";
2025-06-18 19:53:44 +03:00
# Enable IMAP and POP3
enableImap = true;
enableImapSsl = true;
enablePop3 = false;
enablePop3Ssl = false;
dkimSelector = "selector";
2025-06-18 19:53:44 +03:00
# Enable the ManageSieve protocol
enableManageSieve = true;
2025-06-18 19:53:44 +03:00
virusScanning = false;
2025-06-18 19:53:44 +03:00
mailDirectory = "/var/vmail";
};
2025-06-18 19:53:44 +03:00
systemd = {
services = {
dovecot2.serviceConfig.Slice = "simple_nixos_mailserver.slice";
postfix.serviceConfig.Slice = "simple_nixos_mailserver.slice";
rspamd.serviceConfig.Slice = "simple_nixos_mailserver.slice";
redis-rspamd.serviceConfig.Slice = "simple_nixos_mailserver.slice";
2025-09-13 15:44:04 +03:00
dovecot.wants = extraTargets;
dovecot2.wants = extraTargets;
2025-06-18 19:53:44 +03:00
};
slices."simple_nixos_mailserver" = {
name = "simple_nixos_mailserver.slice";
description = "Simple NixOS Mailserver service slice";
};
};
2025-06-18 19:53:44 +03:00
}
# the following parts are active only when "auth" module is enabled
(lib.mkIf is-auth-enabled {
mailserver = {
extraVirtualAliases = lib.mkForce { };
2025-09-13 15:44:04 +03:00
loginAccounts = lib.mkForce modulesConfig;
2025-06-18 19:53:44 +03:00
# LDAP is needed for Postfix to query Kanidm about email address ownership.
# LDAP is needed for Dovecot also.
ldap = {
# false; otherwise, simple-nixos-mailserver enables auth via LDAP
enable = false;
2025-06-18 19:53:44 +03:00
# bind.dn = "uid=mail,ou=persons," + ldap_base_dn;
bind.dn = "dn=token";
# TODO change in this file should trigger system restart dovecot
bind.passwordFile = mailserver-service-account.mailserver-service-account-token-fp;
2025-06-18 19:53:44 +03:00
# searchBase = "ou=persons," + ldap_base_dn;
searchBase = auth-passthru.ldap-base-dn; # TODO refine this
2025-06-18 19:53:44 +03:00
# NOTE: 127.0.0.1 instead of localhost doesn't work (maybe because of TLS)
uris = [ "ldaps://localhost:${toString auth-passthru.ldap-port}" ];
};
};
2025-06-18 19:53:44 +03:00
})
(lib.mkIf is-auth-enabled (import ./auth-dovecot.nix mailserver-service-account nixos-args))
(lib.mkIf is-auth-enabled (import ./auth-postfix.nix nixos-args))
]
)