Всем привет. Собственно, речь пойдёт снова про мой домашний сервер Сейчас у меня на нём уже работает вот этот сайт, почта, фтп и облако. Захотелось на него ещё и торрент-клиент поставить, ибо некоторые дистрибутивы порою через торренты приходится скачивать.
Итак, задачу я себе поставил такую:
- настроить консольный 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
Опции сборки я выбрал такие:
опции сборки зависимостей, в которых я делал изменения:
Теперь надо уставноить программку screen, чтобы можно было запускать rtorrent в режиме демона:
cd /usr/ports/sysutils/screen
make install clean
Опции сборки:
я снял «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 и отметил (точнее снял флажки) вот что:
ffmpeg нужен для плагина screenshots, который делает скриншоты из видео-файлов. Поэтому я лишь оставил поддержку видеокодеков в опциях сборки.
Зависимостей ffmpeg потянул много, но опции я почти везде по умолчанию оставлял. Менял лишь вот тут:
Ставим 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, который у меня уже установлен:
Не забудем снова перезапустить nginx и php-fpm.
На этом всё, можно пользоваться