nixos/services/dr-server.nix

73 lines
2.4 KiB
Nix
Raw Normal View History

{ config, pkgs, lib, ... }:
let
wine = pkgs.wineWow64Packages.stable;
dataDir = "/var/lib/dr-server";
buildDir = "${dataDir}/Build";
prefix = "${dataDir}/wine";
logDir = "${dataDir}/log";
in
{
config = lib.mkIf (config.networking.hostName == "FredOS-Mediaserver") {
users.users.dr-server = {
isSystemUser = true;
group = "dr-server";
home = dataDir;
description = "Dungeon Runners Reborn server";
};
users.groups.dr-server = {};
systemd.tmpfiles.rules = [
"d ${dataDir} 0750 dr-server dr-server -"
"d ${buildDir} 0750 dr-server dr-server -"
"d ${prefix} 0750 dr-server dr-server -"
"d ${logDir} 0750 dr-server dr-server -"
];
## <----- DUNGEON RUNNERS REBORN ----> ##
# Windows-only Unity build run headless under Wine. Initializes a
# Win64 prefix on first boot via wineboot, then launches the exe
# with Unity's batch flags. Only the friend's exe is in this tree —
# the matching client is needed on connecting machines.
systemd.services.dr-server = {
description = "Dungeon Runners Reborn (Wine, headless Unity)";
after = [ "network-online.target" ];
wants = [ "network-online.target" ];
wantedBy = [ "multi-user.target" ];
path = [ wine pkgs.coreutils ];
environment = {
WINEPREFIX = prefix;
WINEARCH = "win64";
WINEDEBUG = "-all";
HOME = dataDir;
};
preStart = ''
if [ ! -f "${prefix}/system.reg" ]; then
${wine}/bin/wineboot --init
${wine}/bin/wineserver -w
fi
'';
unitConfig.ConditionPathExists = "${buildDir}/DR_Server.exe";
serviceConfig = {
Type = "simple";
User = "dr-server";
Group = "dr-server";
WorkingDirectory = buildDir;
# Unity's Win64 build still tries to create a 1x1 hidden window
# via Win32 even with -batchmode -nographics, and Wine needs a
# real X display for that — fails with "Failed to create batch
# mode window: Success." otherwise. xvfb-run gives it one.
ExecStart = "${pkgs.xvfb-run}/bin/xvfb-run -a ${wine}/bin/wine64 DR_Server.exe -batchmode -nographics -logFile ${logDir}/server.log";
Restart = "on-failure";
RestartSec = "10s";
};
};
networking.firewall.allowedTCPPorts = [ 2110 2603 2604 2605 2606 ];
networking.firewall.allowedUDPPorts = [ 2110 2603 2604 2605 2606 ];
};
}