Skip to main content

qBittorrent: migrera seedande torrents Windows → Linux

qBittorrent: migrera seedande torrents Windows → Linux (Docker)

Guide för att flytta ett stort antal seedande torrents från en qBittorrent-klient på Windows till qBittorrent i Docker på Linux – utan att bryta seedningen (viktigt för privata trackers som TorrentLeech och deras Hit-and-Run-regler).

Genomfört 2026-06-29: 193 torrents (filmer, anime, TV, PC-spel, OS-ISO) migrerade från Windowsen Server (VM 103)Windows-server till Docker-qBit på arr-server (VM 109).servern. Alla 193 seedar, verifierat reboot-säkert.

Förutsättningar

  • Källfilerna ligger redan på NAS (samma fysiska filer som Linux-klienten ska seeda).
  • Både Windows- och Linux-qBit kör en standard-release (ej beta/forkad) – annars kan trackern banna klienten. qBittorrent 5.2.2 är OK för TL.
  • Torrents har redan uppfyllt trackerns minsta seed-tid (annars: migrera ändå, men var medveten om HnR).

NAS-layout (NFS på arr-server)

NAS IP
Export Mountpoint NAS01 192.168.200.10 /volume1/Movies /mnt/media/movies NAS01 192.168.200.10 /volume1/Apps /mnt/media/apps NAS02 192.168.200.11 /volume1/TV /mnt/media/tv NAS02 192.168.200.11 /volume1/Anime /mnt/media/anime NAS02 192.168.200.11 /volume1/Games-PC /mnt/media/games-pc

Varje share ligger i /etc/fstab med _netdev och bind-monteras in i qBit-containern (/mnt/media/x:/mnt/media/x).

Steg 1 – Exportera från Windows

.torrent- och .fastresume-filerna finns i:

C:\Users\<user>\AppData\Local\qBittorrent\BT_backup\

Kopiera hela mappen (både .torrent OCH .fastresume) till en plats Linux når, t.ex. en temp-mapp på NAS.

Obs: ta ALLTID en orörd kopia som "pristine source" – rör den aldrig, återskapa alltid från den.

Steg 2 – Docker-volym

qBit-containern måste se filerna på samma sökväg som .fastresume pekar på. Lägg till NAS-mounten i docker-compose.yml:

  qbittorrent:
    volumes:
      - ./config/qbittorrent:/config
      - /mnt/media/movies:/mnt/media/movies
      - /mnt/media/tv:/mnt/media/tv
      # ...osv för varje share

Steg 3 – Skriv om sökvägarna i .fastresume

.fastresume är bencode-kodat (binärt, med längd-prefix). En enkel sed funkar INTE – man måste avkoda, byta fälten och re-koda. Två fält innehåller sökvägar:

  • save_path (libtorrents – den som faktiskt räknas)
  • qBt-savePath (qBittorrents egna)

Mappningsregel (Windows → Linux), prefix-bevarande:

Windows save_path Linux
//nas01/Movies (film i undermapp) /mnt/media/movies
//nas01/Movies/<film> (fil direkt) /mnt/media/movies/<film>
//nas02/Anime/<x> /mnt/media/anime/<x>
//nas02/TV/<x> /mnt/media/tv/<x>

Viktigt: blanket-byt inte allt till samma mapp. Om save_path inkluderar filmnamnet betyder det att innehållet är filen direkt – då måste undermappen bevaras.

Python-scriptet använder en egen bencode decode/encode med en säkerhetsspärr: encode(decode(fil)) == fil måste vara byte-identiskt innan något skrivs (annars är kodaren inte kanonisk → avbryt). Stoppa qBit innan filerna redigeras (qBit skriver över .fastresume vid avstängning).

Steg 4 – Ladda in och recheck

  1. Kopiera .torrent + omskrivna .fastresume till Linux-qBits BT_backup.
  2. docker compose up -d qbittorrent (recreate om volymer ändrats).
  3. qBit rechecker och börjar seeda. Torrents som hittar sina filer går till stalledUP/uploading.

Vanliga fel:

  • missingFiles = qBit hittar inte filerna → fel sökväg, saknad docker-volym, eller mappnamn som inte matchar (t.ex. dedup som döpt om).
  • Trailing space i mappnamn: Windows tillåter/strippar efterföljande mellanslag annorlunda än Linux. Fixa qBit-native med torrents/renameFolder-API:t (döp INTE om disk-mappen – Radarr/Jellyfin förväntar utan mellanslag).

Steg 5 – Stäng av seeding-kön

För en seedbox som ska seeda allt för alltid: stäng av köandet så alla torrents announcerar samtidigt.

POST /api/v2/app/setPreferences   json={"queueing_enabled":false}

Annars begränsar max_active_uploads/max_active_torrents hur många som faktiskt seedar.

Steg 6 – Gör det reboot-säkert (kritiskt!)

fstab med _netdev överlever reboot – men Docker väntar inte på NFS-mountsen som standard. Om Docker startar qBit innan NFS är klart bind-monteras tomma mappar → alla torrents blir missingFiles.

Fix – systemd drop-in /etc/systemd/system/docker.service.d/wait-for-nfs.conf:

[Unit]
After=remote-fs.target
Wants=remote-fs.target

Sen systemctl daemon-reload. Detta ordnar Docker efter att alla _netdev-mounts är klara.

Verifiera med en faktisk reboot: efter omstart ska alla mounts vara aktiva, qBit uppe, och alla torrents seeda (0 missingFiles).

Verifieringskommandon

# Mounts aktiva?
findmnt -t nfs4 -o TARGET,SOURCE

# fstab giltig?
sudo findmnt --verify

# qBit ser filerna?
docker exec qbittorrent ls /mnt/media/movies

# Torrent-states (via API, efter login-cookie)
curl -s -b cookie 'http://localhost:8080/api/v2/torrents/info' \
  | grep -o '"state":"[^"]*"' | sort | uniq -c

# Tracker announcerar? (status 2 = working)
curl -s -b cookie 'http://localhost:8080/api/v2/torrents/trackers?hash=<HASH>'