1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6 cfg = config.services.influxdb;
7
8 configOptions = recursiveUpdate {
9 meta = {
10 bind-address = ":8088";
11 commit-timeout = "50ms";
12 dir = "${cfg.dataDir}/meta";
13 election-timeout = "1s";
14 heartbeat-timeout = "1s";
15 hostname = "localhost";
16 leader-lease-timeout = "500ms";
17 retention-autocreate = true;
18 };
19
20 data = {
21 dir = "${cfg.dataDir}/data";
22 wal-dir = "${cfg.dataDir}/wal";
23 max-wal-size = 104857600;
24 wal-enable-logging = true;
25 wal-flush-interval = "10m";
26 wal-partition-flush-delay = "2s";
27 };
28
29 cluster = {
30 shard-writer-timeout = "5s";
31 write-timeout = "5s";
32 };
33
34 retention = {
35 enabled = true;
36 check-interval = "30m";
37 };
38
39 http = {
40 enabled = true;
41 auth-enabled = false;
42 bind-address = ":8086";
43 https-enabled = false;
44 log-enabled = true;
45 pprof-enabled = false;
46 write-tracing = false;
47 };
48
49 monitor = {
50 store-enabled = false;
51 store-database = "_internal";
52 store-interval = "10s";
53 };
54
55 admin = {
56 enabled = true;
57 bind-address = ":8083";
58 https-enabled = false;
59 };
60
61 graphite = [{
62 enabled = false;
63 }];
64
65 udp = [{
66 enabled = false;
67 }];
68
69 collectd = {
70 enabled = false;
71 typesdb = "${pkgs.collectd}/share/collectd/types.db";
72 database = "collectd_db";
73 port = 25826;
74 };
75
76 opentsdb = {
77 enabled = false;
78 };
79
80 continuous_queries = {
81 enabled = true;
82 log-enabled = true;
83 recompute-previous-n = 2;
84 recompute-no-older-than = "10m";
85 compute-runs-per-interval = 10;
86 compute-no-more-than = "2m";
87 };
88
89 hinted-handoff = {
90 enabled = true;
91 dir = "${cfg.dataDir}/hh";
92 max-size = 1073741824;
93 max-age = "168h";
94 retry-rate-limit = 0;
95 retry-interval = "1s";
96 };
97 } cfg.extraConfig;
98
99 configFile = pkgs.runCommand "config.toml" {
100 buildInputs = [ pkgs.remarshal ];
101 } ''
102 remarshal -if json -of toml \
103 < ${pkgs.writeText "config.json" (builtins.toJSON configOptions)} \
104 > $out
105 '';
106in
107{
108
109 ###### interface
110
111 options = {
112
113 services.influxdb = {
114
115 enable = mkOption {
116 default = false;
117 description = "Whether to enable the influxdb server";
118 type = types.bool;
119 };
120
121 package = mkOption {
122 default = pkgs.influxdb;
123 defaultText = "pkgs.influxdb";
124 description = "Which influxdb derivation to use";
125 type = types.package;
126 };
127
128 user = mkOption {
129 default = "influxdb";
130 description = "User account under which influxdb runs";
131 type = types.string;
132 };
133
134 group = mkOption {
135 default = "influxdb";
136 description = "Group under which influxdb runs";
137 type = types.string;
138 };
139
140 dataDir = mkOption {
141 default = "/var/db/influxdb";
142 description = "Data directory for influxd data files.";
143 type = types.path;
144 };
145
146 extraConfig = mkOption {
147 default = {};
148 description = "Extra configuration options for influxdb";
149 type = types.attrs;
150 };
151 };
152
153 };
154
155
156 ###### implementation
157
158 config = mkIf config.services.influxdb.enable {
159
160 systemd.services.influxdb = {
161 description = "InfluxDB Server";
162 wantedBy = [ "multi-user.target" ];
163 after = [ "network-interfaces.target" ];
164 serviceConfig = {
165 ExecStart = ''${cfg.package}/bin/influxd -config "${configFile}"'';
166 User = "${cfg.user}";
167 Group = "${cfg.group}";
168 PermissionsStartOnly = true;
169 };
170 preStart = ''
171 mkdir -m 0770 -p ${cfg.dataDir}
172 if [ "$(id -u)" = 0 ]; then chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir}; fi
173 '';
174 };
175
176 users.extraUsers = optional (cfg.user == "influxdb") {
177 name = "influxdb";
178 uid = config.ids.uids.influxdb;
179 description = "Influxdb daemon user";
180 };
181
182 users.extraGroups = optional (cfg.group == "influxdb") {
183 name = "influxdb";
184 gid = config.ids.gids.influxdb;
185 };
186 };
187
188}