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:
parent
a89f875bea
commit
fb2fa1b50f
2 changed files with 24 additions and 18 deletions
|
@ -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 = {
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue