В данной заметке я хочу рассказать, как сделать универсальную торрентокачалку с управлением через интернет как с 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
:
//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
&
amp
;
}
#Задаем порт (или нескольких портов) который открывает клиент для обмена данными
# (не забываем разрешить на фаирволе)
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/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
")``"
&
gt
;
/
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.
Скачиваем на телефон и/или планшет:
- transdroid.org/latest
- transdroid.org/latest-search
Устанавливаем и запускаем.
Выбираем "Добавить новый сервер":
- Имя: Любое на выбор
- Тип сервера: 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, позволяющих автоматизировать закачку новинок. Всем спасибо за внимание.