Debian Jessie: Торрентокачалка с WEB интерфейсом (rtorrent + php5-fpm + rutorrent + nginx)

Итак, давно хочу на свой самосборный простенький NAS на Intel Atom поставить торентокачалку с WEB интерфейсом. NAS стоит высоко под потолком, ни монитора ни клавиатуры не имеет, поэтому WEB управлялка — то что надо 🙂
Вот решил немного покнопкодавить с толком и настроить rtorrent + rutorrent. Для тех кто не в курсе что это, коротко опишу:
rtorrent — консольный torrent-клиент, имеет встроенный RPC, весьма гибок в настройке и функционален
rutorrent — WEB интерфейс для rtorrent написанный на PHP, JS и jQuery и еще бог знает чем … ох уж эти современные WEB-решения 🙂

Напомню что эта статья из цикла Debian Jessie: Мой маленький HowTo, для полноты понимания рекомендую пролистать статьи 1, 2, 3.

Сначала в настройках своей локальной DNS зоны я создал запись A — torrent.my.local, если у вас нету DNS сервера или вы не хотите его использовать, есть 2 варианта:
1. прописать в файле hosts пару ip — name для корректного резолва будущего сервера торрентов
2. ходить на web-интерфейс будущего торент-сервера по ip
Рекомендую всетаки установить и настроить bind и использовать DNS 🙂

Как и положено вначале — установим базово необходимые пакеты rtorrent и screen:

nas:~$ sudo apt-get install rtorrent screen

В Unix есть хорошее правило — запускать процессы от специально созданных для этого пользователей, я тоже стараюсь ему следовать.
Создадим юзера torrent, «под ним» будет работать rtorrent, пул php-fpm и rutorrent:

nas:~$ sudo useradd --comment "User for Torrent" --create-home --shell /usr/sbin/nologin torrent

На просторах инета валяется готовый init скрипт для запуска rtorrent в screen-е в виде сервиса linux. Он правда чуть устарел, в идеале надо будет соорудить такойже для systemd, но попервах сгодится и он. Вариант более чем рабочий!

Переходим в директорию /etc/init.d:

nas:~$ cd /etc/init.d

Качаем init-скрипт:

nas:/etc/init.d$ sudo wget -c https://wtorrent.googlecode.com/files/rtorrentInit.sh

Даем ему права на выполнение:

nas:/etc/init.d$ sudo chmod +x rtorrentd

Минимально необходимые правки — поменять юзера, по умолчанию root, что не есть гуд!:

nas:/etc/init.d$ sudo vim rtorrentd
#Do not put a space on either side of the equal signs e.g.
# user = user
# will not work
# system user to run as
user="torrent"

Добавляем в автозагрузку, чтобы стартовало при загрузке системы:

nas:/etc/init.d$ sudo update-rc.d rtorrentInit.sh defaults

Создаем файл конфигурации приложения rtorrent, программа ищет его в хомя пользователя, поэтому такой путь:

nas:~$ sudo vim /home/torrent/.rtorrent.rc

Минимально рабочий конфиг rtorrent, возможно в процессе использования чтото будет меняться — закину сюда:

# Диапазон рабочих портов torrent клиента
# Если вы за NAT не забываем "пробросить" порты
port_range = 32001-32001

# Включаем DHT
dht = auto

# UDP порт для DHT
dht_port = 32000

# Обмен пирами
peer_exchange = yes

# Использовать ли UDP трекеры
use_udp_trackers = yes

# Директория в которую по-умолчанию будут загружаться файлы
directory = /srv/hitachi/torrents

# Глобальные ограничения по скорости
upload_rate = 80
download_rate = 800

# "Шифруемся" если это возможно
encryption = allow_incoming,try_outgoing,enable_retry

# Директория для записи сессий rTorrent
session = /srv/seagate/.torrent_sessions

# Задаем путь к сокету RPC для управления через WEB
scgi_local = /home/torrent/.sockets/scgi.socket

## @@ Shedules @@ ##
# Периодически проверка и удаление сесий, если торрент удален
schedule = watch_untied,5,5, ((remove_untied))
# Остановить загрузки если Free Disk Space < 1024MB
schedule = low_diskspace,5,60,close_low_diskspace=1024M

По конфигу поясню чуть с путями, у меня в NAS 3 винчестера:
один под систему,
второй /srv/hitachi — для мусора, туда и буду качать торренты
третий /srv/seagate — тоже для мусора, для уменьшения нагрузки на диск я рознес по разным винтам директории сессий и файлов

Если у вас один винчестер — не переживайте, все это может жить и на одном винчестере. Просто создайте в том же хомяке пользователя torrent директорию для загруженных файлов и для сессий, поправьте в конфиге rtorrent и вуаля … Это я уже с жиру бешусь 🙂

Не забываем на роутере (в моем случае он тоже на Debian Jessie) «пробросить» порт указанный в port_range. В конфиг с правилами iptables впишите для таблицы nat такое:

# NAT Table Rules
*nat
# Torrent Forwarding to NAS UDP/TCP
-A PREROUTING -i eth1 -p udp -m udp --dport 32001 -j DNAT --to-destination 192.168.0.100
-A PREROUTING -i eth1 -p tcp -m tcp --dport 32001 -j DNAT --to-destination 192.168.0.100
COMMIT

Создадим директорию для сокетов, забегая наперед скажу что их будет несколько:

nas:~$ sudo mkdir /home/torrent/.sockets

поскльку и конфиг и директорию для сокетов мы создавали от рута (использовали sudo) — поправим права:

nas:~$ sudo chown -R torrent.torrent /home/torrent

Создадим директорию для сессий и сразу права:

nas:~$ sudo mkdir /srv/seagate/.torrent_sessions
nas:~$ sudo chown -R torrent.torrent /srv/seagate/.torrent_sessions

директория для скачанных файлов и опять права:

nas:~$ sudo mkdir /srv/hitachi/torrents
nas:~$ sudo chown torrent.torrent /srv/hitachi/torrents

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

nas:~$ sudo /etc/init.d/rtorrentInit.sh start
Starting rtorrent: rtorrent.
nas:~$

Теперь нужно настроить web часть, для этого нам потребуется nginx и php-fpm.
Установим:

nas:~$ sudo apt-get install git-core php5-fpm php5-curl php5-xcache nginx-full

Переходим в домашнюю директорию пользователя torrent, туда розместим web-приложение rutorrent:

nas:~$ cd /home/torrent/

создадим необходимые директории:

nas:/home/torrent$ sudo mkdir {htdocs,logs}

в директорию htdocs клонируем последнюю стабильную версию ruTorrent:

nas:/home/torrent$ sudo git clone https://github.com/Novik/ruTorrent.git htdocs/

выходим с директории /home/torrent:

nas:/home/torrent$ cd
nas:~$

не забываем снова поправить права:

nas:~$ sudo chown -R torrent.torrent /home/torrent

Настройка php-fpm довольно простая.
Переходим в конфиг пулов:

nas:~$ cd /etc/php5/fpm/pool.d/

по умолчанию есть дефолтный пул www, убедимся в этом:

nas:/etc/php5/fpm/pool.d$ ls -l
total 20
-rw-r--r-- 1 root root 18324 Jun  5 07:19 www.conf
nas:/etc/php5/fpm/pool.d$

он нам пригодится в качестве шаблона, ну а дальше он не нужен — выключаю:

nas:/etc/php5/fpm/pool.d$ sudo cp www.conf torrent.conf
nas:/etc/php5/fpm/pool.d$ sudo mv www.conf www.disabled

вот что получилось в итоге:

nas:/etc/php5/fpm/pool.d$ ls -l
total 40
-rw-r--r-- 1 root root 18324 Jun 30 05:44 torrent.conf
-rw-r--r-- 1 root root 18324 Jun  5 07:19 www.disabled
nas:/etc/php5/fpm/pool.d$

вперед настраивать пул torrent:

nas:/etc/php5/fpm/pool.d$ sudo vim torrent.conf

достаточно простейших настроек, у меня вышло так:

[torrent]
user = torrent
group = torrent

listen = /home/torrent/.sockets/php5-fpm.socket
listen.owner = torrent
listen.group = www-data
listen.mode = 0660

pm = dynamic
pm.max_children = 5
pm.start_servers = 0
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.process_idle_timeout = 60s;

chdir = /

php_admin_value[error_log] = /var/log/php-fpm_torrent.log

выходим из директории настройки пулов php-fpm:

nas:/etc/php5/fpm/pool.d$ cd
nas:~$

и запускаем сервис:

nas:~$ sudo systemctl restart php5-fpm.service

В результате у нас должен создаться сокет php-fpm по заданному в конфиге пути, проверяем его наличие:

nas:~$ ls -l /home/torrent/.sockets/
total 0
srw-rw---- 1 torrent www-data 0 Jun 30 06:42 php5-fpm.socket
srwxr-xr-x 1 torrent torrent  0 Jun 30 06:41 scgi.socket
nas:~$

Теперь настройка nginx
Переходим в директорию с настройками:

nas:~$ cd /etc/nginx/
nas:/etc/nginx$

Открываем основной конфиг текстовым редактором vim:

nas:/etc/nginx$ sudo vim nginx.conf

следуя логике минимализма конфигурации и нагрузки на сервер (у меня же Intel Atom!), в основном конфиге я изменил только 3 параметра:

1. Нагрузки на nginx никакой не будет, зачем 4 воркера жрущих память?
worker_processes 1;

2. SSL включен по умолчанию, у меня доверенная локалка — SSL мне не нужен — комментим

3. Сжатие создает доп нагрузку на CPU, у меня он и так слабенький + работа в локалке. Учитывая вышесказанное, сжатие оставлю, но минимальное

Вот такой получился конфиг:

user www-data;
worker_processes 1;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    gzip on;
    gzip_comp_level 1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Теперь к настройке конфига приложения, розмещаем по классике в /etc/nginx/sites-available и потом включаем симлинком в sites-enabled.
Напомню что я изначально в своей внутренней зоне создал в DNS запись A для торрента — torrent.my.local

переходим в директорию с конфигами сайтов:

nas:/etc/nginx$ cd sites-available/

И сочиняем конфиг:

nas:/etc/nginx/sites-available$ sudo vim torrent_my_local.conf

у меня получился такой:

server {
   listen 80;
   # Если у вас нету DNS имени сервера и вы будете ходить на сервер по ip
   # используйте следующую опцию, вместо моей:
   # server_name _;
   # а также предварительно выключите дефолтный конфиг:
   # sudo rm /etc/nginx/sites-enabled/default
   server_name torrent.my.local;

   access_log /var/log/nginx/torrent-access.log;
   error_log /var/log/nginx/torrent-error.log;

   root /home/torrent/htdocs;
   index index.html;

   # Very rarely should these ever be accessed outside of your lan
   location ~* \.(txt|log)$ {
    allow 127.0.0.0/8;
    deny all;
   }

   # Deny to any .* files. Like ".git", ".svn" ... etc
   location ~ (^|/)\. {
    return 403;
   }

   location / {
    index index.html;
   }

   # rTorrent RPC
   location /RPC2 {
    include scgi_params;
    scgi_pass unix:/home/torrent/.sockets/scgi.socket;
   }

   # PHP Files
   location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass unix:/home/torrent/.sockets/php5-fpm.socket;
    #fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   }

   # Static Files
   location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt)$ {
    access_log off;
    expires max;
   }
}

для включения конфига, переходим в директорию /etc/nginx/sites-enabled и создаем симлинк на конфиг torrent_my_local.conf:

nas:/etc/nginx/sites-available$ cd ../sites-enabled/
nas:/etc/nginx/sites-enabled$ sudo ln -s ../sites-available/torrent_my_local.conf

вот что должно получиться в итоге (еще раз, если хотите ходить на сервер по ip, удалите симлинк default из директории /etc/nginx/sites-enabled):

nas:/etc/nginx/sites-enabled$ ls -l
total 0
lrwxrwxrwx 1 root root 34 Jun 30 04:53 default -> /etc/nginx/sites-available/default
lrwxrwxrwx 1 root root 41 Jun 30 06:21 torrent_my_local.conf -> ../sites-available/torrent_my_local.conf
nas:/etc/nginx/sites-enabled$

переходим в хомяк:

nas:/etc/nginx/sites-enabled$ cd
nas:~$

проверяем конфигурацию nginx и перезапускаем его:

nas:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
nas:~$

теперь можно и перезапустить сервис nginx:

nas:~$ sudo systemctl restart nginx.service

если вы все верно настроили, можно попробовать перейти на сайт torrent.my.local, там уже должна корректно открыться главная страничка rutorrent
Правда web-ка rutorrent ругается:

[30.06.2015 10:54:39] WebUI started.
[30.06.2015 10:54:40] No connection to rTorrent. Check if it is really running. Check $scgi_port and $scgi_host settings in config.php and scgi_port in rTorrent configuration file.

Что вполне логично, так как rutorrent также нуждается в минимальной настройке.
Необходимо внести кое-какие правки в основной конфиг приложения rutorrent:

nas:~$ sudo vim /home/torrent/htdocs/conf/config.php

я поменял там всего несколько параметров:

        $log_file = '/home/torrent/logs/rutorrent-errors.log';
        // Закоментим, так как у нас для RPC используется socket
        //$scgi_port = 5000;
        //$scgi_host = "127.0.0.1";
        // Собственно вот он наш сокет
        $scgi_port = 0;
        $scgi_host = "unix:///home/torrent/.sockets/scgi.socket";
        $profileMask = 0755;

После сохранения файла, идем в браузер и снова открываем нашу страничку rutorrent, теперь видим такую ругань во вкладке log:

[30.06.2015 11:01:55] WebUI started.
[30.06.2015 11:01:55] rss: Some functionality will be unavailable. Webserver user can't access external program (curl).
[30.06.2015 11:01:55] mediainfo: Plugin will not work. rTorrent user can't access external program (mediainfo).
[30.06.2015 11:01:55] rss: Some functionality will be unavailable. rTorrent user can't access external program (curl).
[30.06.2015 11:01:55] screenshots: Plugin will not work. rTorrent user can't access external program (ffmpeg).
[30.06.2015 11:01:58] Unpack plugin: rTorrent user can't access 'unzip' program.
[30.06.2015 11:01:58] Unpack plugin: rTorrent user can't access 'unrar' program.

Для начала поставим программы curl, unzip и unrar:

nas:~$ sudo apt-get install unzip unrar

Снова F5 на вебке, уже ругани меньше:

[30.06.2015 11:08:12] WebUI started.
[30.06.2015 11:08:12] rss: Some functionality will be unavailable. Webserver user can't access external program (curl).
[30.06.2015 11:08:12] mediainfo: Plugin will not work. rTorrent user can't access external program (mediainfo).
[30.06.2015 11:08:12] screenshots: Plugin will not work. rTorrent user can't access external program (ffmpeg).

ffmpeg я точно ставить не буду, просто выключу плагин. Mediainfo — не знаю надо ли оно, поживем-увидим.
Вцелом закинул туда для теста .torrent файлик — качает 🙂 Значит готово. Возможно в процессе эксплуатации вылезут какието баги или в комментариях ктото чтото толковое посоветует — допишу в статью.

Хай щастить!

  1. Комментов пока нет

  1. Трэкбэков пока нет.

Why ask?