at 22.05-pre 4.5 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.runCommandLocal "config.toml" { 100 nativeBuildInputs = [ 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 = literalExpression "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.str; 132 }; 133 134 group = mkOption { 135 default = "influxdb"; 136 description = "Group under which influxdb runs"; 137 type = types.str; 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.tmpfiles.rules = [ 160 "d '${cfg.dataDir}' 0770 ${cfg.user} ${cfg.group} - -" 161 ]; 162 163 systemd.services.influxdb = { 164 description = "InfluxDB Server"; 165 wantedBy = [ "multi-user.target" ]; 166 after = [ "network.target" ]; 167 serviceConfig = { 168 ExecStart = ''${cfg.package}/bin/influxd -config "${configFile}"''; 169 User = cfg.user; 170 Group = cfg.group; 171 }; 172 postStart = 173 let 174 scheme = if configOptions.http.https-enabled then "-k https" else "http"; 175 bindAddr = (ba: if hasPrefix ":" ba then "127.0.0.1${ba}" else "${ba}")(toString configOptions.http.bind-address); 176 in 177 mkBefore '' 178 until ${pkgs.curl.bin}/bin/curl -s -o /dev/null ${scheme}://${bindAddr}/ping; do 179 sleep 1; 180 done 181 ''; 182 }; 183 184 users.users = optionalAttrs (cfg.user == "influxdb") { 185 influxdb = { 186 uid = config.ids.uids.influxdb; 187 group = "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}