grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / misc / redlib.nix
blob0da85df46bf72bb87e84f84539d8647b7c2d4391
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
6   cfg = config.services.redlib;
8   args = concatStringsSep " " ([
9     "--port ${toString cfg.port}"
10     "--address ${cfg.address}"
11   ]);
14   imports = [
15     (mkRenamedOptionModule [ "services" "libreddit" ] [ "services" "redlib" ])
16   ];
18   options = {
19     services.redlib = {
20       enable = mkEnableOption "Private front-end for Reddit";
22       package = mkPackageOption pkgs "redlib" { };
24       address = mkOption {
25         default = "0.0.0.0";
26         example = "127.0.0.1";
27         type =  types.str;
28         description = "The address to listen on";
29       };
31       port = mkOption {
32         default = 8080;
33         example = 8000;
34         type = types.port;
35         description = "The port to listen on";
36       };
38       openFirewall = mkOption {
39         type = types.bool;
40         default = false;
41         description = "Open ports in the firewall for the redlib web interface";
42       };
44     };
45   };
47   config = mkIf cfg.enable {
48     systemd.services.redlib = {
49         description = "Private front-end for Reddit";
50         wantedBy = [ "multi-user.target" ];
51         after = [ "network.target" ];
52         serviceConfig = {
53           DynamicUser = true;
54           ExecStart = "${lib.getExe cfg.package} ${args}";
55           AmbientCapabilities = lib.mkIf (cfg.port < 1024) [ "CAP_NET_BIND_SERVICE" ];
56           Restart = "on-failure";
57           RestartSec = "2s";
58           # Hardening
59           CapabilityBoundingSet = if (cfg.port < 1024) then [ "CAP_NET_BIND_SERVICE" ] else [ "" ];
60           DeviceAllow = [ "" ];
61           LockPersonality = true;
62           MemoryDenyWriteExecute = true;
63           PrivateDevices = true;
64           # A private user cannot have process capabilities on the host's user
65           # namespace and thus CAP_NET_BIND_SERVICE has no effect.
66           PrivateUsers = (cfg.port >= 1024);
67           ProcSubset = "pid";
68           ProtectClock = true;
69           ProtectControlGroups = true;
70           ProtectHome = true;
71           ProtectHostname = true;
72           ProtectKernelLogs = true;
73           ProtectKernelModules = true;
74           ProtectKernelTunables = true;
75           ProtectProc = "invisible";
76           RestrictAddressFamilies = [ "AF_INET" "AF_INET6" ];
77           RestrictNamespaces = true;
78           RestrictRealtime = true;
79           RestrictSUIDSGID = true;
80           SystemCallArchitectures = "native";
81           SystemCallFilter = [ "@system-service" "~@privileged" "~@resources" ];
82           UMask = "0077";
83         };
84     };
86     networking.firewall = mkIf cfg.openFirewall {
87       allowedTCPPorts = [ cfg.port ];
88     };
89   };