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

RicoX 17 июня 2013 в 19:43 26104

Преамбула


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

Series A: Как подготовиться к крупным инвестициям

перевод
frii_fondвчера в 11:00
0

Продюсер завтрашнего дня (часть 8)

перевод
rubyrabbitвчера в 20:36
0

Nintendo зафиксировала значительный рост квартальной выручки впервые за последние 3 года

semen_grinshteinвчера в 15:54
0

Кейс Planner 5D: как аналитика devtodev помогла увеличить ARPU на 25%

vsabirovвчера в 13:46
0

Выручка Avito выросла на 47%

marksвчера в 13:38
4

Революция Искусственного интеллекта — путь к Супер-интеллекту

из песочницы
ipistsovвчера в 13:23
11

Во втором квартале операционная прибыль «Яндекса» уменьшилась на 40%, а рост выручки превзошел ожидания

semen_grinshteinвчера в 18:24
0

Сколько должно быть уровней управления

craft_brotherвчера в 15:17
0

Выручка Facebook за II квартал увеличилась на 39%, а расходы – на 82%

semen_grinshteinвчера в 14:07
1

Счетная палата РФ признала работу Минкомсвязи по созданию программы импортозамещения ПО неудовлетворительной

semen_grinshteinвчера в 13:25
3