1{ config, pkgs, lib, ... }:
2with lib;
3let
4 cfg = config.services.vmagent;
5 settingsFormat = pkgs.formats.json { };
6in {
7 options.services.vmagent = {
8 enable = mkEnableOption (lib.mdDoc "vmagent");
9
10 user = mkOption {
11 default = "vmagent";
12 type = types.str;
13 description = lib.mdDoc ''
14 User account under which vmagent runs.
15 '';
16 };
17
18 group = mkOption {
19 type = types.str;
20 default = "vmagent";
21 description = lib.mdDoc ''
22 Group under which vmagent runs.
23 '';
24 };
25
26 package = mkOption {
27 default = pkgs.vmagent;
28 defaultText = lib.literalMD "pkgs.vmagent";
29 type = types.package;
30 description = lib.mdDoc ''
31 vmagent package to use.
32 '';
33 };
34
35 dataDir = mkOption {
36 type = types.str;
37 default = "/var/lib/vmagent";
38 description = lib.mdDoc ''
39 The directory where vmagent stores its data files.
40 '';
41 };
42
43 remoteWriteUrl = mkOption {
44 default = "http://localhost:8428/api/v1/write";
45 type = types.str;
46 description = lib.mdDoc ''
47 The storage endpoint such as VictoriaMetrics
48 '';
49 };
50
51 prometheusConfig = mkOption {
52 type = lib.types.submodule { freeformType = settingsFormat.type; };
53 description = lib.mdDoc ''
54 Config for prometheus style metrics
55 '';
56 };
57
58 openFirewall = mkOption {
59 type = types.bool;
60 default = false;
61 description = lib.mdDoc ''
62 Whether to open the firewall for the default ports.
63 '';
64 };
65 };
66
67 config = mkIf cfg.enable {
68 users.groups = mkIf (cfg.group == "vmagent") { vmagent = { }; };
69
70 users.users = mkIf (cfg.user == "vmagent") {
71 vmagent = {
72 group = cfg.group;
73 description = "vmagent daemon user";
74 home = cfg.dataDir;
75 isSystemUser = true;
76 };
77 };
78
79 networking.firewall.allowedTCPPorts = mkIf cfg.openFirewall [ 8429 ];
80
81 systemd.services.vmagent = let
82 prometheusConfig = settingsFormat.generate "prometheusConfig.yaml" cfg.prometheusConfig;
83 in {
84 wantedBy = [ "multi-user.target" ];
85 after = [ "network.target" ];
86 description = "vmagent system service";
87 serviceConfig = {
88 User = cfg.user;
89 Group = cfg.group;
90 Type = "simple";
91 Restart = "on-failure";
92 WorkingDirectory = cfg.dataDir;
93 ExecStart = "${cfg.package}/bin/vmagent -remoteWrite.url=${cfg.remoteWriteUrl} -promscrape.config=${prometheusConfig}";
94 };
95 };
96
97 systemd.tmpfiles.rules =
98 [ "d '${cfg.dataDir}' 0755 ${cfg.user} ${cfg.group} -" ];
99 };
100}