grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / web-apps / hledger-web.nix
blob32d9df4e8458f1cfa230bd6bc93cd6bf25ad7369
1 { lib, pkgs, config, ... }:
2 with lib;
3 let
4   cfg = config.services.hledger-web;
5 in {
6   options.services.hledger-web = {
8     enable = mkEnableOption "hledger-web service";
10     serveApi = mkEnableOption "serving only the JSON web API, without the web UI";
12     host = mkOption {
13       type = types.str;
14       default = "127.0.0.1";
15       description = ''
16         Address to listen on.
17       '';
18     };
20     port = mkOption {
21       type = types.port;
22       default = 5000;
23       example = 80;
24       description = ''
25         Port to listen on.
26       '';
27     };
29     allow = mkOption {
30       type = types.enum [ "view" "add" "edit" "sandstorm" ];
31       default = "view";
32       description = ''
33         User's access level for changing data.
35         * view: view only permission.
36         * add: view and add permissions.
37         * edit: view, add, and edit permissions.
38         * sandstorm: permissions from the `X-Sandstorm-Permissions` request header.
39       '';
40     };
42     stateDir = mkOption {
43       type = types.path;
44       default = "/var/lib/hledger-web";
45       description = ''
46         Path the service has access to. If left as the default value this
47         directory will automatically be created before the hledger-web server
48         starts, otherwise the sysadmin is responsible for ensuring the
49         directory exists with appropriate ownership and permissions.
50       '';
51     };
53     journalFiles = mkOption {
54       type = types.listOf types.str;
55       default = [ ".hledger.journal" ];
56       description = ''
57         Paths to journal files relative to {option}`services.hledger-web.stateDir`.
58       '';
59     };
61     baseUrl = mkOption {
62       type = with types; nullOr str;
63       default = null;
64       example = "https://example.org";
65       description = ''
66         Base URL, when sharing over a network.
67       '';
68     };
70     extraOptions = mkOption {
71       type = types.listOf types.str;
72       default = [];
73       example = [ "--forecast" ];
74       description = ''
75         Extra command line arguments to pass to hledger-web.
76       '';
77     };
79   };
81   imports = [
82     (mkRemovedOptionModule [ "services" "hledger-web" "capabilities" ]
83       "This option has been replaced by new option `services.hledger-web.allow`.")
84   ];
86   config = mkIf cfg.enable {
88     users.users.hledger = {
89       name = "hledger";
90       group = "hledger";
91       isSystemUser = true;
92       home = cfg.stateDir;
93       useDefaultShell = true;
94     };
96     users.groups.hledger = {};
98     systemd.services.hledger-web = let
99       serverArgs = with cfg; escapeShellArgs ([
100         "--serve"
101         "--host=${host}"
102         "--port=${toString port}"
103         "--allow=${allow}"
104         (optionalString (cfg.baseUrl != null) "--base-url=${cfg.baseUrl}")
105         (optionalString (cfg.serveApi) "--serve-api")
106       ] ++ (map (f: "--file=${stateDir}/${f}") cfg.journalFiles)
107         ++ extraOptions);
108     in {
109       description = "hledger-web - web-app for the hledger accounting tool.";
110       documentation = [ "https://hledger.org/hledger-web.html" ];
111       wantedBy = [ "multi-user.target" ];
112       after = [ "networking.target" ];
113       serviceConfig = mkMerge [
114         {
115           ExecStart = "${pkgs.hledger-web}/bin/hledger-web ${serverArgs}";
116           Restart = "always";
117           WorkingDirectory = cfg.stateDir;
118           User = "hledger";
119           Group = "hledger";
120           PrivateTmp = true;
121         }
122         (mkIf (cfg.stateDir == "/var/lib/hledger-web") {
123           StateDirectory = "hledger-web";
124         })
125       ];
126     };
128   };
130   meta.maintainers = with lib.maintainers; [ marijanp erictapen ];