silx: 2.1.1 -> 2.1.2 (#361612)
[NixPkgs.git] / nixos / modules / services / logging / promtail.nix
blobd6038055c05c6c10e905669c1cd6d2a4280232e7
1 { config, lib, pkgs, ... }: with lib;
2 let
3   cfg = config.services.promtail;
5   prettyJSON = conf: pkgs.runCommandLocal "promtail-config.json" {} ''
6     echo '${builtins.toJSON conf}' | ${pkgs.buildPackages.jq}/bin/jq 'del(._module)' > $out
7   '';
9   allowSystemdJournal = cfg.configuration ? scrape_configs && lib.any (v: v ? journal) cfg.configuration.scrape_configs;
11   allowPositionsFile = !lib.hasPrefix "/var/cache/promtail" positionsFile;
12   positionsFile = cfg.configuration.positions.filename;
14   configFile = if cfg.configFile != null
15                    then cfg.configFile
16                    else prettyJSON cfg.configuration;
18 in {
19   options.services.promtail = with types; {
20     enable = mkEnableOption "the Promtail ingresser";
22     configuration = mkOption {
23       type = (pkgs.formats.json {}).type;
24       description = ''
25         Specify the configuration for Promtail in Nix.
26         This option will be ignored if `services.promtail.configFile` is defined.
27       '';
28     };
30     configFile = mkOption {
31       type = nullOr path;
32       default = null;
33       description = ''
34         Config file path for Promtail.
35         If this option is defined, the value of `services.promtail.configuration` will be ignored.
36       '';
37     };
39     extraFlags = mkOption {
40       type = listOf str;
41       default = [];
42       example = [ "--server.http-listen-port=3101" ];
43       description = ''
44         Specify a list of additional command line flags,
45         which get escaped and are then passed to Loki.
46       '';
47     };
48   };
50   config = mkIf cfg.enable {
51     services.promtail.configuration.positions.filename = mkDefault "/var/cache/promtail/positions.yaml";
53     systemd.services.promtail = {
54       description = "Promtail log ingress";
55       wantedBy = [ "multi-user.target" ];
56       stopIfChanged = false;
58       preStart = ''
59         ${lib.getExe pkgs.promtail} -config.file=${configFile} -check-syntax
60       '';
62       serviceConfig = {
63         Restart = "on-failure";
64         TimeoutStopSec = 10;
66         ExecStart = "${pkgs.promtail}/bin/promtail -config.file=${configFile} ${escapeShellArgs cfg.extraFlags}";
68         ProtectSystem = "strict";
69         ProtectHome = true;
70         PrivateTmp = true;
71         PrivateDevices = true;
72         ProtectKernelTunables = true;
73         ProtectControlGroups = true;
74         RestrictSUIDSGID = true;
75         PrivateMounts = true;
76         CacheDirectory = "promtail";
77         ReadWritePaths = lib.optional allowPositionsFile (builtins.dirOf positionsFile);
79         User = "promtail";
80         Group = "promtail";
82         CapabilityBoundingSet = "";
83         NoNewPrivileges = true;
85         ProtectKernelModules = true;
86         SystemCallArchitectures = "native";
87         ProtectKernelLogs = true;
88         ProtectClock = true;
90         LockPersonality = true;
91         ProtectHostname = true;
92         RestrictRealtime = true;
93         MemoryDenyWriteExecute = true;
94         PrivateUsers = true;
96         SupplementaryGroups = lib.optional (allowSystemdJournal) "systemd-journal";
97       } // (optionalAttrs (!pkgs.stdenv.hostPlatform.isAarch64) { # FIXME: figure out why this breaks on aarch64
98         SystemCallFilter = "@system-service";
99       });
100     };
102     users.groups.promtail = {};
103     users.users.promtail = {
104       description = "Promtail service user";
105       isSystemUser = true;
106       group = "promtail";
107     };
108   };