...

понедельник, 17 июня 2013 г.

Удобная торрентокачалка с управлением через 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.

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

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.

Всем спасибо за внимание.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Комментариев нет:

Отправить комментарий