grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / home-automation / evcc.nix
bloba952437b1b56ef3cd68b66273aafd113b3c68dc8
1 { lib
2 , pkgs
3 , config
4 , ...
5 }:
7 with lib;
9 let
10   cfg = config.services.evcc;
12   format = pkgs.formats.yaml {};
13   configFile = format.generate "evcc.yml" cfg.settings;
15   package = pkgs.evcc;
19   meta.maintainers = with lib.maintainers; [ hexa ];
21   options.services.evcc = with types; {
22     enable = mkEnableOption "EVCC, the extensible EV Charge Controller with PV integration";
24     extraArgs = mkOption {
25       type = listOf str;
26       default = [];
27       description = ''
28         Extra arguments to pass to the evcc executable.
29       '';
30     };
32     settings = mkOption {
33       type = format.type;
34       description = ''
35         evcc configuration as a Nix attribute set.
37         Check for possible options in the sample [evcc.dist.yaml](https://github.com/andig/evcc/blob/${package.version}/evcc.dist.yaml].
38       '';
39     };
40   };
42   config = mkIf cfg.enable {
43     systemd.services.evcc = {
44       wants = [ "network-online.target" ];
45       after = [
46         "network-online.target"
47         "mosquitto.target"
48       ];
49       wantedBy = [
50         "multi-user.target"
51       ];
52       environment.HOME = "/var/lib/evcc";
53       path = with pkgs; [
54         getent
55       ];
56       serviceConfig = {
57         ExecStart = "${package}/bin/evcc --config ${configFile} ${escapeShellArgs cfg.extraArgs}";
58         CapabilityBoundingSet = [ "" ];
59         DeviceAllow = [
60           "char-ttyUSB"
61         ];
62         DevicePolicy = "closed";
63         DynamicUser = true;
64         LockPersonality = true;
65         MemoryDenyWriteExecute = true;
66         Restart = "on-failure";
67         RestrictAddressFamilies = [
68           "AF_INET"
69           "AF_INET6"
70           "AF_UNIX"
71         ];
72         RestrictNamespaces = true;
73         RestrictRealtime = true;
74         PrivateTmp = true;
75         PrivateUsers = true;
76         ProcSubset = "pid";
77         ProtectClock = true;
78         ProtectControlGroups= true;
79         ProtectHome = true;
80         ProtectHostname = true;
81         ProtectKernelLogs = true;
82         ProtectKernelModules = true;
83         ProtectKernelTunables = true;
84         ProtectProc = "invisible";
85         StateDirectory = "evcc";
86         SystemCallArchitectures = "native";
87         SystemCallFilter = [
88           "@system-service"
89           "~@privileged"
90         ];
91         UMask = "0077";
92         User = "evcc";
93       };
94     };
95   };
97   meta.buildDocsInSandbox = false;