at 17.09-beta 4.4 kB view raw
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}