Удобная торрентокачалка с управлением через web и android для выделенного сервера

В данной заметке я хочу рассказать, как сделать универсальную торрентокачалку с управлением через интернет как с web интерфейса так и из Android приложения.

Тут будет рассказано о настройке связки rtorrent + rutorrent + nginx + php-fpm + transdroid на Debian Wheezy. Сразу отвечу на вопрос, почему не transmission, во первых при большом количестве раздач/закачек она падает, во вторых слабо кастомизируется и не имеет плагинов для автоматизации поиска и закачки новинок ну и просто лично мне не нравится.

В случае с rtorrent версия из репозитория собрана без xmlrpc-c, так что придется пересобрать самим, официальная документация проектов содержит только вариант настройки с apache, что мне не подошло о всех трудностях и их решении будет рассказано ниже.

Постараюсь максимально комментировать все настройки и конфиги, чтоб можно было понять как система работает, а не заниматься тупым копипастом.

Надеюсь владельцам собственных NASов и выделенных серверов будет интересно.

Все команды для удобства привожу из под root, без использования sudo.

Картинок будет мало, в основном команды и пояснения, для максимально быстрого воспроизведения конфигурации.

Настройка необходимых репозиториев

В /etc/apt/sources.list добавим:

# Понадобится для некоторых плагинов.
deb http://www.deb-multimedia.org stable main non-free
# Свежая версия php и mysql
deb http://packages.dotdeb.org wheezy all
deb-src http://packages.dotdeb.org wheezy all
# Свежий nginx
deb http://nginx.org/packages/debian/ wheezy nginx
deb-src http://nginx.org/packages/debian/ wheezy nginx

Устанавливаем ключи:

apt-get update && apt-get install deb-multimedia-keyring
wget http://www.dotdeb.org/dotdeb.gpg -O- |apt-key add -
gpg --keyserver hkp://keys.gnupg.net --recv-keys ABF5BD827BD9BF62
gpg -a --export 7BD9BF62 | apt-key add -

Обнобляемся:

apt-get update && apt-get upgrade

Ставим необходимые пакеты (надеюсь ничего не забыл):

apt-get install build-essential autoconf automake libtool libncurses5-dev libncursesw5-dev libcurl4-openssl-dev screen openssl php5 php5-cli curl libcppunit-dev libsigc++-2.0-dev subversion php5-cgi nginx php5-common php5-fpm php5-gd php-pear checkinstall git

Если в системе раньше стоял rtorrent из репозитория, удаляем его:

apt-get purge rtorrent libtorrent*

Сборка нужных пакетов

При сборке всех трех пакетов может быть ошибка с номером версии, я предпочитаю задавать дату сборки, также при сборке может ругаться на отсутствие директорий, просто создать их и запустить заново.

Сборка и установка xmlrpc-c

Создадим директорию, где будут исходники:

mkdir ~/svn

Перейдем в нее:

cd ~/svn

Получим свежие сорсы:

svn co https://xmlrpc-c.svn.sourceforge.net/svnroot/xmlrpc-c/advanced/ xmlrpc-c

Переходим в полученную директорию:

cd xmlrpc-c

Собираем:

./configure --disable-cplusplus 
make 
checkinstall -D
Сборка libtorrent (пункты те-же по-этому кратко)
cd ~/svn 
git clone https://github.com/rakshasa/libtorrent
cd libtorrent
./autogen.sh 
./configure 
make 
checkinstall -D
Сборка rtorrent
cd ~/svn 
git clone https://github.com/rakshasa/rtorrent
cd rtorrent
./autogen.sh 
./configure --with-xmlrpc-c 
make
checkinstall -D

Подключаем нужные либы, без этого в дальнейшем rtorrent не запустится:

echo "include /usr/local/lib" | tee -a /etc/ld.so.conf 
ldconfig

Пробуем запустить rtorrent, если все OK он запустится, но поругается на отсутствие конфигурационного файла, выйти можно по Ctrl+Q.

Создадим пользователя (в моем примере это пользователь p2p), домашней директорией которого будет наша папка с торрентами, группой для него сделаем www-data:

adduser --home /hdd --shell /bin/bash --ingroup www-data p2p

Перейдем в него:

su p2p

Создадим конфиг для rtorrent:

nano ~/.rtorrent.rc

С таким содержимым:

#Необходимо для взаимосвязи с rutorrent и transdroid
scgi_port = 127.0.0.1:5000
 
#IP нашего сервера, на котором будет работать rtorrent, если таких несколько
bind = 192.168.0.2
ip = 192.168.0.2
 
#минимальное число пиров на торрент
min_peers = 1
#максимальное число пиров на торрент
max_peers = 100
#максимальная скорость загрузки. 0 — не ограничена
download_rate = 0
#максимальная скорость отдачи. 0 — не ограничена
upload_rate = 10000
#Устанавливает количество раздач с торрента
max_uploads = 50
#каталог для сохранения закачек или откуда будут сидироваться торренты.
directory = /hdd/torrent/download/
#Где будем хранить сессии
session = /hdd/torrent/.session/
#Если мало свободного места, останавливаем все закачки. Порог остановки задан close_low_diskspace=
schedule = low_diskspace,5,60,close_low_diskspace=30000M
# отображаем подробное содержание ошибок
#промежуток между стартом rTorrent и первым после этого стартом ruTorrent никакой полезной работы производиться
# не будет. Чтобы избежать этого, нужно добавить в конфигурационный файл rTorrent специально обученную строчку:
# Путь к php и путь к initplugins.php, содержащемуся в скриптах rutorrent
execute = {sh,-c,/usr/bin/php /var/www/rutorrent/php/initplugins.php &}
#Задаем порт (или нескольких портов) который открывает клиент для обмена данными 
# (не забываем разрешить на фаирволе)
port_range = 40500-40999
# Каждый раз использовать случайный порт из диапазона.
port_random = yes
#проверять хэш торрента после закачки
check_hash = yes
#сохранять сессию
session_save = yes
#принимать зашифрованные входящие соединения, устанавливать не зашифрованные 
#исходящие соединения, если возвращает ошибку, повторять с шифрованием, 
#предпочитать открытый текст после установления зашифрованного соединения
encryption = allow_incoming,enable_retry,prefer_plaintext
#использовать udp
use_udp_trackers = yes
# Разрешает работу DHT для безтрекерных торрентов или для случаев, 
# когда все ретрекеры лежат (не работают). 
# Может принимать значения «disable» (для полного отключения DHT), 
#«off» (не стартует с DHT), «auto» (Включает DHT при возможности), 
# или «on» (принудительно включает DHT). Значение DHT по умолчанию «off».
# Для правильной работы DHT каталог сеансов «session» должен быть определен.
#
dht = auto
#
# UDP порт, используемый DHT.
#
dht_port = 6881
# Принудительно устанавливает кодировку UTF-8 для xmlrpc. 
# Рекомендуется для устранения проблем при использовании
# в наименованиях торрентов символов кириллицы. 
# Актуально для GUI, работающих через xmlrpc.
encoding_list = utf8

Снова пробуем запустить rtorrent, если какой-либо параметр в конфиге не верный, получим ошибку с номером строки, исправляем, пробуем снова, если все нормально, создадим скрипт автозапуска, для этого вернемся в root, команда exit в терминале, вернет нас из сессии p2p в сессию root:

wget http://libtorrent.rakshasa.no/raw-attachment/wiki/RTorrentCommonTasks/rtorrentInit.sh
mv rtorrentInit.sh /etc/init.d/rtorrent
chmod +x /etc/init.d/rtorrent

Переходим в скрипт автозапуска:

nano /etc/init.d/rtorrent

Изменяем строчку user="p2p" на нашего пользователя.

Пробуем запуститься:

/etc/init.d/rtorrent start

Проверяем что все запустилось:

ps aux | grep rtorrent

Должны увидеть похожие строки

p2p 10443 0.0 0.0 23388 1516? Ss 13:17 0:00 SCREEN -dm -S rtorrent
p2p 10449 0.0 0.3 110904 7120 pts/2 Ssl+ 13:17 0:00 rtorrent

С rtorrent закончили, теперь перейдем к настройке фронтендов.

Настройка nginx

Для простоты я выложу содержание своих конфигов, с комментариями где это необходимо:

nano /etc/nginx/nginx.conf

Приводим к виду:

# Пользователь с правами которого работает nginx
user www-data;
# Рекомендуется устанавливать по числу ядер
worker_processes 2;
pid /var/run/nginx.pid;
worker_rlimit_nofile 8192;
events {
# Максимальное число подключений к серверу на один worker-процесс
worker_connections 1024;
# Эффективный метод обработки соединений, используемый в Linux 2.6+
use epoll;
}
http {
##
# Базовые настройки
#Организовываем кеш для FastCGI сервера, я использую раздел в ram
fastcgi_cache_path /tmp/fcgi-cache/ levels=1:2 keys_zone=one:10m;
#Используем sendfile, но осторожно, если надо отдавать большие файлы,
#то sendfile случается вредит
sendfile on;
#Ограничиваем размер сегмента отправляемой за одну
#блокируемую отдачу
sendfile_max_chunk 128k;
#Буфер отдачи которы используется для обрабатываемых данных
postpone_output 1460;
#Размер хеша для доменных имен.
server_names_hash_bucket_size 64;
#Размер данных принемаемых post запросом
client_max_body_size 15m;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# При ошибках не говорим врагу версию nginx
server_tokens off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
 
# Это важный момент, помните мы задавали строку scgi_port в начале конфига .rtorrent.rc
# так вот тут в строке server введем те-же параметры. Необходимо будет для работы /RPC
upstream backendrtorrent {
server 127.0.0.1:5000;
}
 
##
# Настройка логов
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
 
# Настройки сжатия
gzip on;
gzip_disable «msie6»;
ssi on;
##
 
# Настройка виртуальных доменов
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
nano /etc/nginx/sites-enabled/000-default

Приводим к виду:

server {
# Папка, где будет располагаться rutorrent
root /var/www/rutorrent;
# Настройка логов, каждому виртуальному домену — свой лог
#access_log /var/log/nginx/default-access.log;
access_log off;
error_log /var/log/nginx/default-error.log;
 
#Замена .htaccess блокируем доступ к некоторым поддиректориям движка
location /conf/ {
deny all;
}
location /share/ {
deny all;
}
# А вот и /RPC2, через который наши фронтенды будут управлять rtorrent`ом
# Авторизация нужна обязательно, иначе кто угодно будет управлять вашей качалкой.
location /RPC2 {
auth_basic «Private ZONE.»;
auth_basic_user_file /var/www/rutorrent/.htpasswd;
include /etc/nginx/scgi_params;
scgi_pass backendrtorrent;
}
 
# Подключаем все шаблоны для проверки, на реальных хостах будем использовать только нужные.
include /etc/nginx/templates/default;
include /etc/nginx/templates/php;
}
nano /etc/nginx/templates/default

Приводим к виду:

# Типовые настройки общие для всех доменов (если не захочется экзотики)
##
index index.html index.php;
 
location / {
# Basic HTTP authentication закрываем паролем доступ к нашему rutorrent
auth_basic «Private ZONE.»;
# auth_basic on;
auth_basic_user_file /var/www/rutorrent/.htpasswd;
}
 
# Закрываем доступ к файлами .htaccess и .htpassword и не логируем лишнее.
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { allow all; access_log off; log_not_found off; }
location = /apple-touch-icon.png { access_log off; log_not_found off; }
location = /apple-touch-icon-precomposed.png { access_log off; log_not_found off; }
location ~ /. { deny all; access_log off; log_not_found off; }
 
#Усложняем жизнь скрипт-кидди и блочим популярные сканеры по UA
if ( $http_user_agent ~* (nmap|nikto|wikto|sf|sqlmap|bsqlbf|w3af|acunetix|havij|appscan) ) {
return 403;
}
nano /etc/nginx/templates/php

Приводим к виду:

# Передаём обработку PHP-скриптов PHP-FPM
location ~ .php$ {
try_files $uri =404;
#PHP-FPM слушает на Unix сокете, данная настройка должна совпадать с 
# listen = /tmp/wwwpool.sock в файле /etc/php5/fpm/pool.d/www.conf
fastcgi_pass unix:/tmp/wwwpool.sock;
fastcgi_buffers 8 256k;
fastcgi_buffer_size 128k;
fastcgi_intercept_errors on;
#Использовать cache зона one
fastcgi_cache one;
#Помещать страницу в кеш, после 3-х использований. Меньшее число вызвало у меня труднообъяснимые глюки
# на формах регистрации
fastcgi_cache_min_uses 3;
#Кешировать перечисленные ответы
fastcgi_cache_valid 200 301 302 304 5m;
#Формат ключа кеша — по этому ключу nginx находит правильную страничку
fastcgi_cache_key "$request_method|$host|$request_uri";
#Если не использовать эту опцию — то в форумах все будут сидеть под именем первого вошедшего на форум
fastcgi_hide_header «Set-Cookie»;
#Этот запрос заставит nginx кешировать все что проходит через него
fastcgi_ignore_headers «Cache-Control» «Expires»;
fastcgi_index index.php;
# fastcgi_intercept_errors on; # только на период тестирования
# Включаем параметры из /etc/nginx/fastcgi_param
include fastcgi_params;
# Путь к скрипту, который будет передан в php-fpm
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_ignore_client_abort off;
}

Настройки кеширования можно отключить или использовать другие параметры на свое усмотрение, я брал типовые.

Также желательно задать таймзону в настройках php, для этого в файлах /etc/php5/fpm/php.ini и /etc/php5/cli/php.ini зададим переменную со своей зоной, в моем случае это киевское время.

date.timezone = "Europe/Kiev"

Займемся движком rutorrent

cd /var/www/
wget https://rutorrent.googlecode.com/files/rutorrent-3.5.tar.gz
tar -xzf rutorrent-3.5.tar.gz
rm rutorrent-3.5.tar.gz
cd rutorrent

Можно выкачивать плагины по одному с сайта. Я предпочитаю скачать все сразу, а потом удалить ненужное (описание плагинов есть тут):

rmdir plugins
wget https://rutorrent.googlecode.com/files/plugins-3.5.tar.gz
tar -xzf plugins-3.5.tar.gz
rm plugins-3.5.tar.gz

Чуток подправим конфиг движка:

В файле:

nano conf/config.php

Меняем переменную на корень файлов с торрентами:

$topDirectory = `/hdd/torrent/`;

Сгенерируем логин и пароль для доступа к движку, можно использовать htpasswd из поставки apache, но у нас его нет, по-этому сгенерим подручными средствами:

echo -e "your-username:`perl -le `print crypt("your-password","salt")``" > /var/www/rutorrent/.htpasswd

В имени пользователя не забываем в конце оставить двоеточие.

Меняем владельца дирректории на нашего:

chown -R p2p:www-data /var/www/rutorrent

Перезапускаем nginx и php:

service nginx restart
service php5-fpm restart

В браузере набираем ip нашего сервера, вводим сгенерированные ранее логин и пароль, и попадаем в панель управления нашей качалкой.

Удобная торрентокачалка с управлением через web и android для выделенного сервера

С web мордой закончили, тонкая настройка и описание возможностей есть на официальном сайте, повторяться не буду, перейдем к удобному управлению с android.

Скачиваем на телефон и/или планшет:

Устанавливаем и запускаем.

Выбираем "Добавить новый сервер":

  • Имя: Любое на выбор
  • Тип сервера: rTorrent
  • Ip адрес или имя домена: свой ip сервера или домен
  • Порт: 80
  • Использовать авторизацию: ставим галочку
  • Указываем свои имя и пароль в соответствующих полях.
  • Папка: без изменений
  • В дополнительных настройках галочки на свой вкус
  • Операционная система: Linux
  • Адрес ftp: p2p: пароль@ip_сервера/torrent/download/ (указываем доступ к ftp папке, об настройке ftp ниже.)

Так как ssl мы не использовали, остальное без изменений.

После этого можно зайти на свой сервер и увидеть текущие закачки, остальные настройки программы на свой вкус.

Удобная торрентокачалка с управлением через web и android для выделенного сервера

Ставим FTP сервер, очень кратко

apt-get install proftpd

В стандартном конфиге /etc/proftpd/proftpd.conf меняем:

ServerName                      "My torrent server"
Раскоментируем
DefaultRoot                   ~ # Запираем пользователей в их домашних дирректориях
Добавляем
RootLogin                       off  # запрещаем подключать от пользователя root
# определять имя хоста клиента по IP адресу (желательно отключать для ускорения доступа)
UseReverseDNS                     off
PassivePorts                  40000 40499 # Чтоб не пересекались с rtorrent

Более тонкую настройку можно посмотреть в множестве статей на эту тему, в рамках данной статьи такого минимума достаточно:

service proftpd restart

Ставим самбу

Необходима для удобства локального доступа, также очень кратко:

apt-get install samba

Приводим конфиг /etc/samba/smb.conf к виду:

; Глобальные настройки сервера
[global]
; General server settings
; Имя компа, как будет видно в сетевом окружении
netbios name = torrent-box
server string =
; Рабочая группа клиентов
workgroup = WORKGROUP
announce version = 5.0
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=8192 SO_SNDBUF=8192
passdb backend = tdbsam
security = user
null passwords = true
; Файл для альясов имен юзеров
username map = /etc/samba/smbusers
name resolve order = hosts wins bcast
wins support = yes
; Логи
log file = /var/log/samba/log.%m
syslog = 0
syslog only = no
; Настройка привязки к интерфейсам, на каких слушать, если не указано слушает на все интерфейсах
interfaces = eth0
; bind interfaces only = true
; Шара жесткого диска
; Имя шары, видно у клиентов
[torrent]
; Путь к расшариваемому диску
path = /hdd/
; Можно ли просматривать
browseable = yes
read only = no
guest ok = no
create mask = 0644
directory mask = 0755

Генерируем пароль для нашего пользователя:

smbpasswd -a p2p

Включаем пользователя:

smbpasswd -e p2p

И так в результате мы получили работающий торрент сервер, с богатыми возможностями управления, доступ к скачанным файлам по smb и ftp, из дополнительных удобств могу посоветовать использовать ряд плагинов для rutorrent, позволяющих автоматизировать закачку новинок. Всем спасибо за внимание.

Ищите где купить металлопластиковые окна? Заходите на сайт citiokna.ru! Цены и качество обслуживания вас поразят!

solid
2013-06-24 10:20:00
Давно так сделал, только без трансдроида... можно еще сюда авто- пере- закачку торрентов прикрутить, для тех случаев, где "раздача ведется путем добавления новых серий" :) тоже так сделал, оч. удобно:)
Sergey
2013-07-07 20:26:00
Возможно, у нас разное представление о большом количестве закачек. При их постоянном количестве около 200 штук Transmission работает вполне себе хорошо. Не падает, памяти не ест. Веб-интерфейс для управления у него есть, но мне он без надобности. Положил *.torrent в одну шару, забрал скачанный файл из другой. В Google Play есть приложение (как минимум одно) для управления Transmission. Задачи автоматически что-то искать и скачивать передо мной никогда не стояло.