vuls: init at 0.27.0 (#348530)
[NixPkgs.git] / nixos / modules / services / web-apps / silverbullet.nix
bloba6a830e674b49709117f9d29d407164473b30459
1 { config
2 , pkgs
3 , lib
4 , ...
5 }:
6 let
7   cfg = config.services.silverbullet;
8   defaultUser = "silverbullet";
9   defaultGroup = defaultUser;
10   defaultSpaceDir = "/var/lib/silverbullet";
13   options = {
14     services.silverbullet = {
15       enable = lib.mkEnableOption "Silverbullet, an open-source, self-hosted, offline-capable Personal Knowledge Management (PKM) web application";
17       package = lib.mkPackageOption pkgs "silverbullet" { };
19       openFirewall = lib.mkOption {
20         type = lib.types.bool;
21         default = false;
22         description = "Open port in the firewall.";
23       };
25       listenPort = lib.mkOption {
26         type = lib.types.int;
27         default = 3000;
28         description = "Port to listen on.";
29       };
31       listenAddress = lib.mkOption {
32         type = lib.types.str;
33         default = "127.0.0.1";
34         description = "Address or hostname to listen on. Defaults to 127.0.0.1.";
35       };
37       spaceDir = lib.mkOption {
38         type = lib.types.path;
39         default = defaultSpaceDir;
40         example = "/home/yourUser/silverbullet";
41         description = ''
42           Folder to store Silverbullet's space/workspace.
43           By default it is located at `${defaultSpaceDir}`.
44         '';
45       };
47       user = lib.mkOption {
48         type = lib.types.str;
49         default = defaultUser;
50         example = "yourUser";
51         description = ''
52           The user to run Silverbullet as.
53           By default, a user named `${defaultUser}` will be created whose space
54           directory is [spaceDir](#opt-services.silverbullet.spaceDir).
55         '';
56       };
58       group = lib.mkOption {
59         type = lib.types.str;
60         default = defaultGroup;
61         example = "yourGroup";
62         description = ''
63           The group to run Silverbullet under.
64           By default, a group named `${defaultGroup}` will be created.
65         '';
66       };
68       envFile = lib.mkOption {
69         type = lib.types.nullOr lib.types.path;
70         default = null;
71         example = "/etc/silverbullet.env";
72         description = ''
73           File containing extra environment variables. For example:
75           ```
76           SB_USER=user:password
77           SB_AUTH_TOKEN=abcdefg12345
78           ```
79         '';
80       };
82       extraArgs = lib.mkOption {
83         type = lib.types.listOf lib.types.str;
84         default = [ ];
85         example = [ "--db /path/to/silverbullet.db" ];
86         description = "Extra arguments passed to silverbullet.";
87       };
88     };
89   };
91   config = lib.mkIf cfg.enable {
92     systemd.services.silverbullet = {
93       description = "Silverbullet service";
94       after = [ "network.target" ];
95       wantedBy = [ "multi-user.target" ];
97       preStart = lib.mkIf (!lib.hasPrefix "/var/lib/" cfg.spaceDir) "mkdir -p '${cfg.spaceDir}'";
98       serviceConfig = {
99         Type = "simple";
100         User = "${cfg.user}";
101         Group = "${cfg.group}";
102         EnvironmentFile = lib.mkIf (cfg.envFile != null) "${cfg.envFile}";
103         StateDirectory = lib.mkIf (lib.hasPrefix "/var/lib/" cfg.spaceDir) (lib.last (lib.splitString "/" cfg.spaceDir));
104         ExecStart = "${lib.getExe cfg.package} --port ${toString cfg.listenPort} --hostname '${cfg.listenAddress}' '${cfg.spaceDir}' " + lib.concatStringsSep " " cfg.extraArgs;
105         Restart = "on-failure";
106       };
107     };
109     networking.firewall = lib.mkIf cfg.openFirewall {
110       allowedTCPPorts = [ cfg.listenPort ];
111     };
113     users.users.${defaultUser} = lib.mkIf (cfg.user == defaultUser) {
114       isSystemUser = true;
115       group = cfg.group;
116       description = "Silverbullet daemon user";
117     };
119     users.groups.${defaultGroup} = lib.mkIf (cfg.group == defaultGroup) { };
120   };
122   meta.maintainers = with lib.maintainers; [ aorith ];