{ pkgs, config, service_configs, username, lib, ... }: { imports = [ (lib.serviceMountDeps "qbittorrent" [ service_configs.torrents_path config.services.qbittorrent.serverConfig.Preferences.Downloads.TempPath "${config.services.qbittorrent.profileDir}/qBittorrent" ]) (lib.vpnNamespaceOpenPort config.services.qbittorrent.webuiPort "qbittorrent") (lib.serviceDependZpool "qbittorrent" service_configs.zpool_hdds) ]; services.qbittorrent = { enable = true; webuiPort = service_configs.ports.torrent; profileDir = "/var/lib/qBittorrent"; serverConfig.LegalNotice.Accepted = true; serverConfig.Preferences = { WebUI = { AlternativeUIEnabled = true; RootFolder = "${pkgs.vuetorrent}/share/vuetorrent"; # disable auth because we use caddy for auth AuthSubnetWhitelist = "0.0.0.0/0"; AuthSubnetWhitelistEnabled = true; }; Downloads = { inherit (service_configs.torrent) SavePath TempPath; }; }; serverConfig.BitTorrent = { Session = { MaxConnectionsPerTorrent = 10; MaxUploadsPerTorrent = 10; MaxConnections = -1; MaxUploads = -1; MaxActiveCheckingTorrents = 5; # queueing QueueingSystemEnabled = false; MaxActiveDownloads = 2; # num of torrents that can download at the same time MaxActiveUploads = 20; IgnoreSlowTorrentsForQueueing = true; GlobalUPSpeedLimit = 0; GlobalDLSpeedLimit = 0; # Alternate speed limits for when Jellyfin is streaming AlternativeGlobalUPSpeedLimit = 500; # 500 KB/s when throttled AlternativeGlobalDLSpeedLimit = 800; # 800 KB/s when throttled IncludeOverheadInLimits = true; GlobalMaxRatio = 6.0; AddTrackersEnabled = true; AdditionalTrackers = ( lib.concatStringsSep "\\n" [ "http://0123456789nonexistent.com:80/announce" "http://0d.kebhana.mx:443/announce" "http://1337.abcvg.info:80/announce" "http://bittorrent-tracker.e-n-c-r-y-p-t.net:1337/announce" "http://bt1.xxxxbt.cc:6969/announce" "http://bt.poletracker.org:2710/announce" "http://buny.uk:6969/announce" "http://finbytes.org:80/announce.php" "http://highteahop.top:6960/announce" "http://home.yxgz.club:6969/announce" "http://open.tracker.cl:1337/announce" "http://open.trackerlist.xyz:80/announce" "http://p4p.arenabg.com:1337/announce" "http://public.tracker.vraphim.com:6969/announce" "http://region.nl1.privex.cc:6969/announce" "http://retracker.spark-rostov.ru:80/announce" "http://seeders-paradise.org:80/announce" "http://servandroidkino.ru:80/announce" "http://share.hkg-fansub.info:80/announce.php" "http://shubt.net:2710/announce" "https://sparkle.ghostchu-services.top:443/announce" "https://tracker.bt4g.com:443/announce" "https://tracker.expli.top:443/announce" "https://tracker.gcrenwp.top:443/announce" "https://tracker.ghostchu-services.top:443/announce" "https://tracker.leechshield.link:443/announce" "https://tracker.moeblog.cn:443/announce" "https://tracker.pmman.tech:443/announce" "https://tracker.yemekyedim.com:443/announce" "https://tracker.zhuqiy.top:443/announce" "https://tr.zukizuki.org:443/announce" "http://taciturn-shadow.spb.ru:6969/announce" "http://t.jaekr.sh:6969/announce" "http://t.overflow.biz:6969/announce" "http://tracker1.bt.moack.co.kr:80/announce" "http://tracker1.itzmx.com:8080/announce" "http://tracker.23794.top:6969/announce" "http://tracker2.dler.org:80/announce" "http://tracker810.xyz:11450/announce" "http://tracker.bittor.pw:1337/announce" "http://tracker.bt4g.com:2095/announce" "http://tracker.bt-hash.com:80/announce" "http://tracker.bz:80/announce" "http://tracker.corpscorp.online:80/announce" "http://tracker.darkness.services:6969/announce" "http://tracker.dler.com:6969/announce" "http://tracker.dler.org:6969/announce" "http://tracker.dmcomic.org:2710/announce" "http://tracker.files.fm:6969/announce" "http://tracker.ghostchu-services.top:80/announce" "http://tracker.ipv6tracker.org:80/announce" "http://tracker.lintk.me:2710/announce" "http://tracker.moxing.party:6969/announce" "http://tracker.mywaifu.best:6969/announce" "http://tracker.opentrackr.org:1337/announce" "http://tracker.qu.ax:6969/announce" "http://tracker.renfei.net:8080/announce" "http://tracker.sbsub.com:2710/announce" "http://tracker.vanitycore.co:6969/announce" "http://tracker.waaa.moe:6969/announce" "http://tracker.xiaoduola.xyz:6969/announce" "http://tracker.zhuqiy.top:80/announce" "http://tr.kxmp.cf:80/announce" "http://wepzone.net:6969/announce" "http://www.genesis-sp.org:2710/announce" "http://www.torrentsnipe.info:2701/announce" "udp://1c.premierzal.ru:6969/announce" "udp://bandito.byterunner.io:6969/announce" "udp://bittorrent-tracker.e-n-c-r-y-p-t.net:1337/announce" "udp://bt.ktrackers.com:6666/announce" "udp://concen.org:6969/announce" "udp://d40969.acod.regrucolo.ru:6969/announce" "udp://discord.heihachi.pw:6969/announce" "udp://evan.im:6969/announce" "udp://exodus.desync.com:6969/announce" "udp://explodie.org:6969/announce" "udp://inferno.demonoid.is:3391/announce" "udp://ipv4announce.sktorrent.eu:6969/announce" "udp://ipv4.rer.lol:2710/announce" "udp://isk.richardsw.club:6969/announce" "udp://leet-tracker.moe:1337/announce" "udp://martin-gebhardt.eu:25/announce" "udp://ns-1.x-fins.com:6969/announce" "udp://open.demonii.com:1337" "udp://open.demonii.com:1337/announce" "udp://open.dstud.io:6969/announce" "udp://open.free-tracker.ga:6969/announce" "udp://open.stealth.si:80/announce" "udp://open.tracker.cl:1337/announce" "udp://opentracker.io:6969/announce" "udp://p4p.arenabg.com:1337/announce" "udp://public.tracker.vraphim.com:6969/announce" "udp://retracker01-msk-virt.corbina.net:80/announce" "udp://retracker.lanta.me:2710/announce" "udp://t.overflow.biz:6969/announce" "udp://tr4ck3r.duckdns.org:6969/announce" "udp://tracker2.dler.org:80/announce" "udp://tracker.bittor.pw:1337/announce" "udp://tracker.dler.com:6969/announce" "udp://tracker.dler.org:6969/announce" "udp://tracker.filemail.com:6969/announce" "udp://tracker.fnix.net:6969/announce" "udp://tracker.gigantino.net:6969/announce" "udp://tracker.gmi.gd:6969/announce" "udp://tracker.ololosh.space:6969/announce" "udp://tracker.openbittorrent.com:80" "udp://tracker.opentrackr.org:1337/announce" "udp://tracker.srv00.com:6969/announce" "udp://tracker.therarbg.to:6969/announce" "udp://tracker.tiny-vps.com:6969/announce" "udp://tracker.torrent.eu.org:451/announce" "udp://tracker.torrust-demo.com:6969/announce" "udp://tracker.tryhackx.org:6969/announce" "udp://ttk2.nbaonlineservice.com:6969/announce" "udp://wepzone.net:6969/announce" ] ); AnnounceToAllTrackers = true; # idk why it also has to be specified here too? inherit (config.services.qbittorrent.serverConfig.Preferences.Downloads) TempPath; TempPathEnabled = true; # how many connections per sec ConnectionSpeed = 300; ChokingAlgorithm = "RateBased"; PieceExtentAffinity = true; SuggestMode = true; }; Network = { # traffic is routed through a vpn, we don't need # port forwarding PortForwardingEnabled = false; }; }; }; systemd.tmpfiles.rules = [ "d ${config.services.qbittorrent.serverConfig.Preferences.Downloads.SavePath} 0750 ${config.services.qbittorrent.user} ${service_configs.media_group}" "d ${config.services.qbittorrent.serverConfig.Preferences.Downloads.TempPath} 0700 ${config.services.qbittorrent.user} ${config.services.qbittorrent.group}" "d ${config.services.qbittorrent.profileDir} 0700 ${config.services.qbittorrent.user} ${config.services.qbittorrent.group}" ]; services.caddy.virtualHosts."torrent.${service_configs.https.domain}".extraConfig = '' ${builtins.readFile ../secrets/caddy_auth} reverse_proxy ${service_configs.https.wg_ip}:${builtins.toString config.services.qbittorrent.webuiPort} ''; users.users.${config.services.qbittorrent.user}.extraGroups = [ service_configs.media_group ]; }