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