nixfiles/services/qbittorrent.nix
2024-01-08 07:51:19 +03:00

89 lines
2.4 KiB
Nix

{ lib, pkgs, ... }:
{
# qBittorrent web UI port.
port ? 8080
, # The directory where qBittorrent will create files
dataDir ? "/var/lib/qbittorrent"
, # Number of files to allow qBittorrent to open
openFilesLimit ? 4096
, # ZIP containing custom frontend
customFrontend ? null
, # Folder name inside ZIP containing custom frontend
customFrontendFolder ? null
, # Additional qbittorrent config
config ? { }
, user ? "qbittorrent"
, group ? "qbittorrent"
, # Systemd service name
serviceName ? "qbittorrent-nox"
, serviceConfig ? { }
# Custom setup script
, setup ? ""
, # qbittorrent-nox package
package ? pkgs.qbittorrent-nox
}:
let
configMerged = config // {
Preferences = {
"WebUI\\Port" = toString port;
"WebUI\\AlternativeUIEnabled" = if customFrontend != null then "true" else "false";
"WebUI\\RootFolder" = if customFrontend != null then "${dataDir}/frontend" else "";
} // (config.Preferences or { });
};
ini = lib.generators.toINI { } configMerged;
iniFile = pkgs.writeText "qBittorrent.conf" ini;
in
{
systemd.services.${serviceName} = {
description = "qbittorrent-nox Daemon";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
PrivateTmp = true;
# To prevent "Quit & shutdown daemon" from working; we want systemd to manage it!
Restart = "on-success";
User = user;
Group = group;
UMask = "0002";
LimitNOFILE = openFilesLimit;
} // serviceConfig;
script = ''
${lib.optionalString (customFrontend != null) ''
set -euxo pipefail
if [[ -d ${dataDir}/frontend ]]; then
rm -rf ${dataDir}/frontend
fi
mkdir -p ${dataDir}/frontend
${pkgs.unzip}/bin/unzip -o ${customFrontend} -d ${dataDir}/frontend
${lib.optionalString (customFrontendFolder != null) ''
mv ${dataDir}/frontend/${customFrontendFolder}/* ${dataDir}/frontend
rm -rf ${dataDir}/frontend/${customFrontendFolder}
''}
''}
mkdir -p ${dataDir}/qBittorrent/config
cp ${iniFile} ${dataDir}/qBittorrent/config/qBittorrent.conf
${setup}
${package}/bin/qbittorrent-nox --webui-port=${toString port} --profile=${dataDir}
'';
};
users.users.${user} = {
isNormalUser = true;
group = group;
home = dataDir;
createHome = true;
description = "qbittorrent-nox user";
};
users.groups.${group} = {
gid = null;
};
}