Найти тему
Типичный Админ

Установка и настройка Rtorrent + Rutorrent на FreeBSD + Nginx.

Всем привет. Собственно, речь пойдёт снова про мой домашний сервер. Сейчас у меня на нём уже работает вот этот сайт, почта, фтп и облако. Захотелось на него ещё и торрент-клиент поставить, ибо некоторые дистрибутивы порою через торренты приходится скачивать.

Итак, задачу я себе поставил такую:
- настроить консольный rtorrent
- настроить вэб-интерфейс rutorrent к нему, работающий на nginx
- настроить возможность скачивания загруженных торрентов через ФТП.

В этом во всём мне помогли вот эти статьи:

http://www.volmed.org.ru/wiki/index.php/Небольшой_хелп_по_пользованию_rtorrent_-_консольный_клиент_torrent_сети
https://wiki.archlinux.org/index.php/RTorrent_(Русский)
http://habrahabr.ru/post/121138
https://syslinux.ru/node/106
http://free-pc-help.ru/freebsd/rtorrent-na-freebsd
http://allbsd.blogspot.ru/2011/03/rtorrentrutorrent-freebsd-8x.html
http://www.lissyara.su/rtorrent+utorrent_webui

Как и всегда, начну с обновления портов:

portsnap fetch update

Потом ставим rtorrent:

cd /usr/ports/net-p2p/rtorrent
make install clean

Опции сборки я выбрал такие:

опции сборки зависимостей, в которых я делал изменения:

-2

Теперь надо уставноить программку screen, чтобы можно было запускать rtorrent в режиме демона:

cd /usr/ports/sysutils/screen
make install clean

Опции сборки:

-3

я снял «info» и «xterm_256» за ненадобностью оных. Но можно и оставить — ничего страшного не будет.
После установки всех нужных пакетов, надо создать пользователя, из-под которого будет запускаться rtorrent:

adduser

Username: p2p
Full name:
Uid (Leave empty for default):
Login group [p2p]: ftp
Login group is ftp. Invite p2p into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]:
Home directory [/home/p2p]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username : p2p
Password : *****
Full Name :
Uid : 1912
Class :
Groups : ftp
Home : /home/p2p
Home Mode :
Shell : /bin/sh
Locked : no
OK? (yes/no): yes

Я создал пользователя p2p и внёс его в группу ftp, поскольку мне нужен будет доступ к торрентам через фтп. Для этого пользователя автоматически создался домашний каталог /home/p2p, в котором надо создать файл с названием .rtorrent.rc. Этот файл и будет конфигом для rtorrent. Его содержимое надо сделать таким:

# максимальное и минимальное число пиров на каждый торрент
min_peers = 40
max_peers = 400

# Тоже самое что и выше, только для сидируемых торрентов (-1 для тех значений что на скачках)
# min_peers_seed = 10
# max_peers_seed = 50

# Максимальное число одновременных отдач на торрент
# max_uploads = 15

# глобальная скорость скачивания и отдачи. "0" — без лимита
download_rate = 0
upload_rate = 1000

# Директория для сохранения торрентов.
directory = /usr/home/ftpserv/torrents

# Директория для хранения файлов сессий, не допускается запуск более одной копии
# rtorrent'а (одного и того же торрента) с заданием одной и той же директории.
session = /usr/home/ftpserv/torrents/session

# Смотрим директорию на наличие новых торрентов для загрузки, и тормозим торрент если
# если .torrent файл удалён
# schedule = watch_directory,5,5,load_start=./watch/*.torrent
# schedule = untied_directory,5,5,stop_untied=

# закрываем торренты если мало места на диске.
# schedule = low_diskspace,5,60,close_low_diskspace=100M

# айпишник сообщаемый трекеру.
# ip = 127.0.0.1
# ip = rakshasa.no

# По какому адресу можно подключаться к rtorrent
# bind = 127.0.0.1
# bind = rakshasa.no

# диапазон портов для прослушки.
port_range = 6890-6900

# открывать или нет порты внутри диапазона со случайных значений.
port_random = no

# проверять или нет хеш скачанного торента. Может быть полезно до фикса бага,
# из-за которого свободное место отображается неверно.
check_hash = yes

# разрешает клиенту испольование UDP трекеров.
use_udp_trackers = yes

# альтернативные вызовы бинда и IP для управления динамическим адресом.
# schedule = ip_tick,0,1800,ip=rakshasa
# schedule = bind_tick,0,1800,bind=rakshasa

# Опции шифрования. По умолчанию не шифрует.
# пример разрешает входящие зашифрованные соединения: начинать не шифрованные
# исходящие соединения, но повторять шифрованными если не получилось.
# Предпочтение отдаётся открытому тексту вместо RC4, после неудачного шифрования
# encryption = allow_incoming,enable_retry,prefer_plaintext

# разрешаем dht, подробнее читаем тут: http://ru.wikipedia.org/wiki/DHT
dht = auto

# порт для ипсользования DHT.
# dht_port = 6881

# разрешить обмен пирами(если торренты не отмечены как частные)
#
# peer_exchange = yes

#
# Do not modify the following parameters unless you know what you're doing.
#

# Кол-во памяти запрашиваемое у ядра. Малое значение может вызвать
# простой дисковой подсистемы, большое — к сбросу страниц памяти.
# hash_read_ahead = 10

# интервал между попытками хеширования.
# hash_interval = 100

# кол-во попыток проверки хеша во время mincore-статуса,
# перед принуждением. Нагруженные системы должны использовать меньшие
# значения для получения нормальной скорости проверки хеша.
# hash_max_tries = 10

# указание сокета, который будет создаваться при старте rtorrent. Через этот сокет будет
# подключаться rutorrent к rtorrent
scgi_local = /tmp/rpc.sock

# маска на создаваемые файлы rtorrent'ом. Маска 007 будет давать права rwxrwx---
# Мне это нужно для дуступа к файлам через фтп.
system.umask.set = 007

Не забываем поправить права на этот файл:

chown p2p:ftp .rtorrent.rc

Следующим шагом надо создать скрипт запуска rtorrent как демона. Для этого надо перейти в каталог /usr/local/etc/rc.d и создать там файл rtorrent вот с таким содержимым:

#!/bin/sh
#
# rtorrent RCng startup script
# by Emanuele Cipolla (mail at emanuelecipolla dot net)
# Shamelessly ripped off the aMule startup script by Gabriele Cecchetti (amule.org forum)
#

# PROVIDE: rtorrent
# REQUIRE: NETWORKING SERVERS
# BEFORE: DAEMON
# KEYWORD: shutdown

#
# Add the following lines to /etc/rc.conf to enable rtorrent at startup
# rtorrent (bool): Set to "NO" by default.
# Set it to "YES" to enable rtorrent
# rtorrent_user (str): Set to user running rtorrent
# (default 'p2p')
# rtorrent_home (str): Set to home directory of user running rtorrent
# (default /home/${rtorrent_user})

. /etc/rc.subr

name="rtorrent"
rcvar=`set_rcvar`

load_rc_config $name

umask 111

[ -z "$rtorrent_enable" ] && rtorrent_enable="NO"
[ -z "$rtorrent_user" ] && rtorrent_user="p2p"
[ -z "$rtorrent_home" ] && rtorrent_home="/home/${rtorrent_user}"

required_dirs=${rtorrent_home}
required_files="${rtorrent_home}/.rtorrent.rc"

start_cmd="${name}_start"
stop_cmd="${name}_stop"

rtorrent_start()
{
if [ ! -f /var/run/${name}.run ]
then
cd ${rtorrent_home}
su ${rtorrent_user} -c "/usr/local/bin/screen -dmS rtorrent_init /usr/local/bin/rtorrent"
touch /var/run/${name}.run
echo "Started ${name}."
echo `date` : "Started ${name}." >> /var/log/${name}.log
else
echo "${name} seems to be already running -- remove /var/run/${name}.run manually if needed."
fi
}
rtorrent_stop()
{
if [ -f /var/run/${name}.run ]
then
killall -INT $(echo -n 'ps aux | grep rtorrent | grep -v rtorrent_init') 2>>/var/log/${name}.log >>/var/log/${name}.log
rm -f /var/run/${name}.run
rm -f /tmp/rpc.sock
echo "Stopped ${name}."
echo `date` : "Stopped ${name}." >> /var/log/${name}.log
else
echo "${name} doesn't seem to be running -- create /var/run/${name}.run if needed."
fi
}
run_rc_command "$1"

Нужно обратить внимание, что в этом файле тоже есть параметр umask. Здесь он для того, чтобы сокет для подключения к rtorrent создался с правами rw-rw-rw. Иначе же, он будет создаваться с правами rwxr-x---, и rutorrent к нему не сможет подключиться, поскольку он будет работать от пользователя www. Это очень важный момент!

Не забываем сделать этот скрипт исполняемым:

chmod +x rtorrent

Также, не забываем добавить строчку в /etc/rc.conf:

rtorrent_enable="YES"

И не забываем про ещё один важный момент: создаём катлоги torrents и session, которые указаны в конфиге .rtorrent.rc:

mkdir /usr/home/ftpserv/torrents
mkdir /usr/home/ftpserv/torrents/session

ftpserv — это мой корневой каталог на моём ФТП-сервере. Обязательно надо дать на них вот такие права:

chown -R p2p:ftp /usr/home/ftpserv/torrents
chmod +x /usr/home/ftpserv/torrents/session

Это тоже важный момент.

И вот сейчас пробуем стартовать rtorrent:

rehash
service rtorrent start

Чтобы проверить, действительно ли он запустился, делаем команду:

ps -A | grep rtorrent

Вывод должен быть таким:

1891 ?? Ss 0:00,00 /usr/local/bin/screen -dmS rtorrent_init /usr/local/bin/rtorrent
1897 1 R+ 0:00,00 grep rtorrent
1894 2 Ss+ 0:00,03 /usr/local/bin/rtorrent

Если нет, то надо перепроверить, всё ли правильно сделано выше.

Теперь дело дошло до установки Rutorrent. Скачиваю его здесь:

http://code.google.com/p/rutorrent/downloads/list

Скачиваю сам rutorrent-3.5.tar.gz и все плагины к нему в одном архиве: plugins-3.5.tar.gz.
Содержимое rutorrent-3.5.tar.gz распаковываю в каталог
/usr/home/www/rutorrent. А содержимое plugins-3.5.tar.gz распаковываю в каталог /usr/home/www/rutorrent/plugins. И конечно не забываю дать права на каталог с руторрентом:

chown -R www:www /usr/home/www/rutorrent

Затем перехожу к настройке nginx. У меня всё это хозяйство заработало с довольно наипростейшим конфигом. Вобщем, в конфиг (в конец конфига перед последним завершающим символом « } » ) nginx дописываю вот такие строчки:

# rtorrent переброс с http на https.
server {
listen 80;
server_name p2p.example.com;
return https://$server_name$request_uri;
}

# rtorrent (ssl/tls)
server {
listen 443 ssl;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
server_name p2p.example.com;
root /usr/home/www/rutorrent;
index index.php index.html index.htm default.html default.htm;

location ~ .*.php$ {
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param HTTPS on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

}
}

и перезапускаем nginx.

Но заходить на вэб-интерфейс пока не торопимся. Сначала откроем файл /usr/home/www/rutorrent/conf/config.php и посмотрим, что в нём. А в нём видим, что надо закомментировать строчки:

// $scgi_port = 5000;
// $scgi_host = "127.0.0.1";

и раскомментировать и поправить вот эти строчки:

$scgi_port = 0;
$scgi_host = "unix:///tmp/rpc.sock";

Также, желательно отредактировать и вот этот параметр:

$log_file = '/var/log/rutorrent-errors.log';

Вот теперь можно попробовать зайти в вэб-интерфейс. И сразу же видим вот такую ругань:

[05.05.2013 16:30:56] rss: Часть функциональности плагина будет недоступна. Веб сервер не имеет доступа к внешней программе (curl).
[05.05.2013 16:30:56] unpack: Плагин не будет работать. Пользователю rTorrent не доступна внешняя программа (php).
[05.05.2013 16:30:56] rutracker_check: Плагин не будет работать. Пользователю rTorrent не доступна внешняя программа (php).
[05.05.2013 16:30:56] autotools: Плагин не будет работать. Пользователю rTorrent не доступна внешняя программа (php).
[05.05.2013 16:30:56] retrackers: Плагин не будет работать. Пользователю rTorrent не доступна внешняя программа (php).
[05.05.2013 16:30:56] rss: Плагин не будет работать. Пользователю rTorrent не доступна внешняя программа (php).
[05.05.2013 16:30:56] ratio: Часть функциональности плагина будет недоступна. Пользователю rTorrent не доступна внешняя программа (php).
[05.05.2013 16:30:56] history: Плагин не будет работать. Пользователю rTorrent не доступна внешняя программа (php).
[05.05.2013 16:30:56] create: Плагин не будет работать. Пользователю rTorrent не доступна внешняя программа (php).
[05.05.2013 16:30:56] scheduler: Плагин не будет работать. Пользователю rTorrent не доступна внешняя программа (php).
[05.05.2013 16:30:56] trafic: Плагин не будет работать. Пользователю rTorrent не доступна внешняя программа (php).
[05.05.2013 16:30:56] mediainfo: Плагин не будет работать. Пользователю rTorrent не доступна внешняя программа (mediainfo).
[05.05.2013 16:30:56] rss: Часть функциональности плагина будет недоступна. Пользователю rTorrent не доступна внешняя программа (curl).
[05.05.2013 16:30:56] screenshots: Плагин не будет работать. Пользователю rTorrent не доступна внешняя программа (ffmpeg).
[05.05.2013 16:30:57] Плагин DataDir: пользователю rTorrent не доступен интерпретатор php. Плагин не будет работать.
[05.05.2013 16:30:57] Плагин Unpack: Программа unrar недоступна пользователю rTorrent.

Будем разбираться по порядку. Суть ругани в том, что программа не видит некоторые другие программы, нужные для работы некоторых плагинов. Чтобы это поправить, снова откроем файл /usr/home/www/rutorrent/conf/config.php и найдём в нём вот такие строчки:

$pathToExternals = array(
"php" => '', // Something like /usr/bin/php. If empty, will be found in PATH.
"curl" => '', // Something like /usr/bin/curl. If empty, will be found in PATH.
"gzip" => '', // Something like /usr/bin/gzip. If empty, will be found in PATH.
"id" => '', // Something like /usr/bin/id. If empty, will be found in PATH.
"stat" => '', // Something like /usr/bin/stat. If empty, will be found in PATH.
);

Собственно здесь просто надо указать реальные пути к программам, это будет выглядеть так:

$pathToExternals = array(
"php" => '/usr/local/bin/php', // Something like /usr/bin/php. If empty, will be found in PATH.
"curl" => '/usr/local/bin/curl', // Something like /usr/bin/curl. If empty, will be found in PATH.
"gzip" => '/usr/bin/gzip', // Something like /usr/bin/gzip. If empty, will be found in PATH.
"id" => '/usr/bin/id', // Something like /usr/bin/id. If empty, will be found in PATH.
"stat" => '/usr/bin/stat', // Something like /usr/bin/stat. If empty, will be found in PATH.
);

сохраняем и снова пробуем зайти в вэб-интерфейс. И на этот раз видим, что ругани стало меньше, но она всё равно есть:

[05.05.2013 16:36:26] mediainfo: Плагин не будет работать. Пользователю rTorrent не доступна внешняя программа (mediainfo).
[05.05.2013 16:36:26] screenshots: Плагин не будет работать. Пользователю rTorrent не доступна внешняя программа (ffmpeg).
[05.05.2013 16:36:27] Плагин Unpack: Программа unrar недоступна пользователю rTorrent.

Начнём с того, что надо установить программы, на отсутствие которых жалуется rutorrent. Приступим. Ставлю mediainfo:

cd /usr/ports/multimedia/mediainfo
make install clean

Тут всё поставилось без всяких опций и вопросов.

Ставлю ffmpeg:

cd /usr/ports/multimedia/ffmpeg
make install clean

А вот тут будут и опции и зависимости. В опциях самого ffmpeg и отметил (точнее снял флажки) вот что:

-4

ffmpeg нужен для плагина screenshots, который делает скриншоты из видео-файлов. Поэтому я лишь оставил поддержку видеокодеков в опциях сборки.

Зависимостей ffmpeg потянул много, но опции я почти везде по умолчанию оставлял. Менял лишь вот тут:

-5
-6

Ставим unrar:

cd /usr/ports/archivers/unrar
make install clean

Опции сборки по умолчанию.

После установки всех этих пакетов даём команду:

rehash

А затем находим конфигурационные файлы плагинов:

/usr/local/www/rutorrent/plugins/mediainfo/conf.php
/usr/local/www/rutorrent/plugins/screenshots/conf.php
/usr/local/www/rutorrent/plugins/unpack/conf.php

В них во всех есть вот такие строчки:

$pathToExternals['название_программы'] = '';

Где название программы у каждого своё: mediainfo, ffmpeg, unrar и unzip. Тут надо, также, указать полный путь к этим программам, т.е. Получится так соответственно:

$pathToExternals['mediainfo'] = '/usr/local/bin/mediainfo';
$pathToExternals['ffmpeg'] = '/usr/local/bin/ffmpeg';
$pathToExternals['unzip'] = '/usr/bin/unzip';
$pathToExternals['unrar'] = '/usr/local/bin/unrar';

После редактирования этих конфигов снова пытаемся зайти в вэб-интерфейс. И на этот раз всё должно быть без ругани, и все плагины — рабочими.

Есть ещё один момент, который очень часто забывается: фаервол. В /etc/ipfw.rules надо добавить правило:

# для торрентов
add 00200 allow all from any to me 6890-6900 via em0

Собственно, теперь можно попробовать позагружать торренты какие-нибудь. И если всё хорошо, то подумаем немного о безопасности. Нужно установить пароль для доступа в rutorrent, поскольку сам он не имеет средств авторизации. Это можно сделать с помощью утилиты htpasswd, которая входит в состав apache. Но проблема в том, что у меня не стоит апач, и ставить его только ради этого я не хочу. Выход простой: создать хэш с паролем на другой машине, где стоит апач, а затем скопировать его к себе. Значит, на машине с апачем, находясь в папке, напрмер, /home, вводим команду:

htpasswd -cm .passwd admin

Команда попросит ввести пароль — придумываем и вводим. В итоге получится файл с хэшем вашего пароля для пользователя admin. Этот файл копируем на машину с nginx+rutorrent в каталог, например /usr/local/etc/nginx, а в конфиг nginx.conf добавляем строчки:

auth_basic "You need the password";
auth_basic_user_file /usr/local/etc/nginx/.passwd;

Добавляем их где-нибудь после строчек:

server_name p2p.example.com;
root /usr/home/www/rutorrent;

И перезапускаем nginx. И теперь, чтоб попасть в вэб-интерфейс rutorrent, потребуется ввести логин и пароль.

Остался ещё один маленький штрих, связанный с тем, что rtorrent принадлежит к p2p:ftp, а rutorrent принадлежит к www:www. Я, из-за этого, столкнулся с тем, что не мог скачать уже загруженные файлы через вэб-интерфейс. Поправить это несложно. Надо просто пользователя www дополнительно включить в группу ftp. Это удобно сделать через webmin, который у меня уже установлен:

-7

Не забудем снова перезапустить nginx и php-fpm.

На этом всё, можно пользоваться.

#FreeBSD #Nginx #rtorrent #rutorrent #настройка #установка