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