at 25.11-pre 4.4 kB view raw
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}