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 } ''
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 ###### implementation
156
157 config = mkIf config.services.influxdb.enable {
158
159 systemd.services.influxdb = {
160 description = "InfluxDB Server";
161 wantedBy = [ "multi-user.target" ];
162 after = [ "network.target" ];
163 serviceConfig = {
164 ExecStart = ''${cfg.package}/bin/influxd -config "${configFile}"'';
165 User = "${cfg.user}";
166 Group = "${cfg.group}";
167 PermissionsStartOnly = true;
168 };
169 preStart = ''
170 mkdir -m 0770 -p ${cfg.dataDir}
171 if [ "$(id -u)" = 0 ]; then chown -R ${cfg.user}:${cfg.group} ${cfg.dataDir}; fi
172 '';
173 postStart = mkBefore ''
174 until ${pkgs.curl.bin}/bin/curl -s -o /dev/null 'http://127.0.0.1${toString configOptions.http.bind-address}'/ping; do
175 sleep 1;
176 done
177 '';
178 };
179
180 users.extraUsers = optional (cfg.user == "influxdb") {
181 name = "influxdb";
182 uid = config.ids.uids.influxdb;
183 description = "Influxdb daemon user";
184 };
185
186 users.extraGroups = optional (cfg.group == "influxdb") {
187 name = "influxdb";
188 gid = config.ids.gids.influxdb;
189 };
190 };
191
192}