-
Notifications
You must be signed in to change notification settings - Fork 1
/
default.nix
99 lines (81 loc) · 2.65 KB
/
default.nix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# NOTE: this works for
{ config, lib, pkgs, ... }:
let
inherit (lib) mkIf mkOption mkEnableOption types;
cfg = config.modules.services.valheim;
updateCmd = ''${pkgs.steamcmd}/bin/steamcmd \
+login anonymous \
+force_install_dir $STATE_DIRECTORY \
+app_update 896660 \
+quit'';
startCmd = ''${pkgs.glibc}/lib/ld-linux-x86-64.so.2 ./valheim_server.x86_64 \
-name "${cfg.serverName}" \
-port ${toString cfg.port} \
-world "${cfg.worldName}" \
-password "${cfg.password}" \
-public 1'';
in
{
##### interface
options = {
modules.services.valheim.enable = mkEnableOption "Enable valheim-server nixos module";
modules.services.valheim.serverName = mkOption {
type = types.str;
example = "ValheimRocks";
description = "Name of the valheim server.";
};
modules.services.valheim.worldName = mkOption {
type = types.str;
example = "MyFirstWorld";
description = "Name of the valheim world.";
};
modules.services.valheim.password = mkOption {
type = types.str;
description = "Password used to authenticate to the server.";
};
modules.services.valheim.port = mkOption {
type = types.int;
description = "Port on which valheim server listens for connections.";
};
};
##### implementation
config = mkIf cfg.enable {
users.users.valheim.home = "/var/lib/valheim";
systemd.services.valheim = {
# linux64 directory is required by Valheim.
environment.LD_LIBRARY_PATH = "linux64:${pkgs.glibc}/lib";
serviceConfig = {
User = "valheim";
ExecStartPre = updateCmd;
ExecStart = startCmd;
Nice = "-5";
Restart = "always";
StateDirectory = "valheim";
WorkingDirectory = "/var/lib/valheim";
};
wantedBy = [ "multi-user.target" ];
};
systemd.services.update-valheim = {
serviceConfig = {
Type = "oneshot";
User = "valheim";
StateDirectory = "valheim";
WorkingDirectory = "/var/lib/valheim";
};
script = ''
OUTPUT="$(${updateCmd} | tail -n 1)"
SUCCESS="Success! App '896660' already up to date."
if ! [[ $OUTPUT == $SUCCESS ]]; then
echo "Restarting valheim"
systemctl restart valheim.service
fi
'';
wantedBy = [ "multi-user.target" ];
};
systemd.timers.update-valheim = {
partOf = [ "update-valheim.service" ];
timerConfig.OnCalendar = "*-*-* 8:00:00";
wantedBy = [ "timers.target" ];
};
};
}