vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / web-apps / bluemap.nix
blob0b45501980e6ca1f49660813f37f4862443f3fd5
1 { config, lib, pkgs, ... }:
2 let
3   cfg = config.services.bluemap;
4   format = pkgs.formats.hocon { };
6   coreConfig = format.generate "core.conf" cfg.coreSettings;
7   webappConfig = format.generate "webapp.conf" cfg.webappSettings;
8   webserverConfig = format.generate "webserver.conf" cfg.webserverSettings;
10   mapsFolder = pkgs.linkFarm "maps"
11     (lib.attrsets.mapAttrs' (name: value:
12       lib.nameValuePair "${name}.conf"
13         (format.generate "${name}.conf" value))
14       cfg.maps);
16   addonsFolder = pkgs.linkFarm "addons"
17     (lib.attrsets.mapAttrs' (name: value: lib.nameValuePair "${name}.jar" value) cfg.addons);
19   storageFolder = pkgs.linkFarm "storage"
20     (lib.attrsets.mapAttrs' (name: value:
21       lib.nameValuePair "${name}.conf"
22         (format.generate "${name}.conf" value))
23       cfg.storage);
25   configFolder = pkgs.linkFarm "bluemap-config" {
26     "maps" = mapsFolder;
27     "storages" = storageFolder;
28     "core.conf" = coreConfig;
29     "webapp.conf" = webappConfig;
30     "webserver.conf" = webserverConfig;
31     "packs" = pkgs.linkFarm "packs" cfg.resourcepacks;
32     "addons" = addonsFolder;
33   };
35   inherit (lib) mkOption;
36 in {
37   imports = [
38     (lib.mkRenamedOptionModule [ "services" "bluemap" "resourcepacks" ] [ "services" "bluemap" "packs" ])
39   ];
41   options.services.bluemap = {
42     enable = lib.mkEnableOption "bluemap";
44     eula = mkOption {
45       type = lib.types.bool;
46       description = ''
47         By changing this option to true you confirm that you own a copy of minecraft Java Edition,
48         and that you agree to minecrafts EULA.
49       '';
50       default = false;
51     };
53     defaultWorld = mkOption {
54       type = lib.types.path;
55       description = ''
56         The world used by the default map ruleset.
57         If you configure your own maps you do not need to set this.
58       '';
59       example = lib.literalExpression "\${config.services.minecraft.dataDir}/world";
60     };
62     enableRender = mkOption {
63       type = lib.types.bool;
64       description = "Enable rendering";
65       default = true;
66     };
68     webRoot = mkOption {
69       type = lib.types.path;
70       default = "/var/lib/bluemap/web";
71       description = "The directory for saving and serving the webapp and the maps";
72     };
74     enableNginx = mkOption {
75       type = lib.types.bool;
76       default = true;
77       description = "Enable configuring a virtualHost for serving the bluemap webapp";
78     };
80     host = mkOption {
81       type = lib.types.str;
82       description = "Domain on which nginx will serve the bluemap webapp";
83     };
85     onCalendar = mkOption {
86       type = lib.types.str;
87       description = ''
88         How often to trigger rendering the map,
89         in the format of a systemd timer onCalendar configuration.
90         See {manpage}`systemd.timer(5)`.
91       '';
92       default = "*-*-* 03:10:00";
93     };
95     coreSettings = mkOption {
96       type = lib.types.submodule {
97         freeformType = format.type;
98         options = {
99           data = mkOption {
100             type = lib.types.path;
101             description = "Folder for where bluemap stores its data";
102             default = "/var/lib/bluemap";
103           };
104           metrics = lib.mkEnableOption "Sending usage metrics containing the version of bluemap in use";
105         };
106       };
107       description = "Settings for the core.conf file, [see upstream docs](https://github.com/BlueMap-Minecraft/BlueMap/blob/master/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/core.conf).";
108     };
110     webappSettings = mkOption {
111       type = lib.types.submodule {
112         freeformType = format.type;
113       };
114       default = {
115         enabled = true;
116         webroot = cfg.webRoot;
117       };
118       defaultText = lib.literalExpression ''
119         {
120           enabled = true;
121           webroot = config.services.bluemap.webRoot;
122         }
123       '';
124       description = "Settings for the webapp.conf file, see [upstream docs](https://github.com/BlueMap-Minecraft/BlueMap/blob/master/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/webapp.conf).";
125     };
127     webserverSettings = mkOption {
128       type = lib.types.submodule {
129         freeformType = format.type;
130         options = {
131           enabled = mkOption {
132             type = lib.types.bool;
133             description = ''
134               Enable bluemap's built-in webserver.
135               Disabled by default in nixos for use of nginx directly.
136             '';
137             default = false;
138           };
139         };
140       };
141       default = { };
142       description = ''
143         Settings for the webserver.conf file, usually not required.
144         [See upstream docs](https://github.com/BlueMap-Minecraft/BlueMap/blob/master/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/webserver.conf).
145       '';
146     };
148     maps = mkOption {
149       type = lib.types.attrsOf (lib.types.submodule {
150         freeformType = format.type;
151         options = {
152           world = lib.mkOption {
153             type = lib.types.path;
154             description = "Path to world folder containing the dimension to render";
155           };
156         };
157       });
158       default = {
159         "overworld" = {
160           world = "${cfg.defaultWorld}";
161           ambient-light = 0.1;
162           cave-detection-ocean-floor = -5;
163         };
165         "nether" = {
166           world = "${cfg.defaultWorld}/DIM-1";
167           sorting = 100;
168           sky-color = "#290000";
169           void-color = "#150000";
170           ambient-light = 0.6;
171           world-sky-light = 0;
172           remove-caves-below-y = -10000;
173           cave-detection-ocean-floor = -5;
174           cave-detection-uses-block-light = true;
175           max-y = 90;
176         };
178         "end" = {
179           world = "${cfg.defaultWorld}/DIM1";
180           sorting = 200;
181           sky-color = "#080010";
182           void-color = "#080010";
183           ambient-light = 0.6;
184           world-sky-light = 0;
185           remove-caves-below-y = -10000;
186           cave-detection-ocean-floor = -5;
187         };
188       };
189       defaultText = lib.literalExpression ''
190         {
191           "overworld" = {
192             world = "''${cfg.defaultWorld}";
193             ambient-light = 0.1;
194             cave-detection-ocean-floor = -5;
195           };
197           "nether" = {
198             world = "''${cfg.defaultWorld}/DIM-1";
199             sorting = 100;
200             sky-color = "#290000";
201             void-color = "#150000";
202             ambient-light = 0.6;
203             world-sky-light = 0;
204             remove-caves-below-y = -10000;
205             cave-detection-ocean-floor = -5;
206             cave-detection-uses-block-light = true;
207             max-y = 90;
208           };
210           "end" = {
211             world = "''${cfg.defaultWorld}/DIM1";
212             sorting = 200;
213             sky-color = "#080010";
214             void-color = "#080010";
215             ambient-light = 0.6;
216             world-sky-light = 0;
217             remove-caves-below-y = -10000;
218             cave-detection-ocean-floor = -5;
219           };
220         };
221       '';
222       description = ''
223         Settings for files in `maps/`.
224         If you define anything here you must define everything yourself.
225         See the default for an example with good options for the different world types.
226         For valid values [consult upstream docs](https://github.com/BlueMap-Minecraft/BlueMap/blob/master/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/maps/map.conf).
227       '';
228     };
230     addons = mkOption {
231       type = lib.types.attrsOf lib.types.pathInStore;
232       default = { };
233       description = ''
234         A set of jar addons to be loaded.
236         See <https://bluemap.bluecolored.de/3rdPartySupport.html> for a list of officially recognized addons.
237       '';
239       example = lib.literalExpression ''
240         {
241           blueBridge = ./blueBridge.jar;
242           blueBorder = pkgs.fetchurl {
243             url = "https://github.com/pop4959/BlueBorder/releases/download/1.1.1/BlueBorder-1.1.1.jar";
244             hash = "...";
245           };
246         }
247       '';
248     };
250     storage = mkOption {
251       type = lib.types.attrsOf (lib.types.submodule {
252         freeformType = format.type;
253         options = {
254           storage-type = mkOption {
255             type = lib.types.enum [ "FILE" "SQL" ];
256             description = "Type of storage config";
257             default = "FILE";
258           };
259         };
260       });
261       description = ''
262         Where the rendered map will be stored.
263         Unless you are doing something advanced you should probably leave this alone and configure webRoot instead.
264         [See upstream docs](https://github.com/BlueMap-Minecraft/BlueMap/tree/master/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/storages)
265       '';
266       default = {
267         "file" = {
268           root = "${cfg.webRoot}/maps";
269         };
270       };
271       defaultText = lib.literalExpression ''
272         {
273           "file" = {
274             root = "''${config.services.bluemap.webRoot}/maps";
275           };
276         }
277       '';
278     };
280     packs = mkOption {
281       type = lib.types.attrsOf lib.types.pathInStore;
282       default = { };
283       description = ''
284         A set of resourcepacks, datapacks, and mods to extract resources from,
285         loaded in alphabetical order.
286       '';
287     };
288   };
291   config = lib.mkIf cfg.enable {
292     assertions =
293       [ { assertion = config.services.bluemap.eula;
294           message = ''
295             You have enabled bluemap but have not accepted minecraft's EULA.
296             You can achieve this through setting `services.bluemap.eula = true`
297           '';
298         }
299       ];
301     services.bluemap.coreSettings.accept-download = cfg.eula;
303     systemd.services."render-bluemap-maps" = lib.mkIf cfg.enableRender {
304       serviceConfig = {
305         Type = "oneshot";
306         Group = "nginx";
307         UMask = "026";
308       };
309       script = ''
310         ${lib.getExe pkgs.bluemap} -c ${configFolder} -gs -r
311       '';
312     };
314     systemd.timers."render-bluemap-maps" = lib.mkIf cfg.enableRender {
315       wantedBy = [ "timers.target" ];
316       timerConfig = {
317         OnCalendar = cfg.onCalendar;
318         Persistent = true;
319         Unit = "render-bluemap-maps.service";
320       };
321     };
323     services.nginx.virtualHosts = lib.mkIf cfg.enableNginx {
324       "${cfg.host}" = {
325         root = config.services.bluemap.webRoot;
326         locations = {
327           "@empty".return = "204";
329           "~* ^/maps/[^/]*/tiles/".extraConfig = ''
330             error_page 404 = @empty;
331             gzip_static always;
332           '';
333         };
334       };
335     };
336   };
338   meta = {
339     maintainers = with lib.maintainers; [ dandellion h7x4 ];
340   };