{ config, systemConfig, access, lib, ... }: let inherit (lib.modules) mkIf mkMerge mkOptionDefault; inherit (lib.strings) concatStringsSep; inherit (config.services) nginx; cfg = config.services.promtail; in { config.services.promtail = { configuration = { server = { http_listen_port = mkOptionDefault 9094; grpc_listen_port = mkOptionDefault 0; }; clients = let baseUrl = access.proxyUrlFor {serviceName = "loki";}; in [ { url = "${baseUrl}/loki/api/v1/push"; } ]; scrape_configs = let labels = { system = systemConfig.name; host = config.networking.fqdn; }; in [ { job_name = "${systemConfig.name}-journald"; journal = { #json = true; max_age = "${toString (24 * 7)}h"; labels = mkMerge [ { job = "systemd-journald"; } labels ]; }; relabel_configs = [ { source_labels = ["__journal__systemd_unit"]; target_label = "unit"; } { source_labels = ["__journal_syslog_identifier"]; target_label = "syslog_identifier"; } { source_labels = ["__journal_priority_keyword"]; target_label = "priority_keyword"; } { source_labels = ["__journal_priority"]; target_label = "priority"; } ]; pipeline_stages = let minecraftServer = [ { match = { selector = ''{unit="minecraft-java-server.service"}''; pipeline_name = "minecraft-log4j"; stages = [ { decolorize = {}; } { multiline = { firstline = ''^(\[[^\]]+\]|[0-9A-Z]+:)''; max_wait_time = "2s"; max_lines = 512; }; } { regex.expression = concatStringsSep " " [ ''^\[(?P