1{
2 config,
3 pkgs,
4 lib,
5 ...
6}:
7let
8 cfg = config.services.readarr;
9 servarr = import ./settings-options.nix { inherit lib pkgs; };
10in
11{
12 options = {
13 services.readarr = {
14 enable = lib.mkEnableOption "Readarr, a Usenet/BitTorrent ebook downloader";
15
16 dataDir = lib.mkOption {
17 type = lib.types.str;
18 default = "/var/lib/readarr/";
19 description = "The directory where Readarr stores its data files.";
20 };
21
22 package = lib.mkPackageOption pkgs "readarr" { };
23
24 openFirewall = lib.mkOption {
25 type = lib.types.bool;
26 default = false;
27 description = ''
28 Open ports in the firewall for Readarr
29 '';
30 };
31
32 settings = servarr.mkServarrSettingsOptions "readarr" 8787;
33
34 environmentFiles = servarr.mkServarrEnvironmentFiles "readarr";
35
36 user = lib.mkOption {
37 type = lib.types.str;
38 default = "readarr";
39 description = ''
40 User account under which Readarr runs.
41 '';
42 };
43
44 group = lib.mkOption {
45 type = lib.types.str;
46 default = "readarr";
47 description = ''
48 Group under which Readarr runs.
49 '';
50 };
51 };
52 };
53
54 config = lib.mkIf cfg.enable {
55 systemd.tmpfiles.settings."10-readarr".${cfg.dataDir}.d = {
56 inherit (cfg) user group;
57 mode = "0700";
58 };
59
60 systemd.services.readarr = {
61 description = "Readarr";
62 after = [ "network.target" ];
63 wantedBy = [ "multi-user.target" ];
64 environment = servarr.mkServarrSettingsEnvVars "READARR" cfg.settings;
65
66 serviceConfig = {
67 Type = "simple";
68 User = cfg.user;
69 Group = cfg.group;
70 EnvironmentFile = cfg.environmentFiles;
71 ExecStart = "${cfg.package}/bin/Readarr -nobrowser -data='${cfg.dataDir}'";
72 Restart = "on-failure";
73 };
74 };
75
76 networking.firewall = lib.mkIf cfg.openFirewall {
77 allowedTCPPorts = [ cfg.settings.server.port ];
78 };
79
80 users.users = lib.mkIf (cfg.user == "readarr") {
81 readarr = {
82 description = "Readarr service";
83 home = cfg.dataDir;
84 group = cfg.group;
85 isSystemUser = true;
86 };
87 };
88
89 users.groups = lib.mkIf (cfg.group == "readarr") {
90 readarr = { };
91 };
92 };
93}