
В данной заметке я хочу рассказать, как сделать универсальную торрентокачалку с управлением через интернет как с web интерфейса так и из Android приложения.
Тут будет рассказано о настройке связки rtorrent + rutorrent + nginx + php-fpm + transdroid на Debian Wheezy. Сразу отвечу на вопрос, почему не transmission, во первых при большом количестве раздач/закачек она падает, во вторых слабо кастомизируется и не имеет плагинов для автоматизации поиска и закачки новинок ну и просто лично мне не нравится.
В случае с rtorrent версия из репозитория собрана без xmlrpc-c, так что придется пересобрать самим, официальная документация проектов содержит только вариант настройки с apache, что мне не подошло о всех трудностях и их решении будет рассказано ниже.
Постараюсь максимально комментировать все настройки и конфиги, чтоб можно было понять как система работает, а не заниматься тупым копипастом.
Надеюсь владельцам собственных NASов и выделенных серверов будет интересно.
Все команды для удобства привожу из под root, без использования sudo.
Картинок будет мало, в основном команды и пояснения, для максимально быстрого воспроизведения конфигурации.
Настройка необходимых репозиториев
В /etc/apt/sources.list добавим:
1 2 3 4 5 6 7 8 |
# Понадобится для некоторых плагинов. 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 |
Устанавливаем ключи:
1 2 3 4 |
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 - |
Обнобляемся:
1 |
apt-get update && apt-get upgrade |
Ставим необходимые пакеты (надеюсь ничего не забыл):
1 |
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 из репозитория, удаляем его:
1 |
apt-get purge rtorrent libtorrent* |
Сборка нужных пакетов
При сборке всех трех пакетов может быть ошибка с номером версии, я предпочитаю задавать дату сборки, также при сборке может ругаться на отсутствие директорий, просто создать их и запустить заново.
Сборка и установка xmlrpc-c
Создадим директорию, где будут исходники:
1 |
mkdir ~/svn |
Перейдем в нее:
1 |
cd ~/svn |
Получим свежие сорсы:
1 |
svn co https://xmlrpc-c.svn.sourceforge.net/svnroot/xmlrpc-c/advanced/ xmlrpc-c |
Переходим в полученную директорию:
1 |
cd xmlrpc-c |
Собираем:
1 2 3 |
./configure --disable-cplusplus make checkinstall -D |
Сборка libtorrent (пункты те-же по-этому кратко)
1 2 3 4 5 6 7 |
cd ~/svn git clone https://github.com/rakshasa/libtorrent cd libtorrent ./autogen.sh ./configure make checkinstall -D |
Сборка rtorrent
1 2 3 4 5 6 7 |
cd ~/svn git clone https://github.com/rakshasa/rtorrent cd rtorrent ./autogen.sh ./configure --with-xmlrpc-c make checkinstall -D |
Подключаем нужные либы, без этого в дальнейшем rtorrent не запустится:
1 2 |
echo "include /usr/local/lib" | tee -a /etc/ld.so.conf ldconfig |
Пробуем запустить rtorrent, если все OK он запустится, но поругается на отсутствие конфигурационного файла, выйти можно по Ctrl+Q.
Создадим пользователя (в моем примере это пользователь p2p), домашней директорией которого будет наша папка с торрентами, группой для него сделаем www-data:
1 |
adduser --home /hdd --shell /bin/bash --ingroup www-data p2p |
Перейдем в него:
1 |
su p2p |
Создадим конфиг для rtorrent:
1 |
nano ~/.rtorrent.rc |
С таким содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#Необходимо для взаимосвязи с 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:
1 2 3 |
wget http://libtorrent.rakshasa.no/raw-attachment/wiki/RTorrentCommonTasks/rtorrentInit.sh mv rtorrentInit.sh /etc/init.d/rtorrent chmod +x /etc/init.d/rtorrent |
Переходим в скрипт автозапуска:
1 |
nano /etc/init.d/rtorrent |
Изменяем строчку user="p2p" на нашего пользователя.
Пробуем запуститься:
1 |
/etc/init.d/rtorrent start |
Проверяем что все запустилось:
1 |
ps aux | grep rtorrent |
Должны увидеть похожие строки
1 2 |
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
Для простоты я выложу содержание своих конфигов, с комментариями где это необходимо:
1 |
nano /etc/nginx/nginx.conf |
Приводим к виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# Пользователь с правами которого работает 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/*; } |
1 |
nano /etc/nginx/sites-enabled/000-default |
Приводим к виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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; } |
1 |
nano /etc/nginx/templates/default |
Приводим к виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# Типовые настройки общие для всех доменов (если не захочется экзотики) ## 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; } |
1 |
nano /etc/nginx/templates/php |
Приводим к виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# Передаём обработку 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 зададим переменную со своей зоной, в моем случае это киевское время.
1 |
date.timezone = "Europe/Kiev" |
Займемся движком rutorrent
1 2 3 4 5 |
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 |
Можно выкачивать плагины по одному с сайта. Я предпочитаю скачать все сразу, а потом удалить ненужное (описание плагинов есть тут):
1 2 3 4 |
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 |
Чуток подправим конфиг движка:
В файле:
1 |
nano conf/config.php |
Меняем переменную на корень файлов с торрентами:
1 |
$topDirectory = `/hdd/torrent/`; |
Сгенерируем логин и пароль для доступа к движку, можно использовать htpasswd из поставки apache, но у нас его нет, по-этому сгенерим подручными средствами:
1 |
echo -e "your-username:`perl -le `print crypt("your-password","salt")``" > /var/www/rutorrent/.htpasswd |
В имени пользователя не забываем в конце оставить двоеточие.
Меняем владельца дирректории на нашего:
1 |
chown -R p2p:www-data /var/www/rutorrent |
Перезапускаем nginx и php:
1 2 |
service nginx restart service php5-fpm restart |
В браузере набираем ip нашего сервера, вводим сгенерированные ранее логин и пароль, и попадаем в панель управления нашей качалкой.
С web мордой закончили, тонкая настройка и описание возможностей есть на официальном сайте, повторяться не буду, перейдем к удобному управлению с android.
Скачиваем на телефон и/или планшет:
Устанавливаем и запускаем.
Выбираем "Добавить новый сервер":
- Имя: Любое на выбор
- Тип сервера: rTorrent
- Ip адрес или имя домена: свой ip сервера или домен
- Порт: 80
- Использовать авторизацию: ставим галочку
- Указываем свои имя и пароль в соответствующих полях.
- Папка: без изменений
- В дополнительных настройках галочки на свой вкус
- Операционная система: Linux
- Адрес ftp: p2p: пароль@ip_сервера/torrent/download/ (указываем доступ к ftp папке, об настройке ftp ниже.)
Так как ssl мы не использовали, остальное без изменений.
После этого можно зайти на свой сервер и увидеть текущие закачки, остальные настройки программы на свой вкус.
Ставим FTP сервер, очень кратко
1 |
apt-get install proftpd |
В стандартном конфиге /etc/proftpd/proftpd.conf меняем:
1 2 3 4 5 6 7 8 |
ServerName "My torrent server" Раскоментируем DefaultRoot ~ # Запираем пользователей в их домашних дирректориях Добавляем RootLogin off # запрещаем подключать от пользователя root # определять имя хоста клиента по IP адресу (желательно отключать для ускорения доступа) UseReverseDNS off PassivePorts 40000 40499 # Чтоб не пересекались с rtorrent |
Более тонкую настройку можно посмотреть в множестве статей на эту тему, в рамках данной статьи такого минимума достаточно:
1 |
service proftpd restart |
Ставим самбу
Необходима для удобства локального доступа, также очень кратко:
1 |
apt-get install samba |
Приводим конфиг /etc/samba/smb.conf к виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
; Глобальные настройки сервера [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 |
Генерируем пароль для нашего пользователя:
1 |
smbpasswd -a p2p |
Включаем пользователя:
1 |
smbpasswd -e p2p |
И так в результате мы получили работающий торрент сервер, с богатыми возможностями управления, доступ к скачанным файлам по smb и ftp, из дополнительных удобств могу посоветовать использовать ряд плагинов для rutorrent, позволяющих автоматизировать закачку новинок. Всем спасибо за внимание.