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