{ config, lib, ... }: let cfg = config.server.qbittorrent; in { options.server.qbittorrent = { enable = lib.mkEnableOption "Enable qBittorrent"; url = lib.mkOption { type = lib.types.str; default = "qbt.${config.server.domain}"; }; port = lib.mkOption { type = lib.types.int; default = 8080; description = "The port to host qBittorrent on."; }; homepage.name = lib.mkOption { type = lib.types.str; default = "qBittorrent"; }; homepage.description = lib.mkOption { type = lib.types.str; default = "Torrent client"; }; homepage.icon = lib.mkOption { type = lib.types.str; default = "qbittorrent.svg"; }; homepage.category = lib.mkOption { type = lib.types.str; default = "Downloads"; }; }; config = lib.mkIf cfg.enable { services.caddy.virtualHosts."${cfg.url}" = { useACMEHost = config.server.domain; extraConfig = '' reverse_proxy http://127.0.0.1:${toString cfg.port} ''; }; virtualisation.podman.enable = true; virtualisation.oci-containers.containers = { qbittorrent = { image = "linuxserver/qbittorrent:latest"; autoStart = true; dependsOn = ["gluetun"]; ports = [ "8090:8090" "58846:58846" ]; extraOptions = [ "--network=container:gluetun" ]; volumes = [ "config:/var/lib/qbittorrent" "downloads:/home/media/downloads" ]; environmentFiles = [ config.age.secrets.gluetunEnv.path ]; environment = { PUID = "1001"; PGID = "777"; TZ = "Europe/Stockholm"; WEBUI_PORT = "${builtins.toString cfg.port}"; }; }; gluetun = { image = "qmcgaw/gluetun"; ports = [ "8388:8388" "58846:58846" "8090:8090" ]; devices = ["/dev/net/tun:/dev/net/tun"]; autoStart = true; extraOptions = [ "--cap-add=NET_ADMIN" ]; volumes = ["/var:/gluetun"]; environmentFiles = [ config.age.secrets.gluetunEnv.path ]; environment = { DEV_MODE = "false"; VPN_SERVICE_PROVIDER = "mullvad"; VPN_TYPE = "wireguard"; SERVER_CITIES = "Stockholm"; }; }; }; users = { users.qbittorrent = { uid = 899; group = "qbittorrent"; extraGroups = ["media"]; isSystemUser = true; }; groups.qbittorrent = { gid = 898; }; }; }; }