324 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			324 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
--- 
 | 
						||
navigation: true
 | 
						||
title: Qbittorrent
 | 
						||
main:
 | 
						||
  fluid: false
 | 
						||
---
 | 
						||
:ellipsis{left=0px width=40rem top=10rem blur=140px}
 | 
						||
# Qbittorrent
 | 
						||
 | 
						||
::alert{type="info"}
 | 
						||
🎯 __Goals:__
 | 
						||
- Install and configure Qbittorrent
 | 
						||
- Securely connect to the BitTorrent network using Gluetun and Proton VPN
 | 
						||
::
 | 
						||
 | 
						||

 | 
						||
 | 
						||
To safely download your favorite media, we'll build a system using:
 | 
						||
 | 
						||
- [Qbittorrent](https://github.com/linuxserver/docker-qbittorrent) as the BitTorrent client
 | 
						||
- [Proton VPN Plus](https://protonvpn.com/torrenting), a VPN to secure your traffic. You need a subscription (promos available) to access the BitTorrent protocol. You can also use another VPN as long as it supports BitTorrent.
 | 
						||
- [Gluetun](https://github.com/qdm12/gluetun)
 | 
						||
- [Qbittorrent port update](https://codeberg.org/TechnoSam/qbittorrent-gluetun-port-update) to automatically update the VPN port (which changes regularly).
 | 
						||
- The [VueTorrent](https://github.com/gabe565/linuxserver-mod-vuetorrent) mod for a modern and intuitive UI.
 | 
						||
 | 
						||
Here’s the system we’ll set up:
 | 
						||
 | 
						||

 | 
						||
 | 
						||
## Configuration
 | 
						||
---
 | 
						||
Folder structure
 | 
						||
 | 
						||
```sh
 | 
						||
root
 | 
						||
├── docker
 | 
						||
│   └── seedbox
 | 
						||
│       ├── qbittorrent
 | 
						||
│       │   └── config
 | 
						||
│       ├── gluetun
 | 
						||
│       ├── compose.yaml
 | 
						||
│       └── .env
 | 
						||
│       
 | 
						||
└── media #linked to Plex and Qbittorrent
 | 
						||
    ├── downloads #generic downloads, selected in settings
 | 
						||
    ├── movies #used for downloading movies
 | 
						||
    └── tvseries #used for downloading TV shows
 | 
						||
```
 | 
						||
 | 
						||
If not already done, create the `downloads` folder under `/media`:
 | 
						||
 | 
						||
```sh
 | 
						||
mkdir -P /media/downloads
 | 
						||
```
 | 
						||
 | 
						||
Open Dockge, click on `compose`, and name the stack `seedbox`. Paste the following config:
 | 
						||
 | 
						||
```yaml
 | 
						||
 | 
						||
services:
 | 
						||
  qbit:
 | 
						||
    image: ghcr.io/linuxserver/qbittorrent:latest
 | 
						||
    container_name: qbittorrent
 | 
						||
    restart: unless-stopped
 | 
						||
    network_mode: service:gluetun
 | 
						||
    mem_limit: 1g
 | 
						||
    environment:
 | 
						||
      - DOCKER_MODS=ghcr.io/gabe565/linuxserver-mod-vuetorrent|ghcr.io/t-anc/gsp-qbittorent-gluetun-sync-port-mod:main
 | 
						||
      - TZ=Europe/Paris
 | 
						||
      - PUID=${PUID}
 | 
						||
      - PGID=${GUID}
 | 
						||
      - WEBUI_PORT=${UI_PORT}
 | 
						||
      - GSP_GTN_API_KEY=${GSP_KEY}
 | 
						||
      - GSP_QBT_USERNAME=${ID}
 | 
						||
      - GSP_QBT_PASSWORD=${PW}
 | 
						||
    volumes:
 | 
						||
      - /docker/seedbox/qbittorrent/config:/config
 | 
						||
      - /media:/media
 | 
						||
    depends_on:
 | 
						||
      - gluetun
 | 
						||
 | 
						||
  gluetun:
 | 
						||
    image: qmcgaw/gluetun:v3.40
 | 
						||
    container_name: gluetun
 | 
						||
    restart: unless-stopped
 | 
						||
    mem_limit: 1g
 | 
						||
    volumes:
 | 
						||
      - /docker/gluetun/config.toml:/gluetun/auth/config.toml:ro
 | 
						||
    devices:
 | 
						||
      - /dev/net/tun:/dev/net/tun
 | 
						||
    ports:
 | 
						||
      - ${UI_PORT}:5695 # Port de la web-ui
 | 
						||
      - 8000:8000 # Port de controle de Gluetun
 | 
						||
    cap_add:
 | 
						||
      - NET_ADMIN
 | 
						||
    environment:
 | 
						||
      - TZ=Europe/Paris
 | 
						||
      - VPN_SERVICE_PROVIDER=protonvpn
 | 
						||
      - VPN_PORT_FORWARDING=on
 | 
						||
      - VPN_PORT_FORWARDING_PROVIDER=protonvpn
 | 
						||
      - VPN_TYPE=wireguard
 | 
						||
      - WIREGUARD_PRIVATE_KEY=${PR_KEY}
 | 
						||
      - SERVER_COUNTRIES=France
 | 
						||
      - PORT_FORWARD_ONLY=on
 | 
						||
```
 | 
						||
 | 
						||
::alert{type="success"}
 | 
						||
✨ __Tip:__ Add the Watchtower label in each container to automate updates
 | 
						||
 | 
						||
```yaml
 | 
						||
services:
 | 
						||
  qbittorrent:
 | 
						||
    #...
 | 
						||
    labels:
 | 
						||
      - com.centurylinklabs.watchtower.enable=true
 | 
						||
  gluetun:
 | 
						||
    #...
 | 
						||
    labels:
 | 
						||
      - com.centurylinklabs.watchtower.enable=true
 | 
						||
```
 | 
						||
::
 | 
						||
 | 
						||
Before editing the `.env` in Dockge, let's configure the download port update. Proton and most VPNs rotate the forwarding port, which must be communicated to Qbittorrent.
 | 
						||
 | 
						||
We’ve added the mod `ghcr.io/t-anc/gsp-qbittorent-gluetun-sync-port-mod` to the container.
 | 
						||
 | 
						||
We now need to allow the mod to fetch info from Gluetun, which only allows encrypted communication via its API.
 | 
						||
 | 
						||
Open a terminal to generate the authentication key:
 | 
						||
 | 
						||
```sh
 | 
						||
sudo docker run --rm qmcgaw/gluetun genkey
 | 
						||
```
 | 
						||
 | 
						||
Note the key, then create the `/docker/gluetun` folder:
 | 
						||
 | 
						||
```sh
 | 
						||
sudo mkdir /docker/gluetun
 | 
						||
```
 | 
						||
 | 
						||
Create the `config.toml` file:
 | 
						||
 | 
						||
```sh
 | 
						||
sudo vi /docker/gluetun/config.toml
 | 
						||
```
 | 
						||
 | 
						||
Press `i` to edit and enter:
 | 
						||
 | 
						||
```toml
 | 
						||
[[roles]]
 | 
						||
name = "t-anc/GSP-Qbittorent-Gluetun-sync-port-mod"
 | 
						||
routes = ["GET /v1/openvpn/portforwarded"]
 | 
						||
auth = "apikey"
 | 
						||
apikey = "your_key_here" # key you just generated
 | 
						||
```
 | 
						||
 | 
						||
Press `Esc` then type `:x` to save and exit.
 | 
						||
 | 
						||
In Dockge, fill in the variables in `.env`:
 | 
						||
 | 
						||
```properties
 | 
						||
PUID=
 | 
						||
GUID=
 | 
						||
UI_PORT=
 | 
						||
PR_KEY=
 | 
						||
GSP_KEY= # the key you generated and entered in config.toml
 | 
						||
ID=
 | 
						||
PW=
 | 
						||
```
 | 
						||
 | 
						||
Detailed info:
 | 
						||
 | 
						||
| Variable   | Description | Example |
 | 
						||
|------------|-------------|---------|
 | 
						||
| `PUID`     | User ID (`id yourusername`) | `1000` |
 | 
						||
| `GUID`     | Group ID (`id yourusername`) | `1000` |
 | 
						||
| `UI_PORT`  | Port for accessing the web UI | `5695` |
 | 
						||
| `PR_KEY`   | Private key from Proton | `buKsjNHLyzKMM1qYnzOy4s7SHfly` |
 | 
						||
| `GSP_KEY`  | Key you generated for port update | `MnBa47MeVmk7xiv` |
 | 
						||
| `ID`       | Qbittorrent UI login username | `user` |
 | 
						||
| `PW`       | Qbittorrent UI password | `password` |
 | 
						||
 | 
						||
## Deployment
 | 
						||
---
 | 
						||
Once done, deploy the container.
 | 
						||
 | 
						||
::alert{type="warning"}
 | 
						||
:::list{type="warning"}
 | 
						||
- **Startup logs will show a temporary password for `admin` user**
 | 
						||
:::
 | 
						||
::
 | 
						||
 | 
						||
Login at `http://server-ip:5695` (or the port you set).
 | 
						||
 | 
						||
::alert{type="danger"}
 | 
						||
:::list{type="danger"}
 | 
						||
- __If login fails:__ check your firewall rules.
 | 
						||
:::
 | 
						||
::
 | 
						||
 | 
						||
Change your username and password in the "webui" settings.
 | 
						||
 | 
						||
You're done! In Qbittorrent settings, under "Downloads", set `/media/downloads` as the default folder.
 | 
						||
 | 
						||
When adding a download, remember to select the proper directory so Plex can sync correctly (`/media/movies` or `/media/tvseries`). You can also automate this with categories and folders.
 | 
						||
 | 
						||
## Exposing the Web UI
 | 
						||
---
 | 
						||
 | 
						||
::alert{type="warning"}
 | 
						||
:::list{type="warning"}
 | 
						||
- Qbittorrent does not support multi-factor authentication. Exposing it to the internet may put your system at risk. Only do this if you use MFA via [Authentik](/serveex/security/authentik/). Otherwise, don’t expose it with SWAG—use a VPN like [Wireguard](/serveex/security/wireguard) instead.
 | 
						||
:::
 | 
						||
::
 | 
						||
 | 
						||
To start downloads from outside your home, without a VPN, you can expose the Qbittorrent web UI.
 | 
						||
 | 
						||
::alert{type="info"}
 | 
						||
:::list{type="info"}
 | 
						||
- We assume you have the subdomain `seedbox.mydomain.com` with a `CNAME` pointing to `mydomain.com` in [DNS zone](/general/networking/dns). And that port `443` on your router is forwarded to your server in [NAT rules](/general/networking/nat), unless you’re using Cloudflare Zero Trust.
 | 
						||
:::
 | 
						||
::
 | 
						||
 | 
						||
In Dockge, edit the SWAG compose file and add Gluetun’s network:
 | 
						||
 | 
						||
```yaml
 | 
						||
services:
 | 
						||
  swag:
 | 
						||
    container_name: # ...
 | 
						||
    # ...
 | 
						||
    networks:
 | 
						||
      # ...
 | 
						||
      - seedbox
 | 
						||
 | 
						||
networks:
 | 
						||
  # ...
 | 
						||
  seedbox:
 | 
						||
    name: seedbox_default
 | 
						||
    external: true
 | 
						||
```
 | 
						||
 | 
						||
Click "Deploy" and wait for SWAG to fully initialize.
 | 
						||
 | 
						||
::alert{type="info"}
 | 
						||
:::list{type="info"}
 | 
						||
- We assume the network name is `seedbox_default`. You can confirm by checking the SWAG dashboard at http://server-ip:81.
 | 
						||
:::
 | 
						||
::
 | 
						||
 | 
						||
Now create/edit `seedbox.subdomain.conf`.
 | 
						||
 | 
						||
::alert{type="success"}
 | 
						||
✨ __Terminal-free tip:__ use [File Browser](/serveex/files/file-browser) to edit files instead of using the terminal.
 | 
						||
::
 | 
						||
 | 
						||
```sh
 | 
						||
sudo vi /docker/swag/config/nginx/proxy-confs/seedbox.subdomain.conf
 | 
						||
```
 | 
						||
 | 
						||
Press `i` and paste the following config (check the port):
 | 
						||
 | 
						||
```nginx
 | 
						||
## Version 2023/12/19
 | 
						||
 | 
						||
server {
 | 
						||
    listen 443 ssl;
 | 
						||
    listen [::]:443 ssl;
 | 
						||
 | 
						||
    server_name seedbox.*;
 | 
						||
 | 
						||
    include /config/nginx/ssl.conf;
 | 
						||
 | 
						||
    client_max_body_size 0;
 | 
						||
 | 
						||
    #if ($lan-ip = yes) { set $geo-whitelist yes; }
 | 
						||
    #if ($geo-whitelist = no) { return 404; }
 | 
						||
    if ($geo-blacklist = no) { return 404; }
 | 
						||
 | 
						||
    # enable for ldap auth (requires ldap-location.conf in the location block)
 | 
						||
    #include /config/nginx/ldap-server.conf;
 | 
						||
 | 
						||
    # enable for Authelia (requires authelia-location.conf in the location block)
 | 
						||
    #include /config/nginx/authelia-server.conf;
 | 
						||
 | 
						||
    # enable for Authentik (requires authentik-location.conf in the location block)
 | 
						||
    #include /config/nginx/authentik-server.conf;
 | 
						||
 | 
						||
    location / {
 | 
						||
        # enable the next two lines for http auth
 | 
						||
        #auth_basic "Restricted";
 | 
						||
        #auth_basic_user_file /config/nginx/.htpasswd;
 | 
						||
 | 
						||
        # enable for ldap auth (requires ldap-server.conf in the server block)
 | 
						||
        #include /config/nginx/ldap-location.conf;
 | 
						||
 | 
						||
        # enable for Authelia (requires authelia-server.conf in the server block)
 | 
						||
        #include /config/nginx/authelia-location.conf;
 | 
						||
 | 
						||
        # enable for Authentik (requires authentik-server.conf in the server block)
 | 
						||
        #include /config/nginx/authentik-location.conf;
 | 
						||
 | 
						||
        include /config/nginx/proxy.conf;
 | 
						||
        include /config/nginx/resolver.conf;
 | 
						||
        set $upstream_app gluetun;
 | 
						||
        set $upstream_port 5555;
 | 
						||
        set $upstream_proto http;
 | 
						||
        proxy_pass $upstream_proto://$upstream_app:$upstream_port;
 | 
						||
 | 
						||
    }
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
::alert{type="success"}
 | 
						||
✨ You can secure this app with Authentik by uncommenting the `authentik-server.conf` and `authentik-location.conf` lines. Don’t forget to [create an app and provider in Authentik](/serveex/security/authentik#protecting-an-app-via-reverse-proxy).
 | 
						||
::
 | 
						||
 | 
						||
Press `Esc`, type `:x` to save and quit.
 | 
						||
 | 
						||
Wait a few minutes, then go to `https://seedbox.mydomain.com`—you should land on the Qbittorrent interface.
 | 
						||
 | 
						||
And that’s it! You now have a ready-to-use media center.
 | 
						||
 | 
						||

 |