1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6 cfg = config.services.minecraft-server;
7in
8{
9 options = {
10 services.minecraft-server = {
11
12 enable = mkOption {
13 type = types.bool;
14 default = false;
15 description = ''
16 If enabled, start a Minecraft Server. The listening port for
17 the server is always <literal>25565</literal>. The server
18 data will be loaded from and saved to
19 <literal>${cfg.dataDir}</literal>.
20 '';
21 };
22
23 dataDir = mkOption {
24 type = types.path;
25 default = "/var/lib/minecraft";
26 description = ''
27 Directory to store minecraft database and other state/data files.
28 '';
29 };
30
31 openFirewall = mkOption {
32 type = types.bool;
33 default = false;
34 description = ''
35 Whether to open ports in the firewall (if enabled) for the server.
36 '';
37 };
38
39 jvmOpts = mkOption {
40 type = types.str;
41 default = "-Xmx2048M -Xms2048M";
42 description = "JVM options for the Minecraft Service.";
43 };
44 };
45 };
46
47 config = mkIf cfg.enable {
48 users.extraUsers.minecraft = {
49 description = "Minecraft Server Service user";
50 home = cfg.dataDir;
51 createHome = true;
52 uid = config.ids.uids.minecraft;
53 };
54
55 systemd.services.minecraft-server = {
56 description = "Minecraft Server Service";
57 wantedBy = [ "multi-user.target" ];
58 after = [ "network.target" ];
59
60 serviceConfig.Restart = "always";
61 serviceConfig.User = "minecraft";
62 script = ''
63 cd ${cfg.dataDir}
64 exec ${pkgs.minecraft-server}/bin/minecraft-server ${cfg.jvmOpts}
65 '';
66 };
67
68 networking.firewall = mkIf cfg.openFirewall {
69 allowedUDPPorts = [ 25565 ];
70 allowedTCPPorts = [ 25565 ];
71 };
72 };
73}