grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / web-apps / alps.nix
blobe72b85eb356907df7e4f164ed18642c39fd19c57
1 { lib, pkgs, config, ... }:
3 with lib;
5 let
6   cfg = config.services.alps;
7 in {
8   options.services.alps = {
9     enable = mkEnableOption "alps";
11     port = mkOption {
12       type = types.port;
13       default = 1323;
14       description = ''
15         TCP port the service should listen on.
16       '';
17     };
19     bindIP = mkOption {
20       default = "[::]";
21       type = types.str;
22       description = ''
23         The IP the service should listen on.
24       '';
25     };
27     theme = mkOption {
28       type = types.enum [ "alps" "sourcehut" ];
29       default = "sourcehut";
30       description = ''
31         The frontend's theme to use.
32       '';
33     };
35     imaps = {
36       port = mkOption {
37         type = types.port;
38         default = 993;
39         description = ''
40           The IMAPS server port.
41         '';
42       };
44       host = mkOption {
45         type = types.str;
46         default = "[::1]";
47         example = "mail.example.org";
48         description = ''
49           The IMAPS server address.
50         '';
51       };
52     };
54     smtps = {
55       port = mkOption {
56         type = types.port;
57         default = 465;
58         description = ''
59           The SMTPS server port.
60         '';
61       };
63       host = mkOption {
64         type = types.str;
65         default = cfg.imaps.host;
66         defaultText = "services.alps.imaps.host";
67         example = "mail.example.org";
68         description = ''
69           The SMTPS server address.
70         '';
71       };
72     };
74     package = mkOption {
75       internal = true;
76       type = types.package;
77       default = pkgs.alps;
78     };
80     args = mkOption {
81       internal = true;
82       type = types.listOf types.str;
83       default = [
84         "-addr" "${cfg.bindIP}:${toString cfg.port}"
85         "-theme" "${cfg.theme}"
86         "imaps://${cfg.imaps.host}:${toString cfg.imaps.port}"
87         "smtps://${cfg.smtps.host}:${toString cfg.smtps.port}"
88       ];
89     };
90   };
92   config = mkIf cfg.enable {
93     systemd.services.alps = {
94       description = "alps is a simple and extensible webmail.";
95       documentation = [ "https://git.sr.ht/~migadu/alps" ];
96       wantedBy = [ "multi-user.target" ];
97       wants = [ "network-online.target" ];
98       after = [ "network.target" "network-online.target" ];
100       serviceConfig = {
101         ExecStart = "${cfg.package}/bin/alps ${escapeShellArgs cfg.args}";
102         AmbientCapabilities = "";
103         CapabilityBoundingSet = "";
104         DynamicUser = true;
105         LockPersonality = true;
106         MemoryDenyWriteExecute = true;
107         NoNewPrivileges = true;
108         PrivateDevices = true;
109         PrivateIPC = true;
110         PrivateTmp = true;
111         PrivateUsers = true;
112         ProtectClock = true;
113         ProtectControlGroups = true;
114         ProtectHome = true;
115         ProtectHostname = true;
116         ProtectKernelLogs = true;
117         ProtectKernelModules = true;
118         ProtectKernelTunables = true;
119         ProtectProc = "invisible";
120         ProtectSystem = "strict";
121         RemoveIPC = true;
122         RestrictAddressFamilies = [ "AF_INET" "AF_INET6" ];
123         RestrictNamespaces = true;
124         RestrictRealtime = true;
125         RestrictSUIDSGID = true;
126         SocketBindAllow = cfg.port;
127         SocketBindDeny = "any";
128         SystemCallArchitectures = "native";
129         SystemCallFilter = [ "@system-service" "~@privileged @obsolete" ];
130       };
131     };
132   };