BitTorrent

We'll start with the installation of a Transmission server, based on a Debian template.

Installation

> apt-get install transmission-daemon

This will start the transmission daemon process (service), it will be running under a new user created at install time: 'debian-transmission'. Note that, at the same time, a directory belonging to this same user was also created: '/var/lib/transmission-daemon'. It contains a 'downloads' folder and a symlink to the configuration directory.

We'll create a “seeding” directory and edit the configuration file, for this we need to stop the service first:

> mkdir /var/lib/transmission-daemon/seeding
> chown debian-transmission:debian-transmission /var/lib/transmission-daemon/seeding
> service transmission-daemon stop
> nano /var/lib/transmission-daemon/info/settings.json

Refering to https://ctrl.blog/entry/how-to-server-seeding-dht-torrents, here are the important settings to set:

"download-dir": "/var/lib/transmission/seeding",
"incomplete-dir": "/var/lib/transmission/seeding",
"dht-enabled": true,
"lpd-enabled": true,
"pex-enabled": true,
"peer-limit-per-torrent": 10,
"port-forwarding-enabled": false,
"queue-stalled-enabled": false,
"speed-limit-down": 50,
"speed-limit-down-enabled": true,
"speed-limit-up": 50,
"speed-limit-up-enabled": true,
"upload-slots-per-torrent": 5,
"user-has-given-informed-consent": true,
"watch-dir": "/var/lib/transmission/seeding",
"watch-dir-enabled": true,

For a complete description of all options: https://web.archive.org/web/20160428165927/https://trac.transmissionbt.com/wiki/EditConfigFiles

For detailed instructions on how to use Transmission: https://help.ubuntu.com/community/TransmissionHowTo

System Configuration

To avoid Transmission eating up all the system's resources, edit /lib/systemd/system/transmission-daemon.service:

> nano /lib/systemd/system/transmission-daemon.service
ADD @ end of [Service] section
[Service]
...
Nice=16
IOSchedulingClass=idle
CPUSchedulingPolicy=idle
MemoryMax=25M
MemoryHigh=35M
ProtectSystem=true

> systemctl daemon-reload

Note that we reload daemons for our changes to take effect.

UDP socket buffers

Setting “message-level”: 3, in /var/lib/transmission-daemon/info/settings.json, then monitoring /var/log/syslog, or better /var/log/daemon.log will show:

Jun  2 04:18:24 transmission-20 transmission-daemon[4243]: [2017-06-02 04:18:24.532 CEST] UDP Failed to set receive buffer: requested 4194304, got 425984 (tr-udp.c:78)
Jun  2 04:18:24 transmission-20 transmission-daemon[4243]: [2017-06-02 04:18:24.534 CEST] UDP Failed to set send buffer: requested 1048576, got 425984 (tr-udp.c:89)

It seems Transmission is willing to get a 4MB receive buffer and a 1MB send buffer, while only 256K are available. We'll fix that using the following commands:

> echo 'net.core.rmem_max = 16777216' >> /etc/sysctl.conf
> echo 'net.core.wmem_max = 4194304' >> /etc/sysctl.conf
> sysctl -p

For production servers with hundreds of connections 16MB receive and 4MB send buffers are recommended read more here...

https://github.com/da2x/mitorrent

First we must follow this installation guide to setup an appropriate python environment, we also need to have 'git' installed, so we can clone the GitHub repo.

Install

> apt-get install git-core
> su py3
> cd $HOME
> git clone https://github.com/da2x/mitorrent.git
> cd mitorrent
> mkvirtualenv mitorrent
> chmod +x mitorrent-runner.py

Usage

> su py3
> cd $HOME/mitorrent
> workon mitorrent
> ./mitorrent-runner.py path/to/original/file > path/to/torrent/file.torrent