30 ноября 2009 г.

SeedBox с rTorrent / ruTorrent на базе Apache под FreeBSD своими руками

Гениальная мысль наконец-таки воспользоваться подаренной мне датацентром по акции сотней гигабайт пришла ко мне вчера днём. Вчера же вечером на физически выделенном сервере, подключенном 100-мегабитным каналом, уже вовсю фуговал seedbox с моими раздачами.

Для начала, определимся что к чему.
Существует ряд программ, работающих по протоколу p2p для unix-подобных систем, в частности FreeBSD. Немного почитав отзывы и документацию, пришёл к выводу что наиболее оптимальным для меня будет использовать клиент rTorrent. Это — консольное приложение, к которому можно прикрутить веб-интерфейс, позволяющий руководить процессом через браузер. Из имеющихся веб-морд мой выбор остановился на ruTorrent, который внешне люто похож на виндовый uTorrent (название складывается так: rTorrent + uTorrent = ruTorrent).

Далее описывается процесс установки и конфигурации всего необходимого ПО под FreeBSD с помощью панели ISPmanager для реализации сидбокса — постоянно работающего на сервере торрент-клиента. В частности, то, как подключить это всё к Apache и обойтись без установки альтернативных серверов и модулей (a-la lighttpd и т.д.)

Итак, создаём в панели ISPmanager нового пользователя seedbox, выставив ему квоту на дисковое пространство и разрешив доступ по SSH. Сразу же создаем ему домен.

Заходим root'ом по SSH.

Устанавливаем столь необходимый Apache и rTorrent'у модуль mod_scgi (ох, если бы я с самого начала знал что он таки есть в портах...)
make -C /usr/ports/www/mod_scgi/ install clean
Редактируем /usr/local/etc/apache22/httpd.conf — добавляем свежеустановленный модуль заодно кое-что для домена.
  1. Там, где все LoadModule:
    LoadModule scgi_module libexec/apache22/mod_scgi.so
  2. В секции VirtualHost свежесозданного домена (ISPmanager добавляет такую секцию в конец файла автоматически):
    SCGIMount /RPC2 127.0.0.1:5000
Устанавливаем Screen:
cd /usr/ports/sysutils/screen && make install clean

Теперь установим сам rTorrent
cd /usr/ports/net-p2p/rtorrent && make install clean
Внимание! Собирать с поддержкой XMLRPC!


Создаём скрипт /usr/local/etc/rc.d/rtorrent
#!/bin/sh
# PROVIDE: rtorrent
# REQUIRE: LOGIN
# KEYWORD: shutdown

. /etc/rc.subr

name="rtorrent"
rcvar=`set_rcvar`

load_rc_config $name

: ${rtorrent_enable="NO"}
: ${rtorrent_user=""}

pidfile="/var/run/${name}.pid"
command="/usr/local/bin/rtorrent"

start_cmd="echo \"Starting: ${name}.\"; su ${rtorrent_user} -c 'screen -A -m -d -S ${name} ${command}'"
start_postcmd="${name}_poststart"

rtorrent_poststart()
{
sleep 4
ps aux | grep ${name} | grep ${rtorrent_user} | awk '{print($2)}' > ${pidfile}
echo "Done"
}

run_rc_command "$1"

Разрешаем запуск rtorrent:
echo 'rtorrent_enable="YES"'>>/etc/rc.conf

Указываем пользователя, из-под которого следует осуществлять rtorrent:
echo 'rtorrent_user="seedbox"'>>/etc/rc.conf

Создаем pid-файл:
touch /var/run/rtorrent.pid && chown seedbox:seedbox /var/run/rtorrent.pid

Заходим в консоль с правами пользователя seedbox:
su seedbox
Создаем файл .rtorrent.rc, являющийся конфигурационным для rtorrent:
  • скопировав из /usr/local/share/examples/rtorrent/rtorrent.rc в домашнюю директорию пользователя (надо переименовывать в .rtorrent.rc, с точкой в начале);
  • или же загрузив образец с официального сайта:
    fetch -o ~/.rtorrent.rc http://libtorrent.rakshasa.no/export/1257/trunk/rtorrent/doc/rtorrent.rc

Добавляем в него строку:
echo 'scgi_port = localhost:5000'>>~/.rtorrent.rc
Скачиваем и распаковываем веб-интерфейс ruTorrent (ниже указана версия rutorrent-3.3.tar.gz, проверьте, быть может она устарела с момента написания статьи, и появилась новая)
cd ~/www/seedbox-web && fetch http://rutorrent.googlecode.com/files/rutorrent-3.3.tar.gz && tar xvf rutorrent-3.3.tar.gz -C ./
Как видим, пути в стиле ISPmanager, где:
seedbox — спецсозданный для торрента пользователь
seedbox-web — папка для домена
После распаковки веб-морда доступна по адресу http://%domain%/rutorrent.
Здесь же, не уходя из папки, создаем нужные для работы ruTorrent директории:
cd ./rutorrent && mkdir ./downloads && mkdir ./sessions && chown -R seedbox:seedbox *
seedbox — спецсозданный для торрента пользователь
seedbox — его группа (создается вместе с пользователем ISPmanager'ом автоматически).
Теперь прописываем полные пути в .rtorrent.rc (директивы directory и session для только что созданных папок соответственно).

Для себя я также настроил работу rTorrent'а на отдельном IP-адресе и защиту ruTorrenta базовой аутентификацией. По вопросу IP-адреса читайте ниже, об установке базовой атентификации — в отдельном посте Как защитить доступ к папке паролем в .htaccess при помощи .htpasswd.

Укажите и проверьте пути к папкам downloads, sessions и settings. Они необходимы для работы как rTorrent'а, так и ruTorrent'а. Выставьте на них права чтобы они оба имели права чтения и записи. Проверьте правильность относительных путей в конфиге .rtorrent.rc (rTorrent) и config.php (ruTorrent). У меня всё это располагается в:
/home/seedbox/data/www/seedbox-web/rtorrent/downloads
/home/seedbox/data/www/seedbox-web/rtorrent/sessions
/home/seedbox/data/www/seedbox-web/rtorrent/settings
и защищено базовой аутентификацией Апача. В планах подключить для листинга и выдачи содержимого папки downloads быстрый nginx.

Чтобы rTorrent работал на отдельном специально заданном/указанном IP-адресе необходимо внести соответствующие изменения в .rtorrent.rc:
# The ip address reported to the tracker.
ip = 123.123.123.123
# The ip address the listening socket and outgoing connections is
# bound to.
bind = 123.123.123.123
Вместо 123.123.123.123 подставляете свой IP-адрес. Об это также написано на libtorrent.rakshasa.no.

Чисто теоретически, это всё. Кажется, ничего не забыл указать :)

Чтобы запустить свежеустановленный rTorrent, зайдите под специально созданным в начале пользователем по ssh и выполните команду:
/usr/local/etc/rc.d/rtorrent start

Если бы я не занимался установкой lighttpd, fast_cgi и пр. красноглазием, я бы не потратил весь вечер на разрешение возникшего конфликта IP-адресов через ipkvm (спасибо техподдержке за оперативность) из-за неподнявшегося ssh, а успел бы поднять торрент за пару часов.

Возможные проблемы/вопросы в процессе установки и после неё:
  1. Tracker: [Failure reason "re-announce in XXXX s (YYY s left)"] означает что rTorrent пытается найти пиров, но обошедши все указанные в .torrent-файле аннаунсеры (трекеры) пиров не нашёл.
  2. Чтобы попасть в консольное окно rTorrent'а необходимо ввести соответствующую команду.
    /usr/local/bin/rtorrent
  3. Чтобы выйти из консольного окна rTorrent'а (а это не так-то и просто, Ctrl+C и под. не помогают) достаточно нажать Ctrl+Q.
  4. Ошибка could not read resource file .rtorrent.rc означает что Вы неправильно указали путь к .rtorrent.rc, не сохранили его, или запускаете rTorrent под другим пользователем. Например, .rtorrent.rc лежит в /home/rtorrent/data (домашняя директория пользователя rtorrent в ISPmanager), а запускаете его под root'ом. Тогда rtorrent ищет конфиг в директории ~, т.е. /root и конечно же его там не находит. Именно поэтому в самом начале я и порекомендовал предоставить спецпользователю для торрента ssh-доступ — чтобы из-под него запускать rTorrent.
  5. Ошибка SCGIMount module not included означает что в апач не установлен/не подключен SCGI. Как это сделать написано в начале или в отдельном посте Установка SCGI-mod на Apache2 под FreeBSD
  6. Ошибка libtorrent Bad autotool stanza: libtool:22 Stop in /usr/ports/net-p2p/libtorrent: идём в /usr/ports/net-p2p/libtorrent/Makefile и редактируем директиву USE_AUTOTOOLS, ставим значение libtool
  7. Если постоянно нарисовывается ошибка с несовпадением версий libtorrent (distinfo is out of date or spelled incorrectly), попробуйте обновить порты
  8. Если при попытке запустить rtorrent из-под созданного пользователя (т.е. не root) появляется ошибка Cannot 'start' rtorrent. Set rtorrent_enable to YES in /etc/rc.conf, судя по всему rc.conf недоступен для чтения этим пользователем. Проверьте права. Я поставил 644, не знаю насколько это небезопасно.

P.S. полезные плагины

UPD 30.07.2011 создал скрипт rtorrent.sh, поставил его в сron на перезагрузку:
#!/bin/sh
su seedbox -c "killall rtorrent"
su seedbox -c "killall screen"
su seedbox -c "/usr/local/bin/rtorrent>/dev/null"

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