nixos/postfix: pull setup into its own unit

Consider a service that generates postfix lookup tables with
postmap(1), like Mailman.  It needs the Postfix configuration file to
exist, but Postfix qmgr needs all the lookup tables its configured
with to exist before it starts.  So the service that runs postmap
needs to run after the Postfix configuration and directory structure
is generated, but before Postfix itself is started.  To enable this,
we split Postfix into two units: a oneshot unit that sets up the
configuration, and a longrun unit that supervises the Postfix
daemons.  The postmap services can then be inserted in between these
two units.
This commit is contained in:
Alyssa Ross 2022-04-05 10:03:25 +00:00
parent a89f875bea
commit fb2fa1b50f
No known key found for this signature in database
GPG key ID: F9DBED4859B271C0
2 changed files with 24 additions and 18 deletions

View file

@ -313,7 +313,8 @@ in {
systemd.services = {
mailman = {
description = "GNU Mailman Master Process";
after = [ "network.target" ];
after = [ "network.target" ]
++ lib.optional cfg.enablePostfix "postfix-setup.service";
restartTriggers = [ config.environment.etc."mailman.cfg".source ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {

View file

@ -723,23 +723,10 @@ in
{ ${setgidGroup}.gid = config.ids.gids.postdrop;
};
systemd.services.postfix =
{ description = "Postfix mail server";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
path = [ pkgs.postfix ];
serviceConfig = {
Type = "forking";
Restart = "always";
PIDFile = "/var/lib/postfix/queue/pid/master.pid";
ExecStart = "${pkgs.postfix}/bin/postfix start";
ExecStop = "${pkgs.postfix}/bin/postfix stop";
ExecReload = "${pkgs.postfix}/bin/postfix reload";
};
preStart = ''
systemd.services.postfix-setup =
{ description = "Setup for Postfix mail server";
serviceConfig.Type = "oneshot";
script = ''
# Backwards compatibility
if [ ! -d /var/lib/postfix ] && [ -d /var/postfix ]; then
mkdir -p /var/lib
@ -777,6 +764,24 @@ in
'';
};
systemd.services.postfix =
{ description = "Postfix mail server";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" "postfix-setup.service" ];
requires = [ "postfix-setup.service" ];
path = [ pkgs.postfix ];
serviceConfig = {
Type = "forking";
Restart = "always";
PIDFile = "/var/lib/postfix/queue/pid/master.pid";
ExecStart = "${pkgs.postfix}/bin/postfix start";
ExecStop = "${pkgs.postfix}/bin/postfix stop";
ExecReload = "${pkgs.postfix}/bin/postfix reload";
};
};
services.postfix.config = (mapAttrs (_: v: mkDefault v) {
compatibility_level = pkgs.postfix.version;
mail_owner = cfg.user;