{ config, pkgs, name, ... }: # Initialization # CREATE INDEX ON LOGS (tag); # CREATE INDEX ON LOGS (time); # CREATE INDEX ON LOGS (((data->>'PRIORITY')::int)); # CREATE INDEX ON LOGS ((data->>'_SYSTEMD_UNIT')); # CREATE INDEX ON LOGS ((data->>'SYSLOG_IDENTIFIER')); let fluent-bit-config = { pipeline = { inputs = [ { name = "systemd"; tag = "${name}.systemd"; DB = "/var/lib/fluentbit/fluent-bit.db"; } ]; outputs = [ { name = "loki"; match = "${name}.systemd"; line_format = "json"; labels = "job=fluentbit, server=${name}, priority=$PRIORITY, syslog_identifier=$SYSLOG_IDENTIFIER, systemd_unit=$_SYSTEMD_UNIT"; } { name = "pgsql"; match = "*"; host = "/run/postgresql"; user = "fluentbit"; table = "logs"; database = "fluentbit"; timestamp_key = "event_timestamp"; } ]; }; }; yamlFormat = pkgs.formats.yaml {}; psqlVersion = pkgs.postgresql_13.psqlSchema; in { disko.devices.zpool.zfast.datasets."root/persist/var/lib/loki" = { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/loki"; options.mountpoint = "legacy"; }; disko.devices.zpool.zfast.datasets."root/persist/var/lib/fluentbit" = { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/fluentbit"; options.mountpoint = "legacy"; }; disko.devices.zpool.zfast.datasets."root/persist/var/lib/postgresql" = { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/postgresql"; options.mountpoint = "legacy"; }; disko.devices.zpool.zfast.datasets."root/persist/var/lib/postgresql/${psqlVersion}" = { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/postgresql/${psqlVersion}"; options.mountpoint = "legacy"; }; environment.persistence."/persist/zfast".directories = [ { directory = "/var/lib/postgresql"; user = config.users.users.postgres.name; group = config.users.users.postgres.group; mode = "0755"; } { directory = "/var/lib/fluentbit"; user = config.users.users.fluentbit.name; group = config.users.users.fluentbit.group; mode = "0755"; } { directory = "/var/lib/loki"; user = config.users.users.loki.name; group = config.users.users.loki.group; mode = "0755"; } ]; ids.uids.fluentbit = 500; ids.gids.fluentbit = 500; users.users.fluentbit = { name = "fluentbit"; home = "/var/lib/fluentbit"; uid = config.ids.uids.fluentbit; group = "fluentbit"; isSystemUser = true; extraGroups = [ "systemd-journal" ]; }; users.groups.fluentbit.gid = config.ids.gids.fluentbit; services.loki = { enable = true; configuration = { auth_enabled = false; common = { ring.kvstore.store = "inmemory"; ring.instance_addr = "127.0.0.1"; replication_factor = 1; path_prefix = "/var/lib/loki"; }; server.log_level = "warn"; limits_config = { reject_old_samples = false; ingestion_rate_mb = 100; ingestion_burst_size_mb = 200; per_stream_rate_limit = "100MB"; per_stream_rate_limit_burst = "200MB"; }; schema_config.configs = [ { from = "2020-10-24"; store = "boltdb-shipper"; object_store = "filesystem"; schema = "v11"; index.prefix = "index_"; index.period = "24h"; } ]; }; }; services.postgresql = { enable = true; package = pkgs.postgresql_13; ensureDatabases = [ "fluentbit" ]; ensureUsers = [ { name = "fluentbit"; ensurePermissions."DATABASE \"fluentbit\"" = "ALL PRIVILEGES"; } ]; }; environment.systemPackages = [ pkgs.fluent-bit ]; systemd.services.fluent-bit = { description = "Fluent-bit daemon"; wantedBy = [ "multi-user.target" ]; serviceConfig = { ExecStart = "${pkgs.fluent-bit}/bin/fluent-bit -c ${yamlFormat.generate "fluent.yaml" fluent-bit-config}"; User = "fluentbit"; Group = "fluentbit"; SupplementaryGroups = [ "systemd-journal" ]; }; }; }