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-data}/share/collectd/types.db";
72 database = "collectd_db";
73 bind-address = ":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 preferLocalBuild = true;
102 } ''
103 remarshal -if json -of toml \
104 < ${pkgs.writeText "config.json" (builtins.toJSON configOptions)} \
105 > $out
106 '';
107in
108{
109
110 ###### interface
111
112 options = {
113
114 services.influxdb = {
115
116 enable = mkOption {
117 default = false;
118 description = "Whether to enable the influxdb server";
119 type = types.bool;
120 };
121
122 package = mkOption {
123 default = pkgs.influxdb;
124 defaultText = "pkgs.influxdb";
125 description = "Which influxdb derivation to use";
126 type = types.package;
127 };
128
129 user = mkOption {
130 default = "influxdb";
131 description = "User account under which influxdb runs";
132 type = types.str;
133 };
134
135 group = mkOption {
136 default = "influxdb";
137 description = "Group under which influxdb runs";
138 type = types.str;
139 };
140
141 dataDir = mkOption {
142 default = "/var/db/influxdb";
143 description = "Data directory for influxd data files.";
144 type = types.path;
145 };
146
147 extraConfig = mkOption {
148 default = {};
149 description = "Extra configuration options for influxdb";
150 type = types.attrs;
151 };
152 };
153 };
154
155
156 ###### implementation
157
158 config = mkIf config.services.influxdb.enable {
159
160 systemd.tmpfiles.rules = [
161 "d '${cfg.dataDir}' 0770 ${cfg.user} ${cfg.group} - -"
162 ];
163
164 systemd.services.influxdb = {
165 description = "InfluxDB Server";
166 wantedBy = [ "multi-user.target" ];
167 after = [ "network.target" ];
168 serviceConfig = {
169 ExecStart = ''${cfg.package}/bin/influxd -config "${configFile}"'';
170 User = cfg.user;
171 Group = cfg.group;
172 };
173 postStart =
174 let
175 scheme = if configOptions.http.https-enabled then "-k https" else "http";
176 bindAddr = (ba: if hasPrefix ":" ba then "127.0.0.1${ba}" else "${ba}")(toString configOptions.http.bind-address);
177 in
178 mkBefore ''
179 until ${pkgs.curl.bin}/bin/curl -s -o /dev/null ${scheme}://${bindAddr}/ping; do
180 sleep 1;
181 done
182 '';
183 };
184
185 users.users = optionalAttrs (cfg.user == "influxdb") {
186 influxdb = {
187 uid = config.ids.uids.influxdb;
188 description = "Influxdb daemon user";
189 };
190 };
191
192 users.groups = optionalAttrs (cfg.group == "influxdb") {
193 influxdb.gid = config.ids.gids.influxdb;
194 };
195 };
196
197}