Personal-use NixOS configuration
1{
2 dhtPort ? 6881,
3 listenPortRange ? {
4 from = 6881;
5 to = 6889;
6 },
7 openFirewall ? false,
8}:
9
10{
11 config,
12 pkgs-unstable,
13 lib,
14 ...
15}:
16
17{
18 services.rtorrent = {
19 enable = true;
20
21 # Unstable for rtorrent 0.16.3, roll back to stable once backported
22 package = pkgs-unstable.rtorrent;
23
24 configText = ''
25 dht.mode.set = on
26 dht.port.set = ${toString dhtPort}
27 protocol.pex.set = yes
28 trackers.use_udp.set = yes
29 network.port_range.set = ${toString listenPortRange.from}-${toString listenPortRange.to}
30
31 throttle.max_uploads.global.set = 300
32
33 trackers.numwant.set = 100
34 throttle.min_peers.normal.set = 1
35 throttle.max_peers.normal.set = 100
36 throttle.min_peers.seed.set = 1
37 throttle.max_peers.seed.set = 100
38
39 # Assumes a more powerful machine
40 pieces.memory.max.set = 4000M
41 pieces.preload.type.set = 2
42 pieces.preload.min_rate.set = 30720
43
44 # TODO: seeding ratio for sonarr/etc.
45 #ratio.enable=
46 #ratio.min.set=100
47 #ratio.max.set=300
48 #system.method.set = group.seeding.ratio.command, d.close=
49
50 # Don't kill the internet
51 schedule2 = throttle_download_limit_slow, 8:00:00, 24:00:00, ((throttle.max_downloads.global.set, 50))
52 schedule2 = throttle_download_slow, 8:00:00, 24:00:00, ((throttle.global_down.max_rate.set_kb, 10240))
53 schedule2 = throttle_upload_slow, 8:00:00, 24:00:00, ((throttle.global_up.max_rate.set_kb, 4096))
54
55 schedule2 = throttle_download_limit_fast, 22:00:00, 24:00:00, ((throttle.max_downloads.global.set, 200))
56 schedule2 = throttle_download_fast, 22:00:00, 24:00:00, ((throttle.global_down.max_rate.set_kb, 0))
57 schedule2 = throttle_upload_fast, 22:00:00, 24:00:00, ((throttle.global_up.max_rate.set_kb, 0))
58
59 # Compatibility with Flood
60 method.redirect = load.throw,load.normal
61 method.redirect = load.start_throw,load.start
62 method.insert = d.down.sequential,value|const,0
63 method.insert = d.down.sequential.set,value|const,0
64 '';
65 };
66
67 networking.firewall = lib.mkIf openFirewall {
68 allowedTCPPortRanges = [ listenPortRange ];
69 allowedUDPPortRanges = [ listenPortRange ];
70 };
71
72 # Required override for linux-hardened kernel
73 systemd.services.rtorrent.serviceConfig = {
74 SystemCallFilter = lib.mkForce "@system-service";
75 };
76
77 # Add Flood to the rtorrent group for file management
78 systemd.services.flood.serviceConfig.SupplementaryGroups = [ config.services.rtorrent.group ];
79
80 # Caddy reverse proxy configuration
81 users.users.caddy.extraGroups = [ config.services.rtorrent.group ];
82
83 services.caddy.virtualHosts.rtorrent = {
84 hostName = ":50000";
85
86 listenAddresses = [
87 "127.0.0.1"
88 "::1"
89 ];
90
91 extraConfig = ''
92 reverse_proxy unix/${config.services.rtorrent.rpcSocket} {
93 transport scgi
94 }
95 '';
96 };
97}