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

RicoX17 июня 2013 в 19:43

Преамбула


В данной заметке я хочу рассказать, как сделать универсальную торрентокачалку с управлением через интернет как с 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.


Скачиваем на телефон и/или планшет
http://transdroid.org/latest
http://transdroid.org/latest-search
устанавливаем и запускаем.

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

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



Ставим 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, позволяющих автоматизировать закачку новинок. Из связных проектов хотел бы отменить torrentmonitor от хабраюзера KorP.
Всем спасибо за внимание.
Лучшее на Geektimes

Леонард Нимой ушёл из жизни в возрасте 83 лет

FakeFactFelisвчера в 22:01
3

Почему технологии 40-летней давности управляют воздушным движением?

alizarсегодня в 00:08
37

Великобритания планирует изменение правил дорожного движения в связи с появлением робомобилей

SLY_Gвчера в 19:40
30

Все международные домены, зарегистрированные на жителей Крыма, будут удалены

Haooseвчера в 22:15
95

В 2016 году на Луне состоятся гонки луноходов

marksвчера в 20:02
5

Швейцарские часовщики объединяются для борьбы с Apple и Google

перевод
Cat1987вчера в 19:51
28

Google собирается построить «стеклянную утопию» в Маунтин-Вью

marksсегодня в 13:37
2

3D-принтер для еды Foodini скоро сможет напечатать вам обед

SLY_Gвчера в 19:49
1

Microsoft даёт легально скачивать ISO-образы Windows 7

alizarсегодня в 17:51
0

Китайские интернет-гиганты удалили со своих сайтов более 60 000 аккаунтов

перевод
Cat1987сегодня в 16:30
4