Итак, давно хочу на свой самосборный простенький 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:
Качаем 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:/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 файлик — качает 🙂 Значит готово. Возможно в процессе эксплуатации вылезут какието баги или в комментариях ктото чтото толковое посоветует — допишу в статью.
Хай щастить!