Add minecraft service #30
|
@ -3,6 +3,7 @@
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./services/gitea.nix
|
./services/gitea.nix
|
||||||
|
./services/minecraft.nix
|
||||||
./services/nextcloud.nix
|
./services/nextcloud.nix
|
||||||
./services/webserver.nix
|
./services/webserver.nix
|
||||||
./ids.nix
|
./ids.nix
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
#Minecraft server properties
|
||||||
|
#Thu Apr 08 21:07:16 BST 2021
|
||||||
|
allow-flight=true
|
||||||
|
allow-nether=true
|
||||||
|
broadcast-console-to-ops=true
|
||||||
|
broadcast-rcon-to-ops=true
|
||||||
|
difficulty=normal
|
||||||
|
enable-command-block=false
|
||||||
|
enable-jmx-monitoring=false
|
||||||
|
enable-query=false
|
||||||
|
enable-rcon=false
|
||||||
|
enable-status=true
|
||||||
|
enforce-whitelist=true
|
||||||
|
entity-broadcast-range-percentage=100
|
||||||
|
force-gamemode=false
|
||||||
|
function-permission-level=2
|
||||||
|
gamemode=survival
|
||||||
|
generate-structures=true
|
||||||
|
generator-settings=
|
||||||
|
hardcore=false
|
||||||
|
level-name=world
|
||||||
|
level-seed=
|
||||||
|
level-type=default
|
||||||
|
max-build-height=256
|
||||||
|
max-players=5
|
||||||
|
max-tick-time=-1
|
||||||
|
max-world-size=29999984
|
||||||
|
motd=Minecraft met Kia en die broers
|
||||||
|
network-compression-threshold=256
|
||||||
|
online-mode=true
|
||||||
|
op-permission-level=4
|
||||||
|
player-idle-timeout=0
|
||||||
|
prevent-proxy-connections=false
|
||||||
|
pvp=false
|
||||||
|
query.port=25565
|
||||||
|
rate-limit=0
|
||||||
|
rcon.password=
|
||||||
|
rcon.port=25575
|
||||||
|
resource-pack=
|
||||||
|
resource-pack-sha1=
|
||||||
|
server-ip=
|
||||||
|
server-port=25565
|
||||||
|
snooper-enabled=true
|
||||||
|
spawn-animals=true
|
||||||
|
spawn-monsters=true
|
||||||
|
spawn-npcs=true
|
||||||
|
spawn-protection=1
|
||||||
|
sync-chunk-writes=true
|
||||||
|
text-filtering-config=
|
||||||
|
use-native-transport=true
|
||||||
|
view-distance=10
|
||||||
|
white-list=true
|
94
configuration/services/minecraft.nix
Normal file
94
configuration/services/minecraft.nix
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
minecraft-server-args = [
|
||||||
|
"-Xms2G"
|
||||||
|
"-Xmx2G"
|
||||||
|
"-Dsun.rmi.dgc.server.gcInterval=2157583646"
|
||||||
|
"-XX:+UseG1GC"
|
||||||
|
"-XX:+ParallelRefProcEnabled"
|
||||||
|
"-XX:MaxGCPauseMillis=200"
|
||||||
|
"-XX:+UnlockExperimentalVMOptions"
|
||||||
|
"-XX:+DisableExplicitGC"
|
||||||
|
"-XX:+AlwaysPreTouch"
|
||||||
|
"-XX:G1NewSizePercent=30"
|
||||||
|
"-XX:G1MaxNewSizePercent=40"
|
||||||
|
"-XX:G1HeapRegionSize=8M"
|
||||||
|
"-XX:G1ReservePercent=20"
|
||||||
|
"-XX:G1HeapWastePercent=5"
|
||||||
|
"-XX:G1MixedGCCountTarget=4"
|
||||||
|
"-XX:InitiatingHeapOccupancyPercent=15"
|
||||||
|
"-XX:G1MixedGCLiveThresholdPercent=90"
|
||||||
|
"-XX:G1RSetUpdatingPauseTimePercent=5"
|
||||||
|
"-XX:SurvivorRatio=32"
|
||||||
|
"-XX:+PerfDisableSharedMem"
|
||||||
|
"-XX:MaxTenuringThreshold=1"
|
||||||
|
];
|
||||||
|
ops = pkgs.writeText "ops.json" (builtins.toJSON [{
|
||||||
|
uuid = "140d177a-966f-41b8-a4c0-e305babd291b";
|
||||||
|
name = "TLATER";
|
||||||
|
level = 4;
|
||||||
|
bypassesPlayerLimit = true;
|
||||||
|
}]);
|
||||||
|
whitelist = pkgs.writeText "whitelist.json" (builtins.toJSON [
|
||||||
|
{
|
||||||
|
uuid = "59cd1648-14a4-4bcf-8f5a-2e1bde678f2c";
|
||||||
|
name = "romino25";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
uuid = "0ab6e3d1-544a-47e7-8538-2e6c248e49a4";
|
||||||
|
name = "lasi25";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
uuid = "01c9e737-fc9d-4d55-b8c2-610ca80eb4be";
|
||||||
|
name = "Nampeyo25";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
uuid = "140d177a-966f-41b8-a4c0-e305babd291b";
|
||||||
|
name = "tlater";
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
eula = pkgs.writeText "eula.txt" "eula=true";
|
||||||
|
|
||||||
|
in {
|
||||||
|
nixpkgs.config.allowUnfreePredicate = pkg:
|
||||||
|
builtins.elem (pkgs.lib.getName pkg) [ "forge-server" ];
|
||||||
|
|
||||||
|
virtualisation.oci-containers.containers.minecraft-voor-kia =
|
||||||
|
let properties = ./configs/minecraft/voor-kia/server.properties;
|
||||||
|
in {
|
||||||
|
image = "tlaternet/minecraft-voor-kia";
|
||||||
|
|
||||||
|
imageFile = pkgs.dockerTools.buildImage {
|
||||||
|
name = "tlaternet/minecraft-voor-kia";
|
||||||
|
tag = "latest";
|
||||||
|
contents = [
|
||||||
|
(pkgs.local.forge-server.override {
|
||||||
|
jre_headless = pkgs.jdk11_headless;
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
config = let
|
||||||
|
# Use the upstream minecraft uid
|
||||||
|
uid = toString config.ids.uids.minecraft;
|
||||||
|
gid = toString config.users.groups.nogroup.gid;
|
||||||
|
in {
|
||||||
|
Cmd = [ "forge-server" ] ++ minecraft-server-args;
|
||||||
|
WorkingDir = "/var/lib/minecraft";
|
||||||
|
Volumes = { "/var/lib/minecraft" = { }; };
|
||||||
|
ExposedPorts = { "25565" = { }; };
|
||||||
|
User = "${uid}:${gid}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
autoStart = false;
|
||||||
|
ports = [ "25565:25565" ];
|
||||||
|
volumes = [
|
||||||
|
"minecraft:/var/lib/minecraft"
|
||||||
|
"${properties}:/var/lib/minecraft/server.properties:ro"
|
||||||
|
"${ops}:/var/lib/minecraft/ops.json:ro"
|
||||||
|
"${whitelist}:/var/lib/minecraft/whitelist.json:ro"
|
||||||
|
"${eula}:/var/lib/minecraft/eula.txt:ro"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
24
flake.nix
24
flake.nix
|
@ -76,14 +76,18 @@
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
} // flake-utils.lib.eachDefaultSystem (system: {
|
} // flake-utils.lib.eachDefaultSystem (system:
|
||||||
devShell = with nixpkgs.legacyPackages.${system};
|
let pkgs = import nixpkgs { inherit system overlays; };
|
||||||
mkShell {
|
in {
|
||||||
buildInputs = [ nixfmt git-lfs ];
|
devShell = with pkgs;
|
||||||
shellHook = ''
|
mkShell {
|
||||||
export QEMU_OPTS="-m 3941 -smp 2 -curses"
|
buildInputs = [ nixfmt git-lfs ];
|
||||||
export QEMU_NET_OPTS="hostfwd=::3022-:2222,hostfwd=::3080-:80,hostfwd=::3443-:443,hostfwd=::3021-:2221,hostfwd=::25565-:25565"
|
shellHook = ''
|
||||||
'';
|
export QEMU_OPTS="-m 3941 -smp 2 -curses"
|
||||||
};
|
export QEMU_NET_OPTS="hostfwd=::3022-:2222,hostfwd=::3080-:80,hostfwd=::3443-:443,hostfwd=::3021-:2221,hostfwd=::25565-:25565"
|
||||||
});
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
packages = import ./pkgs { inherit pkgs; };
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
6
pkgs/default.nix
Normal file
6
pkgs/default.nix
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{ pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
# Forge
|
||||||
|
forge-server = pkgs.callPackage ./minecraft/forge-server.nix { };
|
||||||
|
}
|
64
pkgs/minecraft/forge-server.nix
Normal file
64
pkgs/minecraft/forge-server.nix
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
{ lib, stdenv, fetchurl, jre_headless, runtimeShell }:
|
||||||
|
|
||||||
|
let
|
||||||
|
name = "forge-server";
|
||||||
|
version = "1.16.5-36.1.1";
|
||||||
|
mirror = "https://files.minecraftforge.net/maven/net/minecraftforge/forge";
|
||||||
|
src = fetchurl {
|
||||||
|
url = "${mirror}/${version}/forge-${version}-installer.jar";
|
||||||
|
# Forge doesn't seem to like newer shas
|
||||||
|
sha1 = "78e5bd0b19f05136bb25bf3c5be9b64a1d0e850e";
|
||||||
|
};
|
||||||
|
|
||||||
|
unpackCmd = "mkdir -p src; cp $curSrc src/forge-${version}-installer.jar";
|
||||||
|
|
||||||
|
# Somewhat evil pre-install step to run through the network
|
||||||
|
# dependency resolution forge needs. This is also common for gradle
|
||||||
|
# projects, so I think this is ok-ish here, though ideally I'd
|
||||||
|
# identify all the dependencies and package them as well.
|
||||||
|
deps = stdenv.mkDerivation {
|
||||||
|
name = "${name}-deps";
|
||||||
|
inherit src unpackCmd;
|
||||||
|
|
||||||
|
nativeBuildInputs = [ jre_headless ];
|
||||||
|
buildPhase = ''
|
||||||
|
java -jar forge-${version}-installer.jar --installServer installation
|
||||||
|
'';
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out
|
||||||
|
cp -r installation/forge-${version}.jar installation/libraries $out
|
||||||
|
'';
|
||||||
|
|
||||||
|
outputHashAlgo = "sha256";
|
||||||
|
outputHashMode = "recursive";
|
||||||
|
outputHash = "lV4UxmSdv/I+HwvnT8CLcHpSKyDvKnldA5/Lw1GsJ/M=";
|
||||||
|
};
|
||||||
|
|
||||||
|
in stdenv.mkDerivation rec {
|
||||||
|
inherit name version src unpackCmd;
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/{bin,lib/forge}
|
||||||
|
cp -rv ${deps}/* $out/lib/forge/
|
||||||
|
|
||||||
|
cat > $out/bin/forge-server << EOF
|
||||||
|
#!${runtimeShell}
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
exec ${jre_headless}/bin/java \$@ -jar $out'/lib/forge/forge-${version}.jar' nogui
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod +x $out/bin/forge-server
|
||||||
|
'';
|
||||||
|
|
||||||
|
phases = "installPhase";
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = "Forge Minecraft Server";
|
||||||
|
homepage = "https://files.minecraftforge.net/";
|
||||||
|
# Forge itself is open source, but this package pulls in
|
||||||
|
# minecraft.
|
||||||
|
license = licenses.unfreeRedistributable;
|
||||||
|
platforms = platforms.unix;
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in a new issue