grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / misc / etesync-dav.nix
blob2cccc51d1fbf379eeeac5c18b2d59a815c0323c1
1 { config, lib, pkgs, ... }:
2 let
3   cfg = config.services.etesync-dav;
4 in
5   {
6     options.services.etesync-dav = {
7       enable = lib.mkEnableOption "etesync-dav, end-to-end encrypted sync for contacts, calendars and tasks";
9       host = lib.mkOption {
10         type = lib.types.str;
11         default = "localhost";
12         description = "The server host address.";
13       };
15       port = lib.mkOption {
16         type = lib.types.port;
17         default = 37358;
18         description = "The server host port.";
19       };
21       apiUrl = lib.mkOption {
22         type = lib.types.str;
23         default = "https://api.etesync.com/";
24         description = "The url to the etesync API.";
25       };
27       openFirewall = lib.mkOption {
28         default = false;
29         type = lib.types.bool;
30         description = "Whether to open the firewall for the specified port.";
31       };
33       sslCertificate = lib.mkOption {
34         type = lib.types.nullOr lib.types.path;
35         default = null;
36         example = "/var/etesync.crt";
37         description = ''
38           Path to server SSL certificate. It will be copied into
39           etesync-dav's data directory.
40         '';
41       };
43       sslCertificateKey = lib.mkOption {
44         type = lib.types.nullOr lib.types.path;
45         default = null;
46         example = "/var/etesync.key";
47         description = ''
48           Path to server SSL certificate key.  It will be copied into
49           etesync-dav's data directory.
50         '';
51       };
52     };
54     config = lib.mkIf cfg.enable {
55       networking.firewall.allowedTCPPorts = lib.mkIf cfg.openFirewall [ cfg.port ];
57       systemd.services.etesync-dav = {
58         description = "etesync-dav - A CalDAV and CardDAV adapter for EteSync";
59         wants = [ "network-online.target" ];
60         after = [ "network-online.target" ];
61         wantedBy = [ "multi-user.target" ];
62         path = [ pkgs.etesync-dav ];
63         environment = {
64           ETESYNC_LISTEN_ADDRESS = cfg.host;
65           ETESYNC_LISTEN_PORT = toString cfg.port;
66           ETESYNC_URL = cfg.apiUrl;
67           ETESYNC_DATA_DIR = "/var/lib/etesync-dav";
68         };
70         serviceConfig = {
71           Type = "simple";
72           DynamicUser = true;
73           StateDirectory = "etesync-dav";
74           ExecStart = "${pkgs.etesync-dav}/bin/etesync-dav";
75           ExecStartPre = lib.mkIf (cfg.sslCertificate != null || cfg.sslCertificateKey != null) (
76             pkgs.writers.writeBash "etesync-dav-copy-keys" ''
77               ${lib.optionalString (cfg.sslCertificate != null) ''
78                 cp ${toString cfg.sslCertificate} $STATE_DIRECTORY/etesync.crt
79               ''}
80               ${lib.optionalString (cfg.sslCertificateKey != null) ''
81                 cp ${toString cfg.sslCertificateKey} $STATE_DIRECTORY/etesync.key
82               ''}
83             ''
84           );
85           Restart = "on-failure";
86           RestartSec = "30min 1s";
87         };
88       };
89     };
90   }