summaryrefslogtreecommitdiff
path: root/profiles/homeserver/transmission.nix
blob: 7f4c031ce1506da8f3938041e087f9dd4a43e489 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
{ config, lib, ... }: with lib;  let
    multimediaUsernames = [
      "prowlarr"
      "sonarr"
      "radarr"
      "bazarr"
      "jellyfin"
      "transmission"
    ];
    mkMultimediaUsers = names: mergeAttrsList (imap0 (i: name: {${name} = {
      uid = 2007 + i;
      isSystemUser = true;
      group = name;
      createHome = false;
    };}) names);
    mkMultimediaGroups = names: mergeAttrsList (map (name: {${name} = { };}) names);
  in {
  virtualisation.docker.rootless = {
    enable = true;
    setSocketVariable = true;
  };

  users.groups = {
    multimedia = {
      gid = 1994;
      members = multimediaUsernames;
    };
  } // mkMultimediaGroups multimediaUsernames;
  users.users = {
    ${my.username}.extraGroups = [ "multimedia" ];
  } // mkMultimediaUsers multimediaUsernames;

  systemd.tmpfiles.rules = [
    "d /data 0770 - multimedia - -"
  ];

  services.nginx = {
    virtualHosts = {
      "sonarr.${my.domain}"  = { locations."/" = { proxyPass = "http://127.0.0.1:8989"; }; };
      "radarr.${my.domain}"  = { locations."/" = { proxyPass = "http://127.0.0.1:7878"; }; };
      "bazarr.${my.domain}"  = { locations."/" = { proxyPass = "http://127.0.0.1:${toString config.services.bazarr.listenPort}"; }; };
      # "readarr.${my.domain}"  = { locations."/" = { proxyPass = "http://127.0.0.1:8787"; }; };
      "prowlarr.${my.domain}"  = { locations."/" = { proxyPass = "http://127.0.0.1:9696"; }; };
      "transmission.${my.domain}"  = { locations."/" = { proxyPass = "http://127.0.0.1:9091"; }; };
      "jellyfin.${my.domain}"  = { locations."/" = { proxyPass = "http://127.0.0.1:8096"; }; };
    };
  };
  virtualisation.oci-containers = {
    backend = "docker";
    containers = {
      prowlarr = {
        image = "linuxserver/prowlarr";
        extraOptions = ["--net=host"];
        environment = {
          PUID = "${toString config.users.users.prowlarr.uid}";
          PGID = "${toString config.users.groups.multimedia.gid}";
        };
        volumes = [
          "/data/config/prowlarr/data:/config"
        ];
      };
      bazarr = {
        image = "linuxserver/bazarr";
        extraOptions = ["--net=host"];
        environment = {
          PUID = "${toString config.users.users.bazarr.uid}";
          PGID = "${toString config.users.groups.multimedia.gid}";
        };
        volumes = [
          "/data/media:/data"
          "/data/config/bazarr/data:/config"
        ];
      };
      radarr = {
        image = "linuxserver/radarr";
        extraOptions = ["--net=host"];
        environment = {
          PUID = "${toString config.users.users.radarr.uid}";
          PGID = "${toString config.users.groups.multimedia.gid}";
        };
        volumes = [
          "/data:/data"
          "/data/config/radarr/data:/config"
        ];
      };
      sonarr = {
        image = "linuxserver/sonarr";
        extraOptions = ["--net=host"];
        environment = {
          PUID = "${toString config.users.users.sonarr.uid}";
          PGID = "${toString config.users.groups.multimedia.gid}";
        };
        volumes = [
          "/data:/data"
          "/data/config/sonarr/data:/config"
        ];
      };
      jellyfin = {
        image = "jellyfin/jellyfin";
        extraOptions = ["--net=host"];
        user = "${toString config.users.users.jellyfin.uid}:${toString config.users.groups.multimedia.gid}";
        volumes = [
          "/data/media:/media"
          "/data/config/jellyfin/config:/config"
          "/data/config/jellyfin/cache:/cache"
        ];
      };
      transmission = {
        image = "haugene/transmission-openvpn";
        extraOptions = ["--cap-add=NET_ADMIN" "--group-add=${toString config.users.groups.multimedia.gid}"];
        volumes = [
          "/data/config/ovpn:/etc/openvpn/custom"
          "/data/config/transmission:/config"
          "/data/torrents:/data/torrents"
        ];
        ports = [
          "9091:9091"
          "5299:5299"
          "8081:80"
        ];
        environmentFiles = [
          config.secrets.transmission.path
        ];
      };
    };
  };
}