{ config, lib, libNginx, this, ... }: let cfg = config.nixfiles.modules.loki; in { options.nixfiles.modules.loki = { enable = lib.mkEnableOption "Loki"; port = lib.mkOption { description = "Port."; type = lib.types.port; default = 30171; }; domain = lib.mkOption { description = "Domain name sans protocol scheme."; type = lib.types.str; default = "loki.${config.networking.domain}"; }; }; config = lib.mkIf cfg.enable { ark.directories = [ config.services.loki.configuration.common.path_prefix ]; nixfiles.modules.nginx = { enable = true; upstreams.loki.servers."127.0.0.1:${toString cfg.port}" = { }; virtualHosts.${cfg.domain} = { locations = { "/".proxyPass = "http://loki"; # "/loki".extraConfig = '' # rewrite ^/loki/(.*)$ /$1 break; # ''; }; extraConfig = libNginx.config.internalOnly; }; }; services.loki = { enable = true; configuration = rec { auth_enabled = false; server = { http_listen_address = "127.0.0.1"; http_listen_port = cfg.port; grpc_listen_address = "0.0.0.0"; grpc_listen_port = server.http_listen_port + 1; log_format = "logfmt"; log_level = "warn"; log_source_ips_enabled = true; }; common = { path_prefix = config.services.loki.dataDir; storage.filesystem = { chunks_directory = "${common.path_prefix}/chunks"; rules_directory = "${common.path_prefix}/rules"; }; replication_factor = 1; ring = { instance_addr = "127.0.0.1"; kvstore.store = "memberlist"; }; }; memberlist = { bind_port = 7946; message_history_buffer_bytes = lib.pow 2 13; }; compactor = { working_directory = "${common.path_prefix}/compactor"; retention_enabled = true; retention_delete_delay = "1h"; retention_delete_worker_count = 64; delete_request_store = "filesystem"; }; ruler = { enable_api = true; storage = { type = "local"; local.directory = common.storage.filesystem.rules_directory; }; }; limits_config = { max_streams_per_user = 0; max_global_streams_per_user = 0; max_query_series = 4096; retention_period = "14d"; deletion_mode = "filter-and-delete"; }; schema_config.configs = [ { from = "2025-01-01"; object_store = "filesystem"; store = "tsdb"; schema = "v13"; index = { prefix = "index_"; period = "24h"; }; } ]; analytics.reporting_enabled = false; }; }; environment.etc."alloy/loki.alloy".text = '' prometheus.scrape "loki" { targets = [ { __address__ = "127.0.0.1:${toString cfg.port}", instance = "${config.networking.hostName}", }, ] forward_to = [prometheus.relabel.default.receiver] } ''; systemd.services.alloy.reloadTriggers = [ config.environment.etc."alloy/loki.alloy".source ]; topology.nodes.${this.hostname}.services.loki.info = cfg.domain; }; }