1{ config, pkgs, lib, ... }:
2
3with lib;
4
5let
6 cfg = config.services.jackett;
7
8in
9{
10 options = {
11 services.jackett = {
12 enable = mkEnableOption (lib.mdDoc "Jackett");
13
14 dataDir = mkOption {
15 type = types.str;
16 default = "/var/lib/jackett/.config/Jackett";
17 description = lib.mdDoc "The directory where Jackett stores its data files.";
18 };
19
20 openFirewall = mkOption {
21 type = types.bool;
22 default = false;
23 description = lib.mdDoc "Open ports in the firewall for the Jackett web interface.";
24 };
25
26 user = mkOption {
27 type = types.str;
28 default = "jackett";
29 description = lib.mdDoc "User account under which Jackett runs.";
30 };
31
32 group = mkOption {
33 type = types.str;
34 default = "jackett";
35 description = lib.mdDoc "Group under which Jackett runs.";
36 };
37
38 package = mkOption {
39 type = types.package;
40 default = pkgs.jackett;
41 defaultText = literalExpression "pkgs.jackett";
42 description = lib.mdDoc "Jackett package to use.";
43 };
44 };
45 };
46
47 config = mkIf cfg.enable {
48 systemd.tmpfiles.rules = [
49 "d '${cfg.dataDir}' 0700 ${cfg.user} ${cfg.group} - -"
50 ];
51
52 systemd.services.jackett = {
53 description = "Jackett";
54 after = [ "network.target" ];
55 wantedBy = [ "multi-user.target" ];
56
57 serviceConfig = {
58 Type = "simple";
59 User = cfg.user;
60 Group = cfg.group;
61 ExecStart = "${cfg.package}/bin/Jackett --NoUpdates --DataFolder '${cfg.dataDir}'";
62 Restart = "on-failure";
63 };
64 };
65
66 networking.firewall = mkIf cfg.openFirewall {
67 allowedTCPPorts = [ 9117 ];
68 };
69
70 users.users = mkIf (cfg.user == "jackett") {
71 jackett = {
72 group = cfg.group;
73 home = cfg.dataDir;
74 uid = config.ids.uids.jackett;
75 };
76 };
77
78 users.groups = mkIf (cfg.group == "jackett") {
79 jackett.gid = config.ids.gids.jackett;
80 };
81 };
82}