Files
docs/tutorials/media-manager/site/steps/install-qbittorrent/index.html
aetos 52c756e052
Some checks reported errors
continuous-integration/drone/push Build was killed
tutorials/media-manager (#1)
Reviewed-on: #1
2025-11-20 17:37:18 +00:00

858 lines
23 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="prev" href="../install-plex/">
<link rel="next" href="../setup-media-manager/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.23">
<title>Install Qbittorrent - Media Manager Tutorial</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.84d31ad4.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"JetBrains Mono"}</style>
<link rel="stylesheet" href="https://unpkg.com/dracula-prism/dist/css/dracula-prism.css">
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="blue-grey" data-md-color-accent="teal">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#installing-qbittorrent-host-installation" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="Media Manager Tutorial" class="md-header__button md-logo" aria-label="Media Manager Tutorial" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 17H3V5h18m0-2H3a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5v2h8v-2h5a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Media Manager Tutorial
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Install Qbittorrent
</span>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--integrated" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="Media Manager Tutorial" class="md-nav__button md-logo" aria-label="Media Manager Tutorial" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 17H3V5h18m0-2H3a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5v2h8v-2h5a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2"/></svg>
</a>
Media Manager Tutorial
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/" class="md-nav__link">
<span class="md-ellipsis">
Getting Started
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-ellipsis">
Installation
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../overview/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../setup-mount-points/" class="md-nav__link">
<span class="md-ellipsis">
Setup Mount Points
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../install-docker/" class="md-nav__link">
<span class="md-ellipsis">
Install Docker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../install-plex/" class="md-nav__link">
<span class="md-ellipsis">
Install Plex
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Install Qbittorrent
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Install Qbittorrent
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#what-is-qbittorrent" class="md-nav__link">
<span class="md-ellipsis">
🌀 What Is qBittorrent?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#why-qbittorrent-should-not-run-in-docker" class="md-nav__link">
<span class="md-ellipsis">
❌ Why qBittorrent Should NOT Run in Docker
</span>
</a>
<nav class="md-nav" aria-label="❌ Why qBittorrent Should NOT Run in Docker">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#1-docker-slows-torrent-hashing" class="md-nav__link">
<span class="md-ellipsis">
1. Docker slows torrent hashing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2-permissions-become-complicated" class="md-nav__link">
<span class="md-ellipsis">
2. Permissions become complicated
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3-stable-real-file-paths-are-necessary" class="md-nav__link">
<span class="md-ellipsis">
3. Stable real file paths are necessary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#4-performance-is-better-on-the-host" class="md-nav__link">
<span class="md-ellipsis">
4. Performance is better on the host
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#why-qbittorrent-configuration-does-not-need-external-hdd" class="md-nav__link">
<span class="md-ellipsis">
📦 Why qBittorrent Configuration Does NOT Need External HDD
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#installation-script-systemd-service" class="md-nav__link">
<span class="md-ellipsis">
⚙️ Installation Script (Systemd Service)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#installation-script" class="md-nav__link">
<span class="md-ellipsis">
⚙️ Installation Script
</span>
</a>
<nav class="md-nav" aria-label="⚙️ Installation Script">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#download-script" class="md-nav__link">
<span class="md-ellipsis">
📥 Download Script
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#after-installation" class="md-nav__link">
<span class="md-ellipsis">
🚀 After Installation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#next-step-setup-arr-stack-docker-compose" class="md-nav__link">
<span class="md-ellipsis">
➡️ Next Step: Setup ARR Stack (Docker Compose)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../setup-media-manager/" class="md-nav__link">
<span class="md-ellipsis">
Setup Media Manager
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-ellipsis">
Optional Installation
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Optional Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../install-samba/" class="md-nav__link">
<span class="md-ellipsis">
Install Samba
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="installing-qbittorrent-host-installation">Installing qBittorrent (Host Installation)</h1>
<p>qBittorrent is the download engine of your media automation setup. It handles all torrent activity triggered by Radarr,
Sonarr, and Prowlarr. Installing it on the <strong>host system</strong> (not Docker) ensures optimal speed, stable paths, and maximum
compatibility.</p>
<p>This guide explains:</p>
<ul>
<li>What qBittorrent does in the media pipeline</li>
<li>Why it should <em>not</em> run inside Docker in a real-world Pi/home server setup</li>
<li>Why its configuration does <strong>not</strong> need to be moved to your external drive</li>
<li>The installation script used to install and run qBittorrent as a systemd service</li>
</ul>
<hr />
<h2 id="what-is-qbittorrent">🌀 What Is qBittorrent?</h2>
<p>qBittorrent is an opensource torrent client featuring:</p>
<ul>
<li>Lightweight Web UI</li>
<li>Fast download engine</li>
<li>Built-in category and tagging support</li>
<li>Excellent integration with Radarr &amp; Sonarr</li>
<li>Very low resource usage</li>
</ul>
<p>It acts as the <strong>download worker</strong> for the entire Media Manager.</p>
<p>When Radarr or Sonarr find new media, they send the torrent to qBittorrent. Upon completion, ARR processes renaming and
file management.</p>
<hr />
<h2 id="why-qbittorrent-should-not-run-in-docker">❌ Why qBittorrent Should NOT Run in Docker</h2>
<p>Though technically possible, running qBittorrent in Docker on low-power hardware like Raspberry Pi causes significant
issues:</p>
<h3 id="1-docker-slows-torrent-hashing">1. Docker slows torrent hashing</h3>
<ul>
<li>Torrenting requires intensive hashing and verifying large files</li>
<li>Dockers overlay filesystem adds overhead, causing slower hashing and higher CPU usage</li>
</ul>
<h3 id="2-permissions-become-complicated">2. Permissions become complicated</h3>
<ul>
<li>Bind-mounted volumes in Docker cause UID/GID mismatches</li>
<li>Sonarr/Radarr struggle to access or import completed downloads correctly</li>
<li>On the host, file permissions behave predictably and natively</li>
</ul>
<h3 id="3-stable-real-file-paths-are-necessary">3. Stable real file paths are necessary</h3>
<ul>
<li>qBittorrent expects actual Linux paths (e.g., <code>/mnt/omnissiah-vault/downloads</code>)</li>
<li>Containers often abstract paths, confusing ARRs automation</li>
</ul>
<h3 id="4-performance-is-better-on-the-host">4. Performance is better on the host</h3>
<ul>
<li>Download speeds, disk writes, and hashing all run faster without Dockers overhead</li>
</ul>
<p><strong>Conclusion:</strong></p>
<ul>
<li><strong>qBittorrent performs best installed directly on the host system.</strong></li>
</ul>
<hr />
<h2 id="why-qbittorrent-configuration-does-not-need-external-hdd">📦 Why qBittorrent Configuration Does NOT Need External HDD</h2>
<p>Unlike Plexs large metadata, qBittorrent stores only minor config files such as:</p>
<ul>
<li>Configuration settings</li>
<li>Small torrent resume files</li>
<li>A lightweight database</li>
</ul>
<p>Typical config size: <strong>220 MB</strong> — negligible and stable.</p>
<p>Keeping qBittorrent config on your systems internal OS disk is safe and recommended.</p>
<hr />
<h2 id="installation-script-systemd-service">⚙️ Installation Script (Systemd Service)</h2>
<h2 id="installation-script">⚙️ Installation Script</h2>
<p>This tutorial uses an installation script that:</p>
<ul>
<li>Updates and upgrades system packages</li>
<li>Installs qBittorrent-nox (the headless version)</li>
<li>Creates a dedicated system user for qBittorrent</li>
<li>Adds your normal user to the qBittorrent group for file access</li>
<li>Creates a systemd service file to run qBittorrent as a background service</li>
<li>Enables and starts the qBittorrent service to run at boot</li>
</ul>
<p>After running the script, you can access qBittorrents Web UI and begin configuring your download settings.</p>
<h3 id="download-script">📥 Download Script</h3>
<p>👉 <strong><a href="../../scripts/shell/install-qbittorrent.sh">install-qbittorrent.sh</a></strong></p>
<hr />
<h2 id="after-installation">🚀 After Installation</h2>
<p>Access the Web UI at:</p>
<div class="language-text highlight"><span class="filename">Text Only</span><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>http://&lt;your_pi_ip&gt;:8080
</code></pre></div>
<p>Default credentials:</p>
<div class="language-text highlight"><span class="filename">Text Only</span><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>username: admin
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>password: adminadmin
</code></pre></div>
<p><strong>Change your password on first login!</strong></p>
<ul>
<li>Configure download directories</li>
<li>Add categories such as <code>movies</code> and <code>tv</code></li>
<li>Disable any unwanted torrenting features</li>
</ul>
<p>ARR integration will be configured after the Docker-based ARR stack is deployed.</p>
<hr />
<h2 id="next-step-setup-arr-stack-docker-compose">➡️ Next Step: Setup ARR Stack (Docker Compose)</h2>
<p>Now that host-based components (Plex and qBittorrent) are ready, proceed to deploy the ARR stack via Docker Compose to
automate searching, downloading, and organizing your media.</p>
<p>Go to 👉 <strong><a href="../setup-media-manager/">Setup Media Manager</a></strong></p>
<hr />
</article>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.expand", "navigation.sections", "navigation.top", "toc.integrate", "content.code.annotate", "content.code.copy", "content.code.select", "content.code.line_numbers", "content.tabs.link", "content.tooltips", "content.action.edit", "search.suggest", "search.highlight", "search.share", "header.autohide", "announce.dismiss", "footer.social"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.f55a23d4.min.js"></script>
</body>
</html>