Cover Image

Torrentbox: rTorrent, ruTorrent, Apache og FreeBSD

 Wed 2019-03-27    Torrents

Denne artikkelen tar for seg å sette opp en torrent-seedbox basert på rTorrent, ruTorrent, Apache og FreeBSD.

De fleste artiklene jeg har funnet om å sette opp en torrent-seedbox er basert på Linux, og den eneste jeg har funnet som bruker FreeBSD, hadde valgt lighttpd. Jeg fikk ikke lighttpd til å fungere skikkelig, så jeg gikk for Apache i stedet.

ruTorrent er sagt å ikke ville spille på lag med PHP-versjoner over 5.6, men jeg har ikke hatt noen problemer med å kjøre det med PHP 7.2 på verken FreeBSD eller Linux. Det er også anbefalt å bruke stabile versjoner, men en git clone av master-repoet gav meg siste versjon, som fungerer utmerket på både FreeBSD og Linux.

Steg 0: Installer FreeBSD.

Hvis du allerede har en blank server som venter på en mening med livet kan du hoppe til steg 1. Hvis ikke, spinn opp en VM eller en gammel fysisk boks og installer FreeBSD. Valgene jeg gjorde under installasjonen var som følger (FreeBSD 11.2):

  1. Hvilke pakkesett skal installeres: doc og lib32. Det er ikke poeng i å installere ports, siden det lastes inn via portsnap senere. src trenger vi ikke siden vi oppdaterer via binaries. Resten er ikke relevant for hva denne serveren skal gjøre.
  2. Mot slutten av installasjonen får man spørsmål om hvilke tjenester som skal startes. Deaktiver sshd (vi skal straks installere openssh-portable), aktiver ntpd, la resten være som de er.
  3. Randomize the PIDs of newly created processes er fint. Resten kan være som de er.

Når FreeBSD er installert må det oppdateres med sikkerhetsoppdateringene som har kommet siden -RELEASE:

# freebsd-update fetch install && sudo reboot

Deretter henter vi ports, setter noen build-variabler og installerer noen nødvendige pakker:

# portsnap fetch extract
# echo "OPTIONS_UNSET=CUPS DEBUG DOCS FONTCONFIG X11" >> /etc/make.conf
# pkg install portmaster \
              git \
              screen \
              sudo \
              vim-console \
              openssh-portable \
              multitail \
              zsh \
              gnuls

Legg til eventuelle andre pakker du ønsker/trenger på slutten av forrige linje. Jeg foretrekker ZSH over bash eller (t)csh, samt at mc, multitail og gnuls er praktisk å ha.

Dette vil installere mange flere pakker enn angitt, men det er greit. La pkg gjøre sitt, og kjør deretter portmaster for å oppdatere eventuelle pakker som har fått en versjonsbump.

# portmaster -Bad

Dette vil ta lang tid og dra inn en røys dependencies, deriblant perl, og prosessen vil stille spørsmål om options underveis. Med mindre du har spesielle ønsker eller behov for konfigurering av pakkene, aksepter alle defaults og la portmaster gjøre sitt.

Steg 1: Installer Apache

# cd /usr/ports/www/apache24
# make install clean

Aksepter defaults.

Steg 2: Installer mod_scgi

Apache kommer ikke med mod_scgi som standard, så den må installeres for at ruTorrent skal kunne kommunisere med rTorrent via Apache. Installasjonen er så enkel som:

# cd /usr/ports/www/mod_scgi
# make install clean

Når installasjonen er ferdig må modulen aktiveres i Apache og et SCGIMount må settes opp:

httpd.conf:

LoadModule scgi_module libexec/apache24/mod_scgi.so

<IfModule scgi_module>
    SCGIMount /RPC2 127.0.0.1:5001
</IfModule>

Steg 3: Installer rtorrent

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

Se gjennom config options og pass på at XMLRPC-støtte er merket av.

Steg 4: Installer mod_php, PHP og PHP-extensions

Installasjon av siste PHP gjøres enklest slik:

# cd /usr/ports/lang/php72-extensions
# make install clean

Du får da opp en lang liste over forskjellige extensions du kan velge. Avhengig av hva du vil bruke serveren til ellers kan du installere det du føler du trenger, men som et minimum for Apache og ruTorrent må følgende være merket av:

BZ2, CTYPE, CURL, DOM, FILEINFO, FILTER, GD, HASH, ICONV, JSON, MBSTRING, MCRYPT, MYSQL, MYSQLI, OPENSSL, PDO, PDO_SQLITE, POSIX, SESSION, SIMPLEXML, SOCKETS, SQLITE3, TOKENIZER, XML, XMLREADER, XMLRPC, XMLWRITER, ZIP

+--------------------------- php72-extensions-1.0 -----------------------------+
≠ +--------------------------------------------------------------------------+ ≠
≠ +[ ] BCMATH bc style precision math functions                              + ≠
≠ +[x] BZ2 bzip2 library support                                             + ≠
≠ +[ ] CALENDAR calendar conversion support                                  + ≠
≠ +[x] CTYPE ctype functions                                                 + ≠
≠ +[x] CURL CURL support                                                     + ≠
≠ +[ ] DBA dba support                                                       + ≠
≠ +[x] DOM DOM support                                                       + ≠
≠ +[ ] ENCHANT Enchant spelling support                                      + ≠
≠ +[ ] EXIF EXIF support                                                     + ≠
≠ +[x] FILEINFO fileinfo support                                             + ≠
≠ +[x] FILTER input filter support                                           + ≠
≠ +[ ] FTP FTP support                                                       + ≠
≠ +[x] GD GD library support                                                 + ≠
≠ +[x] GETTEXT gettext library support                                       + ≠
≠ +[ ] GMP GNU MP support                                                    + ≠
≠ +[x] HASH HASH Message Digest Framework                                    + ≠
≠ +[x] ICONV iconv support                                                   + ≠
≠ +[ ] IMAP IMAP support                                                     + ≠
≠ +[ ] INTERBASE Interbase 6 database support (Firebird)                     + ≠
≠ +[ ] INTL Internationalization(ICU)                                        + ≠
≠ +[x] JSON JavaScript Object Serialization support                          + ≠
≠ +[ ] LDAP OpenLDAP support                                                 + ≠
≠ +[x] MBSTRING multibyte string support                                     + ≠
≠ +[x] MYSQLI MySQLi database support                                        + ≠
≠ +[ ] ODBC ODBC support                                                     + ≠
≠ +[x] OPCACHE OPcache support                                               + ≠
≠ +[x] OPENSSL OpenSSL support                                               + ≠
≠ +[ ] PCNTL pcntl support (CLI only)                                        + ≠
≠ +[ ] PDF PDFlib support (implies GD)                                       + ≠
≠ +[x] PDO PHP Data Objects Interface (PDO)                                  + ≠
≠ +[ ] PDO_DBLIB PDO DBLIB-DB driver                                         + ≠
≠ +[ ] PDO_FIREBIRD PDO Firebird driver                                      + ≠
≠ +[x] PDO_MYSQL PDO MySQL driver                                            + ≠
≠ +[ ] PDO_ODBC PDO ODBC driver                                              + ≠
≠ +[ ] PDO_PGSQL PDO PostgreSQL driver                                       + ≠
≠ +[x] PDO_SQLITE PDO sqlite driver                                          + ≠
≠ +[ ] PGSQL PostgreSQL database support                                     + ≠
≠ +[x] PHAR phar support                                                     + ≠
≠ +[x] POSIX POSIX-like functions                                            + ≠
≠ +[ ] PSPELL pspell support                                                 + ≠
≠ +[ ] READLINE readline support (CLI only)                                  + ≠
≠ +[ ] RECODE recode support                                                 + ≠
≠ +[x] SESSION session support                                               + ≠
≠ +[ ] SHMOP shmop support                                                   + ≠
≠ +[x] SIMPLEXML simplexml support                                           + ≠
≠ +[ ] SNMP SNMP support                                                     + ≠
≠ +[ ] SOAP SOAP support                                                     + ≠
≠ +[x] SOCKETS sockets support                                               + ≠
≠ +[ ] SODIUM Sodium encryption support                                      + ≠
≠ +[x] SQLITE3 sqlite3 support                                               + ≠
≠ +[ ] SYSVMSG System V message support                                      + ≠
≠ +[ ] SYSVSEM System V semaphore support                                    + ≠
≠ +[ ] SYSVSHM System V shared memory support                                + ≠
≠ +[ ] TIDY TIDY support                                                     + ≠
≠ +[x] TOKENIZER tokenizer support                                           + ≠
≠ +[ ] WDDX WDDX support (implies XML)                                       + ≠
≠ +[x] XML XML support                                                       + ≠
≠ +[x] XMLREADER XMLReader support                                           + ≠
≠ +[x] XMLRPC XMLRPC-EPI support                                             + ≠
≠ +[x] XMLWRITER XMLWriter support                                           + ≠
≠ +[ ] XSL XSL support (Implies DOM)                                         + ≠
≠ +[x] ZIP ZIP support                                                       + ≠
≠ +[x] ZLIB ZLIB support                                                     + ≠
≠ +--------------------------------------------------------------------------+ ≠
+------------------------------------------------------------------------------+
≠                       < OK >                 <Cancel>                        ≠
+------------------------------------------------------------------------------+

Når du trykker ENTER vil du få opp en dialogboks for konfigurasjon av PHP:

+------------------------------- php72-7.2.16 ---------------------------------+
≠ +--------------------------------------------------------------------------+ ≠
≠ ≠+[x] CLI      Build CLI version                                           ≠ ≠
≠ ≠+[x] CGI      Build CGI version                                           ≠ ≠
≠ ≠+[x] FPM      Build FPM version                                           ≠ ≠
≠ ≠+[x] EMBED    Build embedded library                                      ≠ ≠
≠ ≠+[ ] PHPDBG   Interactive PHP debugger                                    ≠ ≠
≠ ≠+[ ] DEBUG    Build with debugging support                                ≠ ≠
≠ ≠+[x] DTRACE   Build with DTrace probes                                    ≠ ≠
≠ ≠+[x] IPV6     IPv6 protocol support                                       ≠ ≠
≠ ≠+[x] MYSQLND  Build with MySQL Native Driver                              ≠ ≠
≠ ≠+[x] LINKTHR  Link thread lib (for threaded extensions)                   ≠ ≠
≠ ≠+[X] ZTS      Force Zend Thread Safety (ZTS) build                        ≠ ≠
≠ +--------------------------------------------------------------------------+ ≠
≠                         < OK >               <Cancel>                        ≠
+------------------------------------------------------------------------------+

Merk av ZTS i tillegg til defaults og trykk ENTER.

La installasjonen gå sin gang. Du vil bli spurt om options for forskjellige php-moduler og deres dependencies i løpet av installasjonen, så hold et øye med terminalen. For å unngå mas underveis og heller svare på alle spørsmålene om options før installasjonen begynner, angi make config-recursive && make install clean som kommandolinje.

Når dette er ferdig, må mod_php installeres:

# cd /usr/ports/www/mod_php72
# make install clean
+----------------------------- mod_php72-7.2.16 -------------------------------+
≠ +--------------------------------------------------------------------------+ ≠
≠ ≠ [ ] AP2FILTER Use Apache 2.x filter interface (experimental)             ≠ ≠
≠ ≠ [ ] PHPDBG Interactive PHP debugger                                      ≠ ≠
≠ ≠ [ ] DEBUG Build with debugging support                                   ≠ ≠
≠ ≠ [x] DTRACE Build with DTrace probes                                      ≠ ≠
≠ ≠ [x] IPV6 IPv6 protocol support                                           ≠ ≠
≠ ≠ [x] MYSQLND Build with MySQL Native Driver                               ≠ ≠
≠ ≠ [x] LINKTHR Link thread lib (for threaded extensions)                    ≠ ≠
≠ ≠ [x] ZTS Force Zend Thread Safety (ZTS) build                             ≠ ≠
≠ +--------------------------------------------------------------------------+ ≠
+------------------------------------------------------------------------------+
≠                   < OK >              <Cancel>                   ≠
+------------------------------------------------------------------------------+

Velg ZTS og trykk ENTER, og vent til modulen er installert.

Steg 5: Aktiver PHP i Apache

For at PHP skal fungere må mod_php aktiveres i Apache. Åpne httpd.conf:

# vim /usr/local/etc/apache24/httpd.conf

Naviger til listen over moduler og evt fjern kommenteringen for mod_php7:

LoadModule php7_module libexec/apache24/libphp7.so

Sett så opp filassosiasjoner slik at php-filer håndteres av PHP i <IfModule mime_module>-blokken. Legg til:

 <FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>

like før </IfModule>, og lagre filen.

Steg 6: Opprett en bruker for rTorrent

Man kan kjøre rTorrent som sin egen bruker, men for å være sikker på at private filer utenfor rTorrents nedlastingsmapper ikke blir berørt dersom noe skulle skje, så oppretter vi en dedikert bruker for å kjøre rTorrent.

# adduser
Username: rtorrent
Full name: rTorrent 
Uid (Leave empty for default): 
Login group [rtorrent]: 
Login group is rtorrent. Invite rtorrent into other groups? []: 
Login class [default]: 
Shell (sh csh tcsh zsh rzsh bash rbash git-shell nologin) [sh]: 
Home directory [/home/rtorrent]: 
Home directory permissions (Leave empty for default): 
Use password-based authentication? [yes]: no
Lock out the account after creation? [no]: 
Username : rtorrent
Password : <disabled>
Full Name : rTorrent
Uid : 1001
Class : 
Groups : rtorrent 
Home : /home/rtorrent
Home Mode : 
Shell : /bin/sh
Locked : no
OK? (yes/no): y
adduser: INFO: Successfully added (rtorrent) to the user database.
Add another user? (yes/no): n
Goodbye!

Steg 7: Opprett configfiler for rTorrent

# cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
# cp /usr/local/share/examples/rtorrent/rtorrent.rc /home/rtorrent/.rtorrent.rc
# chown rtorrent:rtorrent /home/rtorrent/.rtorrent.rc

Steg 8: Opprett mapper for rTorrent

# cd /home/rtorrent
# mkdir .session download watch
# chown -R rtorrent:rtorrent /home/rtorrent

Steg 9: Konfigurer rTorrent

Endre følgende linjer i /home/rtorrent/.rtorrent.rc:

# Default directory to save the downloaded torrents.
directory = /home/rtorrent/downloads

# Default session directory. Make sure you don't run multiple instance
# of rtorrent using the same session directory. Perhaps using a
# relative path?
session = /home/rtorrent/.session/

# Port range to use for listening.
port_range = 50001-50001

Legg til følgende linje i slutten av filen:

scgi_port = 127.0.0.1:5001

Alle andre innstillinger kan endres senere gjennom ruTorrent-webgrensesnittet.

Steg 10: Last ned ruTorrent og plugins

# mkdir -p /usr/local/www
# cd /usr/local/www
# git clone https://github.com/Novik/ruTorrent.git rutorrent
# chown -R rtorrent:rtorrent rutorrent

Endre linje 30 i /usr/local/www/rutorrent/conf/config.php til:

$scgi_port = 5001;

Steg 11: Sett opp Apache

Denne guiden tar ikke for seg å sette opp SSL, da det håndteres av NGINX reverse-proxy i forkant av serveren.

Endre /usr/local/etc/apache24/httpd.conf til:

# Virtual hosts
Include etc/apache24/extra/httpd-vhosts.conf

Endre så /usr/local/etc/apache24/extra/httpd-vhosts.conf til:

<VirtualHost *:80>
ServerName example.com
ServerAdmin webmaster@example.com
DocumentRoot /usr/local/www/rutorrent

ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
<Directory "/usr/local/www/rutorrent">
AuthName "Restricted Access"
AuthType Basic
Require valid-user
AuthUserFile /etc/private/apache-htpasswd
</Directory>
CustomLog /var/log/apache2/rutorrent.log vhost_combined
ErrorLog /var/log/apache2/rutorrent_error.log
</VirtualHost>

ruTorrent ligger som standard helt åpent for verden, så vi legger til passordbeskyttelse for å bare tillate godkjente brukere (AuthName-direktiver m/venner).

Steg 12: Opprett htpasswd-fil for autentisering

# mkdir -p /etc/private
# htpasswd -c /etc/private/apache-htpasswd rtorrent
New password: 
Re-type new password: 
Adding password for user rtorrent

Steg 13: Start Apache ved systemoppstart

sysrc apache24_enable=yes

eller rediger /etc/rc.conf manuelt og legg inn

apache24_enable="YES"

Steg 14: Start rTorrent ved systemoppstart

Logg inn som rtorrentbrukeren:

# su - rtorrent

Opprett en katalog kalt bin:

$ mkdir bin

Opprett /home/rtorrent/bin/rtorrent.sh med følgende innhold:

$ vim bin/rtorrent.sh
#!/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
export TERM=xterm
# Start rtorrent i detached screen
/usr/local/bin/screen -S rtorrent -d -m /usr/local/bin/rtorrent

Gjør scriptet kjørbart:

$ chmod 0755 /home/rtorrent/bin/rtorrent.sh

Kjør så

$ crontab -e

og legg til følgende linjer:

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
@reboot /home/rtorrent/bin/rtorrent.sh

Da er oppsettet ferdig. Start serveren på nytt for å se at alt virker som det skal og at alle tjenestene er tilgjengelige.

Husk å åpne for listen-porten spesifisert i rtorrent-configen (50001) i brannmuren for maksimale hastigheter. Som regel vil man likevel få lastet ned ting uten vesentlige problemer, men hvis ikke er det en enkel ting å fikse.

Feilsøking

Her er noen kjente problemer og løsninger på disse:

Problem:
Når jeg besøker serverens IP-adresse får jeg følgende melding:
ERR_CONNECTION_REFUSED

Løsning:
Du glemte steg 13.

Problem:
Når jeg logger inn på ruTorrent får jeg en haug feilmeldinger:

  • Webserver user doesn't have read/write/execute access to the torrents directory. You cannot add torrents via ruTorrent.
  • Webserver user doesn't have read/write/execute access to the settings directory. ruTorrent settings cannot be saved.
  • rTorrent user must have read/write/execute access to the torrents directory. You cannot add torrents via ruTorrent.
  • rTorrent user must have read/write/execute access to the settings directory.
  • (plugin): Some functionality will be unavailable. Webserver cannot access external program.

Løsning:
Du glemte chown i steg 7 og/eller 8.

Problem:
ruTorrent gir meg feilmeldinger som dette:

(plugin): Some functionality will be unavailable. Webserver cannot access external program.

Løsning:
Hvis du har sjekket at rtorrent-brukeren din er eier av /usr/local/www/rutorrent OG underkatalogene (som i forrige løsning), så trenger pluginen et eksternt program som gjerne ikke er installert (rss trenger curl, screenshots trenger ffmpeg, etc). Kjør "pkg search pakkenavn", installer siste versjon av programmet, og start så rtorrent og Apache på nytt.

De følgende pakkene (med dependencies) var nødvendige for å få installasjonen til å virke:

curl mediainfo ffmpeg sox unrar unzip

Merk at sox og ffmpeg vil dra inn X.org og/eller Wayland og et tonn andre, unødvendige X-relaterte dependencies hvis installert fra pakker eller kompilert med defaults. Det kan derfor være en god idé å gå gjennom config options og kompilere disse pakkene selv.

Jeg opplevde også at selv om curl og PHP var installert, så klarte ikke ruTorrent å finne programmene, så jeg måtte angi sti til php og curl i config.php, linje 43-44:

 $pathToExternals = array(
"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.

Problem:
ruTorrent viser ikke torrentliste-delen av grensesnittet og jeg får feilmelding "Bad response from server: (500 [error,getplugins]) Internal Server Error" i loggvinduet.

Løsning:
Mest sannsynlig mangler du mod_scgi i Apacheconfigen. Sjekk at modulen er installert, aktivert og at SCGIMount er satt opp. Hvis ikke, installer, aktiver og sett opp som indikert i steg 2.