grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / mail / mailpit.nix
blob6bc368e91f5f1d191a64c9892b46c981162b5805
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
8 let
9   inherit (config.services.mailpit) instances;
10   inherit (lib)
11     cli
12     concatStringsSep
13     const
14     filterAttrs
15     getExe
16     mapAttrs'
17     mkIf
18     mkOption
19     nameValuePair
20     types
21     ;
23   isNonNull = v: v != null;
24   genCliFlags =
25     settings: concatStringsSep " " (cli.toGNUCommandLine { } (filterAttrs (const isNonNull) settings));
28   options.services.mailpit.instances = mkOption {
29     default = { };
30     type = types.attrsOf (
31       types.submodule {
32         freeformType = types.attrsOf (
33           types.oneOf [
34             types.str
35             types.int
36             types.bool
37           ]
38         );
39         options = {
40           database = mkOption {
41             type = types.nullOr types.str;
42             default = null;
43             example = "mailpit.db";
44             description = ''
45               Specify the local database filename to store persistent data.
46               If `null`, a temporary file will be created that will be removed when the application stops.
47               It's recommended to specify a relative path. The database will be written into the service's
48               state directory then.
49             '';
50           };
51           max = mkOption {
52             type = types.ints.unsigned;
53             default = 500;
54             description = ''
55               Maximum number of emails to keep. If the number is exceeded, old emails
56               will be deleted.
58               Set to `0` to never prune old emails.
59             '';
60           };
61           listen = mkOption {
62             default = "127.0.0.1:8025";
63             type = types.str;
64             description = ''
65               HTTP bind interface and port for UI.
66             '';
67           };
68           smtp = mkOption {
69             default = "127.0.0.1:1025";
70             type = types.str;
71             description = ''
72               SMTP bind interface and port.
73             '';
74           };
75         };
76       }
77     );
78     description = ''
79       Configure mailpit instances. The attribute-set values are
80       CLI flags passed to the `mailpit` CLI.
82       See [upstream docs](https://mailpit.axllent.org/docs/configuration/runtime-options/)
83       for all available options.
84     '';
85   };
87   config = mkIf (instances != { }) {
88     systemd.services = mapAttrs' (
89       name: cfg:
90       nameValuePair "mailpit-${name}" {
91         wantedBy = [ "multi-user.target" ];
92         after = [ "network-online.target" ];
93         wants = [ "network-online.target" ];
94         serviceConfig = {
95           DynamicUser = true;
96           StateDirectory = "mailpit";
97           WorkingDirectory = "%S/mailpit";
98           ExecStart = "${getExe pkgs.mailpit} ${genCliFlags cfg}";
99           Restart = "on-failure";
100         };
101       }
102     ) instances;
103   };
105   meta.maintainers = lib.teams.flyingcircus.members;