feramance/qbitrr. It monitors torrent health, triggers instant imports when downloads complete, automates quality upgrades, manages disk space, integrates with request systems (Overseerr/Ombi), and provides a modern React dashboard for complete visibility and control.
DownloadedMoviesScan/DownloadedEpisodesScan the moment torrents finishos.execv() for true in-place restarts (no supervisor needed)The long-term plan is still to ship a C# rewrite, but the Python edition isn't going anywhere—it gets regular fixes and features, and the Web UI is now production-ready. Ideas and PRs are welcome! Head over to the issue templates or the PR checklist to get started.
qBitrr supports Python 3.12+ on Linux, macOS, and Windows. Run it natively or in Docker—whatever fits your stack.
bashpython -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate python -m pip install --upgrade pip python -m pip install qBitrr2 # First run creates ~/config/config.toml qBitrr2
Update later:
bashpython -m pip install --upgrade qBitrr2
Or enable auto-updates in config.toml:
toml[Settings] AutoUpdateEnabled = true AutoUpdateCron = "0 3 * * 0" # Weekly on Sunday at 3 AM
📝 Note: Auto-updates check GitHub releases for new versions. Only published (non-draft) releases trigger updates. Binary installations receive update notifications but require manual download.
Minimal setup:
bashdocker run -d \ --name qbitrr \ --tty \ -e TZ=Europe/London \ -p 6969:6969 \ -v /etc/localtime:/etc/localtime:ro \ -v /path/to/appdata/qbitrr:/config \ -v /path/to/completed/downloads:/completed_downloads:rw \ --restart unless-stopped \ feramance/qbitrr:latest
The container automatically binds its WebUI to 0.0.0.0; exposing 6969 makes the dashboard reachable at http://<host>:6969/ui.
Docker Compose example:
yamlservices: qbitrr: image: feramance/qbitrr:latest container_name: qbitrr user: 1000:1000 restart: unless-stopped tty: true environment: TZ: Europe/London ports: - "6969:6969" volumes: - /etc/localtime:/etc/localtime:ro - /path/to/appdata/qbitrr:/config - /path/to/completed/downloads:/completed_downloads:rw logging: driver: json-file options: max-size: 50m max-file: "3" depends_on: - qbittorrent - radarr - sonarr
ℹ️ On first boot the container writes
config.tomlunder/config. Update the values to match your mounts and restart the container.
For Linux users running qBitrr natively (non-Docker), you can set up automatic startup and restart management using systemd.
Quick setup:
bash# Install qBitrr pip install qBitrr2 # Copy systemd service file sudo cp qbitrr.service /etc/systemd/system/qbitrr.service # Enable and start sudo systemctl enable qbitrr sudo systemctl start qbitrr # Check status sudo systemctl status qbitrr
Benefits:
journalctlSee the full guide: SYSTEMD_SERVICE.md for detailed setup instructions, troubleshooting, and security hardening options.
~/config/config.toml/config/config.tomlqbitrr --gen-configConfigure qBittorrent connection in [qBit] section:
Host, Port, UserName, PasswordVersion5 = true (4.6.7 is the latest validated 4.x build)Configure Arr instances (Radarr/Sonarr/Lidarr):
URI, APIKey, Category(Radarr|Sonarr|Lidarr)-<name> (e.g., Radarr-Movies, Sonarr-TV4K)Set completed download folder:
toml[Settings] CompletedDownloadFolder = "/path/to/completed"
Enable logging for troubleshooting:
toml[Settings] Logging = true ConsoleLevel = "INFO" # or DEBUG for verbose output
See config.example.toml for comprehensive documentation of all settings, including:
qBitrr continuously monitors your torrents and takes intelligent action when problems arise.
Stalled Torrent Detection:
toml[Radarr-Movies.Torrent] StalledDelay = 15 # Minutes before considering a torrent stalled ReSearchStalled = true # Re-search before removing stalled torrents MaximumETA = 604800 # Max ETA in seconds (7 days) IgnoreTorrentsYoungerThan = 600 # Grace period for new torrents (10 min)
Automatic Blacklisting: When torrents fail or stall beyond thresholds, qBitrr:
Smart Completion Rules:
toml[Radarr-Movies.Torrent] MaximumDeletablePercentage = 0.99 # Don't delete torrents >99% complete DoNotRemoveSlow = true # Protect slow but active torrents
File Verification:
toml[Settings] FFprobeAutoUpdate = true # Auto-download FFprobe binary
Error Code Handling:
toml[Radarr-Movies] ArrErrorCodesToBlocklist = [ "Not an upgrade for existing movie file(s)", "Unable to determine if file is a sample" ]
Automatically handle specific Arr error messages by removing failed files and triggering re-searches.
Missing Media Search:
toml[Radarr-Movies.EntrySearch] SearchMissing = true # Enable automated searching SearchLimit = 5 # Max concurrent searches SearchByYear = true # Order by release year SearchInReverse = false # Newest first (true = oldest first) SearchRequestsEvery = 300 # Delay between searches (seconds) SearchAgainOnSearchCompletion = true # Loop continuously
Quality Upgrade Search:
toml[Radarr-Movies.EntrySearch] DoUpgradeSearch = true # Search for better quality versions QualityUnmetSearch = true # Search for unmet quality profiles CustomFormatUnmetSearch = true # Search for better custom format scores ForceMinimumCustomFormat = true # Auto-remove torrents below CF threshold
Overseerr Integration:
toml[Radarr-Movies.EntrySearch.Overseerr] SearchOverseerrRequests = true OverseerrURI = "[***]" OverseerrAPIKey = "your-api-key" ApprovedOnly = true # Only process approved requests Is4K = false # Set true for 4K Arr instances
Ombi Integration:
toml[Radarr-Movies.EntrySearch.Ombi] SearchOmbiRequests = true OmbiURI = "[***]" OmbiAPIKey = "your-api-key" ApprovedOnly = true
Smart Search Modes (Sonarr):
toml[Sonarr-TV.EntrySearch] SearchBySeries = "smart" # auto | true (series) | false (episode) # smart: Series search for full seasons, episode search for singles PrioritizeTodaysReleases = true # Search today's episodes first (RSS-like) AlsoSearchSpecials = false # Include season 00 episodes Unmonitored = false # Include unmonitored items
Temporary Quality Profiles:
toml[Radarr-Movies.EntrySearch] UseTempForMissing = true KeepTempProfile = false # New: Map each main profile to a temp profile QualityProfileMappings = { "Ultra-HD" = "Web-DL", "HD-1080p" = "HDTV-720p" } # Auto-reset options ForceResetTempProfiles = false # Reset all on startup TempProfileResetTimeoutMinutes = 0 # Auto-reset after timeout (0 = disabled) ProfileSwitchRetryAttempts = 3 # Retry failed profile switches # Searches missing items with temp profile, switches back after import
Configure via WebUI:
RSS Sync Automation:
toml[Radarr-Movies] RssSyncTimer = 5 # Minutes between RSS feed refreshes (0 = disabled)
Keeps Arr instances checking indexers for new releases regularly.
Queue Refresh:
toml[Radarr-Movies] RefreshDownloadsTimer = 5 # Minutes between queue updates (0 = disabled)
Ensures Arr instances stay in sync with qBittorrent's download state.
Import Mode:
toml[Radarr-Movies] importMode = "Auto" # Auto | Move | Copy
Custom Format Score Enforcement:
When ForceMinimumCustomFormat = true, qBitrr automatically removes torrents that don't meet the minimum custom format score defined in your Arr quality profile.
Global Seeding Limits:
toml[Radarr-Movies.Torrent.SeedingMode] DownloadRateLimitPerTorrent = -1 # -1 = unlimited, or KB/s UploadRateLimitPerTorrent = -1 # -1 = unlimited, or KB/s MaxUploadRatio = 2.0 # Stop seeding at 2.0 ratio MaxSeedingTime = 604800 # Stop after 7 days (seconds) RemoveTorrent = 3 # 1=ratio, 2=time, 3=either, 4=both, -1=never
Per-Tracker Settings:
toml[[Radarr-Movies.Torrent.Trackers]] Name = "MyTracker" Priority = 10 # Higher = processed first URI = "[***]" MaximumETA = *** # Override global MaxETA for this tracker DownloadRateLimit = 5000 # KB/s limit for this tracker UploadRateLimit = 1000 # KB/s limit for this tracker MaxUploadRatio = 1.5 # Tracker-specific ratio limit MaxSeedingTime = 86400 # Tracker-specific time limit (1 day) AddTrackerIfMissing = true # Inject this tracker into matching torrents RemoveIfExists = false # Remove this tracker if found SuperSeedMode = true # Enable super seeding for this tracker AddTags = ["private", "MyTracker"] # Auto-tag matching torrents
Tracker Cleanup:
toml[Radarr-Movies.Torrent.SeedingMode] RemoveDeadTrackers = true RemoveTrackerWithMessage = [ "skipping tracker announce (unreachable)", "No such host is known", "unsupported URL protocol" ]
File Filtering:
toml[Radarr-Movies.Torrent] CaseSensitiveMatches = false FolderExclusionRegex = ["\\bextras?\\b", "\\bsamples?\\b", "\\bfeaturettes?\\b"] FileNameExclusionRegex = ["\\bsample\\b", "\\btrailer\\b"] FileExtensionAllowlist = [".mp4", ".mkv", ".avi", ".sub", ".srt"] AutoDelete = false # Auto-delete non-playable files (.exe, .png, etc.)
Free Space Monitoring:
toml[Settings] FreeSpace = "50G" # Pause when <50GB free (K/M/G/T units) FreeSpaceFolder = "/downloads" # Path to monitor AutoPauseResume = true # Required for FreeSpace to work
How it works:
Disable monitoring:
toml[Settings] FreeSpace = "" # Empty string or 0 disables monitoring
qBitrr can automatically update itself by checking GitHub releases for new versions. The update behavior varies by installation type.
Update Detection:
Installation Types:
| Type | Detection | Update Method | Version Control |
|---|---|---|---|
| Git | .git directory exists | git checkout <tag> or git pull | Checks out specific release tag |
| PyPI | Installed via pip | pip install qBitrr2==<version> | Installs exact version from PyPI |
| Binary | PyInstaller executable | Notification only | Logs download URL for manual update |
Why different methods?
Basic Setup:
toml[Settings] AutoUpdateEnabled = true AutoUpdateCron = "0 3 * * 0" # Cron expression (default: Sunday 3 AM)
Cron Expression Examples:
bash0 3 * * 0 # Every Sunday at 3:00 AM 0 */6 * * * # Every 6 hours 0 0 * * * # Daily at midnight 0 2 * * 1-5 # Weekdays at 2:00 AM
For Git & PyPI Installations:
Check Phase:
Download Phase:
git fetch --tags && git checkout v<version>pip install --upgrade qBitrr2==<version>Verification Phase:
Restart Phase:
os.execv()For Binary Installations:
Example binary update log:
[INFO] Update available: v5.4.2 -> v5.4.3 [INFO] Binary installation detected - manual update required [INFO] Download: [***] [INFO] Instructions: 1. Download the binary for your platform 2. Extract the archive 3. Replace current executable with new binary 4. Restart qBitrr
Via WebUI:
Via Command Line:
bash# Git installation cd /path/to/qBitrr git fetch --tags git checkout v5.4.3 # or: git pull qbitrr # restart # PyPI installation pip install --upgrade qBitrr2 # or: pip install qBitrr2==5.4.3 # specific version qbitrr # restart # Binary installation # Download from: [***] # Extract and replace binary, then restart # Docker installation docker pull feramance/qbitrr:latest docker restart qbitrr # or: docker-compose pull && docker-compose up -d
GitHub API Dependency:
Version Verification:
Draft & Prerelease Handling:
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像服务
在 Docker Desktop 配置镜像
Docker Compose 项目配置
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
在宝塔面板一键配置镜像
Synology 群晖 NAS 配置
飞牛 fnOS 系统配置镜像
极空间 NAS 系统配置服务
爱快 iKuai 路由系统配置
绿联 NAS 系统配置镜像
QNAP 威联通 NAS 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
免费版仅支持 Docker Hub 访问,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等;免费版仅支持 docker.io。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
来自真实用户的反馈,见证轩辕镜像的优质服务