grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / mail / automx2.nix
blob2cfb5f491341bfc3d3dc10d6867e997f55808a83
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
8 let
9   cfg = config.services.automx2;
10   format = pkgs.formats.json { };
13   options = {
14     services.automx2 = {
15       enable = lib.mkEnableOption "automx2";
17       package = lib.mkPackageOption pkgs [
18         "python3Packages"
19         "automx2"
20       ] { };
22       domain = lib.mkOption {
23         type = lib.types.str;
24         example = "example.com";
25         description = ''
26           E-Mail-Domain for which mail client autoconfig/autoconfigure should be set up.
27           The `autoconfig` and `autodiscover` subdomains are automatically prepended and set up with ACME.
28           The names of those domains are hardcoded in the mail clients and are not configurable.
29         '';
30       };
32       port = lib.mkOption {
33         type = lib.types.port;
34         default = 4243;
35         description = "Port used by automx2.";
36       };
38       settings = lib.mkOption {
39         inherit (format) type;
40         description = ''
41           Bootstrap json to populate database.
42           See [docs](https://rseichter.github.io/automx2/#_sqlite) for details.
43         '';
44       };
45     };
46   };
48   config = lib.mkIf cfg.enable {
49     services.nginx = {
50       enable = true;
51       virtualHosts = {
52         "autoconfig.${cfg.domain}" = {
53           enableACME = true;
54           forceSSL = true;
55           serverAliases = [ "autodiscover.${cfg.domain}" ];
56           locations = {
57             "/".proxyPass = "http://127.0.0.1:${toString cfg.port}/";
58             "/initdb".extraConfig = ''
59               # Limit access to clients connecting from localhost
60               allow 127.0.0.1;
61               deny all;
62             '';
63           };
64         };
65       };
66     };
68     systemd.services.automx2 = {
69       after = [ "network.target" ];
70       postStart = ''
71         sleep 3
72         ${lib.getExe pkgs.curl} -X POST --json @${format.generate "automx2.json" cfg.settings} http://127.0.0.1:${toString cfg.port}/initdb/
73       '';
74       serviceConfig = {
75         Environment = [
76           "AUTOMX2_CONF=${pkgs.writeText "automx2-conf" ''
77             [automx2]
78             loglevel = WARNING
79             db_uri = sqlite:///:memory:
80             proxy_count = 1
81           ''}"
82           "FLASK_APP=automx2.server:app"
83           "FLASK_CONFIG=production"
84         ];
85         ExecStart = "${
86           pkgs.python3.buildEnv.override { extraLibs = [ cfg.package ]; }
87         }/bin/flask run --host=127.0.0.1 --port=${toString cfg.port}";
88         Restart = "always";
89         StateDirectory = "automx2";
90         User = "automx2";
91         WorkingDirectory = "/var/lib/automx2";
92       };
93       unitConfig = {
94         Description = "MUA configuration service";
95         Documentation = "https://rseichter.github.io/automx2/";
96       };
97       wantedBy = [ "multi-user.target" ];
98     };
100     users = {
101       groups.automx2 = { };
102       users.automx2 = {
103         group = "automx2";
104         isSystemUser = true;
105       };
106     };
107   };