clean configuration; simple-nixos-mailserver is an ordinary SP module

This commit is contained in:
Alexander Tomokhov 2023-12-12 08:25:06 +04:00
parent 25bd151ef3
commit defaca8793
8 changed files with 90 additions and 128 deletions

View file

@ -1,7 +1,7 @@
{ config, pkgs, lib, ... }: { config, pkgs, lib, ... }:
{ {
imports = [ imports = [
./variables-module.nix ./selfprivacy-module.nix
./volumes.nix ./volumes.nix
./users.nix ./users.nix
./letsencrypt/acme.nix ./letsencrypt/acme.nix

View file

@ -25,9 +25,10 @@
deployment deployment
./configuration.nix ./configuration.nix
(import ./files.nix top-level-flake.outPath) (import ./files.nix top-level-flake.outPath)
(import ./userdata-variables.nix userdata)
selfprivacy-api.nixosModules.default selfprivacy-api.nixosModules.default
{ {
# pass userdata (parsed from JSON) options to selfprivacy module
selfprivacy = userdata;
# embed top-level flake source folder into the build # embed top-level flake source folder into the build
environment.etc."selfprivacy/nixos-config-source".source = environment.etc."selfprivacy/nixos-config-source".source =
top-level-flake.outPath; top-level-flake.outPath;

View file

@ -86,32 +86,25 @@ with lib;
############# #############
dns = { dns = {
provider = mkOption { provider = mkOption {
description = "DNS provider that was defined at the initial setup process. Default is ClOUDFLARE"; description = "DNS provider that was defined at the initial setup process.";
type = types.nullOr types.str; type = types.nullOr types.str;
}; };
useStagingACME = mkOption { useStagingACME = mkOption {
description = "Use staging ACME server. Default is false"; description = "Use staging ACME server. Default is false";
type = types.nullOr types.bool; type = types.nullOr types.bool;
default = false;
}; };
}; };
backup = { backup = {
bucket = mkOption { bucket = mkOption {
description = "Bucket name used for userdata backups"; description = "Bucket name used for userdata backups";
type = types.nullOr types.str; type = types.nullOr types.str;
default = "";
}; };
}; };
server = { server = {
provider = mkOption { provider = mkOption {
description = "Server provider that was defined at the initial setup process. Default is HETZNER"; description = "Server provider that was defined at the initial setup process.";
type = types.nullOr types.str;
};
};
##############
# Services #
##############
email = {
location = mkOption {
default = "sda1";
type = types.nullOr types.str; type = types.nullOr types.str;
}; };
}; };
@ -125,7 +118,7 @@ with lib;
}; };
rootKeys = mkOption { rootKeys = mkOption {
description = '' description = ''
Root SSH Keys Root SSH authorized keys
''; '';
type = types.nullOr (types.listOf types.str); type = types.nullOr (types.listOf types.str);
default = [ "" ]; default = [ "" ];
@ -163,9 +156,5 @@ with lib;
default = false; default = false;
description = "Whether to bind-mount vmail and sieve folders"; description = "Whether to bind-mount vmail and sieve folders";
}; };
##############
# Modules #
##############
# modules =
}; };
} }

View file

@ -1,7 +1,6 @@
[ [
[ "mailserver" ], [ "mailserver" ],
[ "selfprivacy", "domain" ], [ "selfprivacy", "domain" ],
[ "selfprivacy", "email" ],
[ "selfprivacy", "hashedMasterPassword" ], [ "selfprivacy", "hashedMasterPassword" ],
[ "selfprivacy", "useBinds" ], [ "selfprivacy", "useBinds" ],
[ "selfprivacy", "username" ], [ "selfprivacy", "username" ],

View file

@ -2,21 +2,23 @@ mailserverDate: { config, lib, ... }:
let let
sp = config.selfprivacy; sp = config.selfprivacy;
in in
lib.mkIf sp.modules.simple-nixos-mailserver.enable
{ {
fileSystems = fileSystems = lib.mkIf sp.useBinds
lib.mkIf (sp.modules.simple-nixos-mailserver.enable && sp.useBinds) {
{ "/var/vmail" = {
"/var/vmail" = { device =
device = "/volumes/${sp.email.location}/vmail"; "/volumes/${sp.modules.simple-nixos-mailserver.location}/vmail";
options = [ "bind" ]; options = [ "bind" ];
};
"/var/sieve" = {
device = "/volumes/${sp.email.location}/sieve";
options = [ "bind" ];
};
}; };
"/var/sieve" = {
device =
"/volumes/${sp.modules.simple-nixos-mailserver.location}/sieve";
options = [ "bind" ];
};
};
users.users = lib.mkIf sp.modules.simple-nixos-mailserver.enable { users.users = {
virtualMail = { virtualMail = {
isNormalUser = false; isNormalUser = false;
}; };
@ -24,16 +26,30 @@ in
users.groups.acmereceivers.members = [ "dovecot2" "postfix" "virtualMail" ]; users.groups.acmereceivers.members = [ "dovecot2" "postfix" "virtualMail" ];
selfprivacy.modules.simple-nixos-mailserver = mailserver = {
lib.mkIf sp.modules.simple-nixos-mailserver.enable { enable = true;
fqdn = sp.domain; fqdn = sp.domain;
domains = [ sp.domain ]; domains = [ sp.domain ];
# A list of all login accounts. To create the password hashes, use # A list of all login accounts. To create the password hashes, use
# mkpasswd -m sha-512 "super secret password" # mkpasswd -m sha-512 "super secret password"
loginAccounts = { loginAccounts = {
"${sp.username}@${sp.domain}" = { "${sp.username}@${sp.domain}" = {
hashedPassword = sp.hashedMasterPassword; 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 = '' sieveScript = ''
require ["fileinto", "mailbox"]; require ["fileinto", "mailbox"];
if header :contains "Chat-Version" "1.0" if header :contains "Chat-Version" "1.0"
@ -43,45 +59,31 @@ in
} }
''; '';
}; };
} // builtins.listToAttrs (builtins.map })
(user: { sp.users);
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);
extraVirtualAliases = { extraVirtualAliases = {
"admin@${sp.domain}" = "${sp.username}@${sp.domain}"; "admin@${sp.domain}" = "${sp.username}@${sp.domain}";
};
certificateScheme =
if builtins.compareVersions mailserverDate "20230525011002"
>= 0
then "manual"
else 1;
certificateFile = "/var/lib/acme/${sp.domain}/fullchain.pem";
keyFile = "/var/lib/acme/${sp.domain}/key.pem";
# Enable IMAP and POP3
enableImap = true;
enableImapSsl = true;
enablePop3 = false;
enablePop3Ssl = false;
dkimSelector = "selector";
# Enable the ManageSieve protocol
enableManageSieve = true;
virusScanning = false;
}; };
certificateScheme =
if builtins.compareVersions mailserverDate "20230525011002"
>= 0
then "manual"
else 1;
certificateFile = "/var/lib/acme/${sp.domain}/fullchain.pem";
keyFile = "/var/lib/acme/${sp.domain}/key.pem";
# Enable IMAP and POP3
enableImap = true;
enableImapSsl = true;
enablePop3 = false;
enablePop3Ssl = false;
dkimSelector = "selector";
# Enable the ManageSieve protocol
enableManageSieve = true;
virusScanning = false;
};
} }

View file

@ -5,23 +5,13 @@
gitlab:simple-nixos-mailserver/nixos-mailserver; gitlab:simple-nixos-mailserver/nixos-mailserver;
outputs = { self, mailserver }: { outputs = { self, mailserver }: {
nixosModules.default = args@{ config, ... }: nixosModules.default = _: {
let imports = [
module = mailserver.nixosModules.default args; mailserver.nixosModules.default
in ./options.nix
{ (import ./config.nix mailserver.lastModifiedDate)
imports = [ ];
module };
{
# tricks to rename (alias) the original module
config.mailserver =
config.selfprivacy.modules.simple-nixos-mailserver;
options.selfprivacy.modules.simple-nixos-mailserver =
module.options.mailserver;
}
(import ./config.nix mailserver.lastModifiedDate)
];
};
configPathsNeeded = configPathsNeeded =
builtins.fromJSON (builtins.readFile ./config-paths-needed.json); builtins.fromJSON (builtins.readFile ./config-paths-needed.json);

View file

@ -0,0 +1,13 @@
{ lib, ... }:
{
options.selfprivacy.modules.simple-nixos-mailserver = {
enable = lib.mkOption {
default = false;
type = with lib.types; nullOr bool;
};
location = lib.mkOption {
default = "sda1";
type = with lib.types; nullOr str;
};
};
}

View file

@ -1,32 +0,0 @@
jsonData: { lib, ... }:
{
selfprivacy = jsonData // {
hostname = lib.attrsets.attrByPath [ "hostname" ] null jsonData;
domain = lib.attrsets.attrByPath [ "domain" ] null jsonData;
timezone = lib.attrsets.attrByPath [ "timezone" ] "Europe/Uzhgorod" jsonData;
stateVersion = lib.attrsets.attrByPath [ "stateVersion" ] "22.05" jsonData;
username = lib.attrsets.attrByPath [ "username" ] null jsonData;
hashedMasterPassword = lib.attrsets.attrByPath [ "hashedMasterPassword" ] null jsonData;
sshKeys = lib.attrsets.attrByPath [ "sshKeys" ] [ ] jsonData;
dns = {
provider = lib.attrsets.attrByPath [ "dns" "provider" ] "CLOUDFLARE" jsonData;
useStagingACME = lib.attrsets.attrByPath [ "dns" "useStagingACME" ] false jsonData;
};
backup = {
bucket = lib.attrsets.attrByPath [ "backup" "bucket" ] (lib.attrsets.attrByPath [ "backblaze" "bucket" ] "" jsonData) jsonData;
};
server = {
provider = lib.attrsets.attrByPath [ "server" "provider" ] "HETZNER" jsonData;
};
ssh = {
enable = lib.attrsets.attrByPath [ "ssh" "enable" ] true jsonData;
rootKeys = lib.attrsets.attrByPath [ "ssh" "rootKeys" ] [ "" ] jsonData;
passwordAuthentication = lib.attrsets.attrByPath [ "ssh" "passwordAuthentication" ] true jsonData;
};
email = {
location = lib.attrsets.attrByPath [ "email" "location" ] "sda1" jsonData;
};
users = lib.attrsets.attrByPath [ "users" ] [ ] jsonData;
volumes = lib.attrsets.attrByPath [ "volumes" ] [ ] jsonData;
};
}