This stack routes only qBittorrent through WireGuard.
wireguardis the VPN gateway.qbittorrentusesnetwork_mode: "service:wireguard", so torrent traffic goes through WireGuard.jackettandflaresolverrrun onapp_netand expose their own ports.- Host access is published by the compose port mappings.
- qBittorrent Web UI: http://localhost:8090
- Jackett UI: http://localhost:9117
- Note: Jackett may return
301/302redirects to login; this is expected. - FlareSolverr API: http://localhost:8191
- Install Docker Desktop (or Docker Engine + Compose plugin).
- Configure WireGuard using
.envvalues (server mode defaults are provided in.env.example). - Optional: if you are running in client mode, place your WireGuard client config in
./configs/wireguard/(for examplewg0.conf). - Copy
.env.exampleto.envand adjust values for your host/network. - Start the stack with
docker compose up -d.
cp .env.example .env
docker compose up -dCopy-Item .env.example .env -Force
docker compose up -d- Start:
docker compose up -d - Stop:
docker compose down - Check:
docker compose ps
Full rebuild with fresh images:
docker compose down
docker compose pull
docker compose build --no-cache
docker compose up -d --remove-orphansForce recreate containers:
docker compose down
docker compose build --no-cache
docker compose up --force-recreate -dFull reset (remove volumes):
docker compose down -v
docker compose build --no-cache
docker compose up --force-recreate -d- Local data is mounted from
./configs. - Torrent downloads are stored in
./downloads.
- Images are pinned by default in
docker-compose.ymlvia environment-backed tags. - Override image versions in
.envusingWIREGUARD_IMAGE_TAG,FLARESOLVERR_IMAGE_TAG,JACKETT_IMAGE_TAG, andQBITTORRENT_IMAGE_TAG.
wireguardandflaresolverrstart independently (no dependencies).jackettdepends onflaresolverr.qbittorrentdepends onwireguard,jackett, andflaresolverr.
wireguard: checks thatwg0exists, the interface is up, and a public IP is returned from${WIREGUARD_IP_CHECK_URL:-https://api.ipify.org}flaresolverr: checkshttp://localhost:8191jackett: checkshttp://localhost:9117/and accepts200,301, or302qbittorrent: checkshttp://localhost:8090/and accepts200or302
- Typical clean startup on this host: ~70-80 seconds.
- Recent 3-run sample on current config:
| Metric | Seconds |
|---|---|
| Min | 71.29 |
| Avg | 73.74 |
| Max | 77.90 |
- Shared healthcheck cadence:
interval=20s,timeout=10s,retries=8,start_period=30s. - If startup exceeds 2-3 minutes, check logs.
- Overall status:
docker compose ps - Health-focused status:
docker compose ps --format "table {{.Name}}\t{{.State}}\t{{.Health}}\t{{.Status}}" - Timed startup (PowerShell):
$t = Measure-Command { docker compose up -d }; $t.TotalSeconds - Tail all logs:
docker compose logs -f - Tail one service:
docker compose logs -f wireguard(orflaresolverr,jackett,qbittorrent)
- Symptom: stack did not start
- Command:
docker compose ps - Expected: all services
runningandhealthy
- Command:
- Symptom: qBittorrent UI unavailable
- Command:
docker compose logs --tail=100 qbittorrent wireguard - Expected:
wireguardhealthy andqbittorrentserving onhttp://localhost:8090/
- Command:
- Symptom: Jackett API/UI failing
- Command:
docker compose logs --tail=100 jackett flaresolverr - Expected:
jacketthealthcheck returns200|301|302andflaresolverris ready
- Command:
- Symptom: VPN routing suspected down
- Command:
docker compose exec wireguard wg show - Expected: active
wg0interface and peer/session data present
- Command:
- Emergency rollback
- Command:
git checkout v1.0.0; docker compose down; docker compose up -d - Expected: stack returns to last tagged baseline
- Command:
The repository includes a monthly reminder workflow that opens a backup/restore verification issue:
Backup Restore Reminderworkflow: https://github.com/LBates2000/torrents-stack/actions/workflows/backup-restore-reminder.yml
Backup runtime config (PowerShell):
$stamp = Get-Date -Format "yyyyMMdd-HHmmss"
New-Item -ItemType Directory -Path .\backups -Force | Out-Null
Compress-Archive -Path .\configs\* -DestinationPath (".\\backups\\configs-" + $stamp + ".zip") -ForceRestore runtime config (PowerShell):
docker compose down
Expand-Archive -Path .\backups\configs-<timestamp>.zip -DestinationPath .\configs -Force
docker compose up -dAfter restore, verify health:
docker compose ps --format "table {{.Name}}\t{{.State}}\t{{.Health}}\t{{.Status}}"- If you change WireGuard peer config, restart the
wireguardcontainer. - Keep
wireguardservice healthy before app services start. - Redirect-based healthchecks are intentional:
301/302can still mean the web UI is up before login.
v1.0.3(ci: bump actions/checkout to v6): https://github.com/LBates2000/torrents-stack/releases/tag/v1.0.3v1.0.2(docs: onboarding and Jackett redirect clarifications): https://github.com/LBates2000/torrents-stack/releases/tag/v1.0.2v1.0.1(operationally verified checkpoint): https://github.com/LBates2000/torrents-stack/releases/tag/v1.0.1v1.0.0(hardened baseline): https://github.com/LBates2000/torrents-stack/releases/tag/v1.0.0- All releases: https://github.com/LBates2000/torrents-stack/releases
- Security policy: see
SECURITY.md. - Use GitHub issue templates for monthly maintenance and backup restore drills.
- License: MIT (
LICENSE). - Contribution guide: see
CONTRIBUTING.md. - Scheduled image tag drift check:
.github/workflows/image-tag-drift.yml.
- Lawrence Bates (Lawrence.Bates@gmail.com)