diff --git a/configs/nixos/guests/minecraft.nix b/configs/nixos/guests/minecraft.nix new file mode 100644 index 0000000..bd800a0 --- /dev/null +++ b/configs/nixos/guests/minecraft.nix @@ -0,0 +1,48 @@ +{ + config, + lib, + ... +}: +let + cfg = config.guests.minecraft; + minecraftUid = config.registry."stable-uid".${config.networking.hostName}.minecraft; +in +{ + options.guests.minecraft.statePath = lib.mkOption { + type = lib.types.nullOr lib.types.str; + default = null; + example = "/srv/minecraft/main"; + description = "Host path bind-mounted as Minecraft's durable server state."; + }; + + config = lib.mkIf cfg.enable { + assertions = [ + { + assertion = cfg.statePath != null; + message = "guests.minecraft.statePath must point at the host directory that stores Minecraft state."; + } + ]; + + registry."stable-uid".${config.networking.hostName}.minecraft = 20008; + + guests.minecraft = { + interior = { + modules.services.games.minecraft.enable = true; + users.users.minecraft.uid = minecraftUid; + }; + + mounts."/data" = { + directory = cfg.statePath; + owner = minecraftUid; + group = "storage"; + mode = "0770"; + }; + + limits = { + memory = lib.mkDefault "5G"; + cpu = lib.mkDefault "400%"; + tasksMax = lib.mkDefault 1024; + }; + }; + }; +} diff --git a/configs/nixos/hosts/pikachu/default.nix b/configs/nixos/hosts/pikachu/default.nix index 17417f4..e0ab23c 100644 --- a/configs/nixos/hosts/pikachu/default.nix +++ b/configs/nixos/hosts/pikachu/default.nix @@ -58,6 +58,12 @@ }; }; + guests.minecraft = { + enable = true; + vlan = 20; + statePath = "/pikachu/media/games/servers/minecraft/main"; + }; + guests.palworld = { enable = true; vlan = 20; diff --git a/configs/nixos/modules/services/games/minecraft.nix b/configs/nixos/modules/services/games/minecraft.nix new file mode 100644 index 0000000..0483a1d --- /dev/null +++ b/configs/nixos/modules/services/games/minecraft.nix @@ -0,0 +1,42 @@ +{ + config, + inputs, + lib, + pkgs, + ... +}: +{ + imports = [ inputs.nix-minecraft.nixosModules.minecraft-servers ]; + + options.modules.services.games.minecraft.enable = lib.mkEnableOption "Fabric Minecraft server"; + + config = lib.mkIf config.modules.services.games.minecraft.enable { + nixpkgs.overlays = [ inputs.nix-minecraft.overlays.default ]; + + services.minecraft-servers = { + enable = true; + eula = true; + openFirewall = true; + dataDir = "/data"; + + managementSystem = { + tmux.enable = false; + systemd-socket.enable = true; + }; + + servers.main = { + enable = true; + package = pkgs.fabricServers.fabric-1_21_1; + jvmOpts = [ + "-Xms1G" + "-Xmx4G" + ]; + serverProperties = { + "enable-rcon" = false; + "online-mode" = true; + "white-list" = false; + }; + }; + }; + }; +} diff --git a/configs/nixos/registry/stable-uid.nix b/configs/nixos/registry/stable-uid.nix index 06f821b..2d483a8 100644 --- a/configs/nixos/registry/stable-uid.nix +++ b/configs/nixos/registry/stable-uid.nix @@ -12,7 +12,7 @@ let in { - # Next stable UID: 20007 + # Next stable UID: 20009 type = lib.types.ints.positive; diff --git a/flake.lock b/flake.lock index db3f5a5..47dae56 100644 --- a/flake.lock +++ b/flake.lock @@ -147,6 +147,22 @@ "type": "github" } }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1747046372, + "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": [ @@ -337,6 +353,28 @@ "type": "github" } }, + "nix-minecraft": { + "inputs": { + "flake-compat": "flake-compat", + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems" + }, + "locked": { + "lastModified": 1793597892, + "narHash": "sha256-uyZuURB0yrD2yCSfCLAtCdB6EYlf0oGRCaYMnOFO36c=", + "owner": "Infinidoge", + "repo": "nix-minecraft", + "rev": "87ca2dedb204ecf30ae060beaea10b986ab92dd9", + "type": "github" + }, + "original": { + "owner": "Infinidoge", + "repo": "nix-minecraft", + "type": "github" + } + }, "nixos-hardware": { "inputs": { "nixpkgs": [ @@ -424,7 +462,7 @@ "nixpkgs": [ "nixpkgs" ], - "systems": "systems" + "systems": "systems_2" }, "locked": { "lastModified": 1792012326, @@ -473,6 +511,7 @@ "gitea-axi": "gitea-axi", "home-manager": "home-manager_3", "nix-flatpak": "nix-flatpak", + "nix-minecraft": "nix-minecraft", "nixos-hardware": "nixos-hardware", "nixpkgs": "nixpkgs_2", "nixpkgs-stable": "nixpkgs-stable", @@ -516,7 +555,7 @@ "nixpkgs" ], "nur": "nur", - "systems": "systems_2", + "systems": "systems_3", "tinted-kitty": "tinted-kitty", "tinted-schemes": "tinted-schemes", "tinted-tmux": "tinted-tmux", @@ -537,6 +576,21 @@ } }, "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { "flake": false, "locked": { "lastModified": 1791244623, @@ -553,7 +607,7 @@ "type": "github" } }, - "systems_2": { + "systems_3": { "locked": { "lastModified": 1774449309, "narHash": "sha256-brhZ8DmuGtzkCYHJg4HEd602amKm89Y9ytsFZ5uWD1w=", diff --git a/flake.nix b/flake.nix index 941303f..ce763af 100644 --- a/flake.nix +++ b/flake.nix @@ -19,6 +19,12 @@ # Installs Flatpak applications declaratively. nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=v0.7.0"; + # Packages reproducible Minecraft servers and modpacks. + nix-minecraft = { + url = "github:Infinidoge/nix-minecraft"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + # Provides signed AMO extensions pinned by version and hash. firefox-addons = { url = "gitlab:rycee/nur-expressions?dir=pkgs/firefox-addons";