grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / misc / gollum.nix
blobccfa63d3823dcdbfa63cbfd08759476d310c6ae4
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
7 let
8   cfg = config.services.gollum;
9 in
12   imports = [
13     (lib.mkRemovedOptionModule
14       [
15         "services"
16         "gollum"
17         "mathjax"
18       ]
19       "MathJax rendering might be discontinued in the future, use services.gollum.math instead to enable KaTeX rendering or file a PR if you really need Mathjax"
20     )
21   ];
23   options.services.gollum = {
24     enable = lib.mkEnableOption "Gollum, a git-powered wiki service";
26     address = lib.mkOption {
27       type = lib.types.str;
28       default = "0.0.0.0";
29       description = "IP address on which the web server will listen.";
30     };
32     port = lib.mkOption {
33       type = lib.types.port;
34       default = 4567;
35       description = "Port on which the web server will run.";
36     };
38     extraConfig = lib.mkOption {
39       type = lib.types.lines;
40       default = "";
41       description = "Content of the configuration file";
42     };
44     math = lib.mkOption {
45       type = lib.types.bool;
46       default = false;
47       description = "Enable support for math rendering using KaTeX";
48     };
50     allowUploads = lib.mkOption {
51       type = lib.types.nullOr (
52         lib.types.enum [
53           "dir"
54           "page"
55         ]
56       );
57       default = null;
58       description = "Enable uploads of external files";
59     };
61     user-icons = lib.mkOption {
62       type = lib.types.nullOr (
63         lib.types.enum [
64           "gravatar"
65           "identicon"
66         ]
67       );
68       default = null;
69       description = "Enable specific user icons for history view";
70     };
72     emoji = lib.mkOption {
73       type = lib.types.bool;
74       default = false;
75       description = "Parse and interpret emoji tags";
76     };
78     h1-title = lib.mkOption {
79       type = lib.types.bool;
80       default = false;
81       description = "Use the first h1 as page title";
82     };
84     no-edit = lib.mkOption {
85       type = lib.types.bool;
86       default = false;
87       description = "Disable editing pages";
88     };
90     local-time = lib.mkOption {
91       type = lib.types.bool;
92       default = false;
93       description = "Use the browser's local timezone instead of the server's for displaying dates.";
94     };
96     branch = lib.mkOption {
97       type = lib.types.str;
98       default = "master";
99       example = "develop";
100       description = "Git branch to serve";
101     };
103     stateDir = lib.mkOption {
104       type = lib.types.path;
105       default = "/var/lib/gollum";
106       description = "Specifies the path of the repository directory. If it does not exist, Gollum will create it on startup.";
107     };
109     package = lib.mkPackageOption pkgs "gollum" { };
111     user = lib.mkOption {
112       type = lib.types.str;
113       default = "gollum";
114       description = "Specifies the owner of the wiki directory";
115     };
117     group = lib.mkOption {
118       type = lib.types.str;
119       default = "gollum";
120       description = "Specifies the owner group of the wiki directory";
121     };
122   };
124   config = lib.mkIf cfg.enable {
126     users.users.gollum = lib.mkIf (cfg.user == "gollum") {
127       group = cfg.group;
128       description = "Gollum user";
129       createHome = false;
130       isSystemUser = true;
131     };
133     users.groups."${cfg.group}" = { };
135     systemd.tmpfiles.rules = [ "d '${cfg.stateDir}' - ${cfg.user} ${cfg.group} - -" ];
137     systemd.services.gollum = {
138       description = "Gollum wiki";
139       after = [ "network.target" ];
140       wantedBy = [ "multi-user.target" ];
141       path = [ pkgs.git ];
143       preStart = ''
144         # This is safe to be run on an existing repo
145         git init ${cfg.stateDir}
146       '';
148       serviceConfig = {
149         User = cfg.user;
150         Group = cfg.group;
151         WorkingDirectory = cfg.stateDir;
152         ExecStart = ''
153           ${cfg.package}/bin/gollum \
154             --port ${toString cfg.port} \
155             --host ${cfg.address} \
156             --config ${pkgs.writeText "gollum-config.rb" cfg.extraConfig} \
157             --ref ${cfg.branch} \
158             ${lib.optionalString cfg.math "--math"} \
159             ${lib.optionalString cfg.emoji "--emoji"} \
160             ${lib.optionalString cfg.h1-title "--h1-title"} \
161             ${lib.optionalString cfg.no-edit "--no-edit"} \
162             ${lib.optionalString cfg.local-time "--local-time"} \
163             ${lib.optionalString (cfg.allowUploads != null) "--allow-uploads ${cfg.allowUploads}"} \
164             ${lib.optionalString (cfg.user-icons != null) "--user-icons ${cfg.user-icons}"} \
165             ${cfg.stateDir}
166         '';
167       };
168     };
169   };
171   meta.maintainers = with lib.maintainers; [
172     erictapen
173     bbenno
174   ];