{ config, pkgs, lib, ... }: 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 (lib.getName pkg) [ "forge-server" ]; virtualisation.oci-containers.containers.minecraft-voor-kia = let properties = ./configs/minecraft/voor-kia/server.properties; icon = ./configs/minecraft/voor-kia/server-icon.png; 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; mods = pkgs.local.voor-kia; modConfig = ./configs/minecraft/voor-kia/config; defaultconfigs = ./configs/minecraft/voor-kia/defaultconfigs; }) ]; 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" = { }; # Required because some things will try to write to /tmp, # which doesn't exist if it's not defined as a volume. "/tmp" = { }; }; ExposedPorts = { "25565" = { }; }; User = "${uid}:${gid}"; }; }; autoStart = false; extraOptions = [ "-i" ]; ports = [ "25565:25565" ]; volumes = [ "minecraft:/var/lib/minecraft" "${eula}:/var/lib/minecraft/eula.txt:ro" "${icon}:/var/lib/minecraft/server-icon.png:ro" "${ops}:/var/lib/minecraft/ops.json:ro" "${properties}:/var/lib/minecraft/server.properties:ro" "${whitelist}:/var/lib/minecraft/whitelist.json:ro" ]; }; systemd.services.restart-minecraft-voor-kia = { script = '' #!${pkgs.runtimeShell} set -eu ${pkgs.systemd}/bin/systemctl try-restart podman-minecraft-voor-kia.service ''; }; systemd.timers.restart-minecraft-voor-kia = { requiredBy = [ "podman-minecraft-voor-kia.service" ]; timerConfig = { OnCalendar = "daily"; }; }; }