fluffychat: 1.22.1 -> 1.23.0 (#364091)
[NixPkgs.git] / nixos / modules / services / web-apps / komga.nix
blobd7ab2a9e612ef6765617cf0c22fc1937391f942a
2   config,
3   pkgs,
4   lib,
5   ...
6 }:
8 let
9   cfg = config.services.komga;
10   inherit (lib) mkOption mkEnableOption maintainers;
11   inherit (lib.types) port str bool;
14   options = {
15     services.komga = {
16       enable = mkEnableOption "Komga, a free and open source comics/mangas media server";
18       port = mkOption {
19         type = port;
20         default = 8080;
21         description = "The port that Komga will listen on.";
22       };
24       user = mkOption {
25         type = str;
26         default = "komga";
27         description = "User account under which Komga runs.";
28       };
30       group = mkOption {
31         type = str;
32         default = "komga";
33         description = "Group under which Komga runs.";
34       };
36       stateDir = mkOption {
37         type = str;
38         default = "/var/lib/komga";
39         description = "State and configuration directory Komga will use.";
40       };
42       openFirewall = mkOption {
43         type = bool;
44         default = false;
45         description = "Whether to open the firewall for the port in {option}`services.komga.port`.";
46       };
47     };
48   };
50   config =
51     let
52       inherit (lib) mkIf getExe;
53     in
54     mkIf cfg.enable {
56       networking.firewall.allowedTCPPorts = mkIf cfg.openFirewall [ cfg.port ];
58       users.groups = mkIf (cfg.group == "komga") { komga = { }; };
60       users.users = mkIf (cfg.user == "komga") {
61         komga = {
62           group = cfg.group;
63           home = cfg.stateDir;
64           description = "Komga Daemon user";
65           isSystemUser = true;
66         };
67       };
69       systemd.services.komga = {
70         environment = {
71           SERVER_PORT = builtins.toString cfg.port;
72           KOMGA_CONFIGDIR = cfg.stateDir;
73         };
75         description = "Komga is a free and open source comics/mangas media server";
77         wantedBy = [ "multi-user.target" ];
78         wants = [ "network-online.target" ];
79         after = [ "network-online.target" ];
81         serviceConfig = {
82           User = cfg.user;
83           Group = cfg.group;
85           Type = "simple";
86           Restart = "on-failure";
87           ExecStart = getExe pkgs.komga;
89           StateDirectory = mkIf (cfg.stateDir == "/var/lib/komga") "komga";
91           RemoveIPC = true;
92           NoNewPrivileges = true;
93           CapabilityBoundingSet = "";
94           SystemCallFilter = [ "@system-service" ];
95           ProtectSystem = "full";
96           PrivateTmp = true;
97           ProtectProc = "invisible";
98           ProtectClock = true;
99           ProcSubset = "pid";
100           PrivateUsers = true;
101           PrivateDevices = true;
102           ProtectHostname = true;
103           ProtectKernelTunables = true;
104           RestrictAddressFamilies = [
105             "AF_INET"
106             "AF_INET6"
107             "AF_NETLINK"
108           ];
109           LockPersonality = true;
110           RestrictNamespaces = true;
111           ProtectKernelLogs = true;
112           ProtectControlGroups = true;
113           ProtectKernelModules = true;
114           SystemCallArchitectures = "native";
115           RestrictSUIDSGID = true;
116           RestrictRealtime = true;
117         };
118       };
119     };
121   meta.maintainers = with maintainers; [ govanify ];