First of all, we are going to change the SSH port for security reasons. Login to your server with PuTTY as root and open the SSH configuration file.

Code:
nano /etc/ssh/sshd_config

Using nano, you can search text hitting CTRL+W. Edit the file reflecting these changes:

Code:
Port <portNo>
Protocol 2
X11Forwarding no

Replace <portNo> with a random port in the 40000 – 65535 range.
NOTE: If you want higher security you should also disable root login (PermitRootLogin no) but before doing that make sure you have created a new user and added it to the sudoers list. This is beyond the purpose of this tutorial.

Now you have to restart the SSH server daemon.

Code:
/etc/init.d/ssh reload

Now we have to create a new user which will run the torrent client daemons. Replace <username> with the username you want to use, of course.

Issue the useradd command to create a locked user account:

Code:
useradd <username>

Unlock the account by issuing the passwd command to assign a password:

Code:
passwd <username>

Web Server (nginx) + PHP installation
We’ll need to grab some extra repositories first.

Code:
wget http://fedora.mirror.nexicom.net/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -Uvh epel-release-6-8.noarch.rpm

Nginx offers their own repository of pre-built packages for CentOS 6. We can grab those by running these commands:

Code:
wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
rpm -Uvh nginx-release-centos-6-0.el6.ngx.noarch.rpm

Lastly, we need to grab the REMI repository which provides the php-fpm package. This can be easily done by the following:

Code:
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm

Nginx 1.2.6

Then we install nginx!

Code:
yum -y install nginx
chkconfig --levels 235 nginx on
/etc/init.d/nginx start

If you’ve done everything right up to this point, you should be able to get to the default nginx page in your browser!

PHP 5.4.11

Installing PHP is quite simple. Since this is going to be a seedbox, we only need a small handful of PHP modules. We’ll also be installing APC to help speed PHP processing up, which can be handy for large torrent operations.

Code:
yum -y install php-fpm php-cli php-mysql php-gd php-odbc php-pear  php-xml php-xmlrpc php-magickwand php-mbstring php-mcrypt php-shout  php-snmp php-soap php-tidy
yum -y install php-pecl-apc

With all that installed, we’ll go ahead and update the necessary items in the /etc/php.ini file. First we want to set cgi.fix_pathinfo to 0, then set the proper timezone.

Code:
[Date]
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = "America/Vancouver"

[...]

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0

Finally, we want to add PHP to the startup configuration and start the service itself.

Code:
chkconfig --levels 235 php-fpm on
/etc/init.d/php-fpm start

Before we can test PHP support, we need to actually configure nginx to make use of our php-fpm service. We’ll also do a bit of basic tuning to juice a wee bit more performance from nginx.

Edit the main nginx configuration, found in /etc/nginx/nginx.conf.

Code:
[...]
worker_processes  4;
[...]
    keepalive_timeout  2;
[...]

Now we’ll setup our default virtual host. The vhosts are managed via a separate file (/etc/nginx/conf.d/default.conf)

Code:
[...]
server_name localhost;
[...]
location / {
 root /usr/share/nginx/html;
 index index.php index.html index.htm;
 }
[...]
    location ~ \.php$ {
        root           /usr/share/nginx/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

Keep a close eye on the root and fastcgi_param variables, as with those being wrong, PHP won’t work.

rTorrent + ruTorrent installation
We’ll need to build these suckers from source, partially to get the XMLRPC support in and partially because the version in the repos is quite out of date.

Code:
mkdir ~/torrent
cd ~/torrent
wget http://libtorrent.rakshasa.no/downloads/rtorrent-0.9.2.tar.gz  http://libtorrent.rakshasa.no/downloads/libtorrent-0.13.2.tar.gz

For the next step, I take the ‘throw every ******* package at it cause I’m too lazy to do it any other way’ approach. By this, I mean using the ‘groupinstall’ feature of yum.

Code:
yum -y groupinstall "Development tools" "Server Platform   Development" && yum -y install cppunit-devel   libsigc++20-devel.i686 libsigc++20-devel.x86_64 libcurl-devel   xmlrpc-c-devel.i686 xmlrpc-c-devel.x86_64

Now we can begin building libtorrent and rtorrent.

Code:
tar xzf libtorrent-*.tar.gz
cd libtorrent-0.13.2
./autogen.sh
./configure; make; make install
ldconfig

With libtorrent configured and built, we can proceed to configuring/building rtorrent. Notice that we’re configuring rtorrent with the –with-xmlrpc-c flags. This is so we get the XMLRPC support which is required for any type of WebGUI.

Code:
cd ../
tar xzf rtorrent-*.tar.gz
cd rtorrent-0.9.2
./configure --with-xmlrpc-c
make
make install

With all that done, we should have a functional copy of rTorrent built.
We’ll want to run rtorrent as another user, but we don’t want to allow SSH logins as that user, since that will create a giant security hole. Before we get to that though, we need to download the stock rtorrent.rc file to the home directory of the user we created before. I assume we used sbox.

If you don’t know where the home directory of the user is located:

Code:
grep sbox /etc/passwd
sbox:x:500:500::/home/sbox:/bin/bash
Code:
cd /home/sbox
wget http://libtorrent.rakshasa.no/export/1303/trunk/rtorrent/doc/rtorrent.rc
mv rtorrent.rc .rtorrent.rc

We rename it to .rtorrent.rc, as that’s what rtorrent looks for on startup. Open the .rtorrent.rc configuration file and add/edit/uncomment the following lines:

Code:
#SCGI Port
scgi_port = localhost:5000

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

Now we have to create the directories used by rtorrent.

Code:
mkdir -p /home/sbox/torrents/downloads/
mkdir -p /home/sbox//torrents/session/
chown -R sbox:sbox /home/sbox/torrents

Lastly we have to update our nginx configuration to add the proper SCGI mounts.

Code:
nano /etc/nginx/conf.d/default.conf
[...]
location /RPC2 {
include scgi_params;
scgi_pass localhost:5000
}

Change to your public HTML directory and download rutorrent and the plugins package:

Code:
cd /usr/share/nginx/html/
wget http://rutorrent.googlecode.com/files/plugins-3.5.tar.gz http://rutorrent.googlecode.com/files/rutorrent-3.5.tar.gz
tar xzf rutorrent-3.5.tar.gz
tar xzf plugins-3.5.tar.gz
cp -a plugins/* rutorrent/plugins/
rm -rf plugins*

Last but not least, we have to start rtorrent in a screen session (or some other detachable shell software):

Code:
screen #this will open a new screen seesion
su sbox -c rtorrent -s /bin/sh

To detach from the screen session without closing rtorrent daemon, you can just hit CTRL+A then ‘d’.

 

For rutorrent Auto Restart:

First of all, we are going to change the SSH port for security reasons. Login to your server with PuTTY as root and open the SSH configuration file.

Code:
nano /etc/ssh/sshd_config

Using nano, you can search text hitting CTRL+W. Edit the file reflecting these changes:

Code:
Port <portNo>
Protocol 2
X11Forwarding no

Replace <portNo> with a random port in the 40000 – 65535 range.
NOTE: If you want higher security you should also disable root login (PermitRootLogin no) but before doing that make sure you have created a new user and added it to the sudoers list. This is beyond the purpose of this tutorial.

Now you have to restart the SSH server daemon.

Code:
/etc/init.d/ssh reload

Now we have to create a new user which will run the torrent client daemons. Replace <username> with the username you want to use, of course.

Issue the useradd command to create a locked user account:

Code:
useradd <username>

Unlock the account by issuing the passwd command to assign a password:

Code:
passwd <username>

Web Server (nginx) + PHP installation
We’ll need to grab some extra repositories first.

Code:
wget http://fedora.mirror.nexicom.net/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -Uvh epel-release-6-8.noarch.rpm

Nginx offers their own repository of pre-built packages for CentOS 6. We can grab those by running these commands:

Code:
wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
rpm -Uvh nginx-release-centos-6-0.el6.ngx.noarch.rpm

Lastly, we need to grab the REMI repository which provides the php-fpm package. This can be easily done by the following:

Code:
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm

Nginx 1.2.6

Then we install nginx!

Code:
yum -y install nginx
chkconfig --levels 235 nginx on
/etc/init.d/nginx start

If you’ve done everything right up to this point, you should be able to get to the default nginx page in your browser!

PHP 5.4.11

Installing PHP is quite simple. Since this is going to be a seedbox, we only need a small handful of PHP modules. We’ll also be installing APC to help speed PHP processing up, which can be handy for large torrent operations.

Code:
yum -y install php-fpm php-cli php-mysql php-gd php-odbc php-pear  php-xml php-xmlrpc php-magickwand php-mbstring php-mcrypt php-shout  php-snmp php-soap php-tidy
yum -y install php-pecl-apc

With all that installed, we’ll go ahead and update the necessary items in the /etc/php.ini file. First we want to set cgi.fix_pathinfo to 0, then set the proper timezone.

Code:
[Date]
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = "America/Vancouver"

[...]

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0

Finally, we want to add PHP to the startup configuration and start the service itself.

Code:
chkconfig --levels 235 php-fpm on
/etc/init.d/php-fpm start

Before we can test PHP support, we need to actually configure nginx to make use of our php-fpm service. We’ll also do a bit of basic tuning to juice a wee bit more performance from nginx.

Edit the main nginx configuration, found in /etc/nginx/nginx.conf.

Code:
[...]
worker_processes  4;
[...]
    keepalive_timeout  2;
[...]

Now we’ll setup our default virtual host. The vhosts are managed via a separate file (/etc/nginx/conf.d/default.conf)

Code:
[...]
server_name localhost;
[...]
location / {
 root /usr/share/nginx/html;
 index index.php index.html index.htm;
 }
[...]
    location ~ \.php$ {
        root           /usr/share/nginx/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

Keep a close eye on the root and fastcgi_param variables, as with those being wrong, PHP won’t work.

rTorrent + ruTorrent installation
We’ll need to build these suckers from source, partially to get the XMLRPC support in and partially because the version in the repos is quite out of date.

Code:
mkdir ~/torrent
cd ~/torrent
wget http://libtorrent.rakshasa.no/downloads/rtorrent-0.9.2.tar.gz  http://libtorrent.rakshasa.no/downloads/libtorrent-0.13.2.tar.gz

For the next step, I take the ‘throw every ******* package at it cause I’m too lazy to do it any other way’ approach. By this, I mean using the ‘groupinstall’ feature of yum.

Code:
yum -y groupinstall "Development tools" "Server Platform   Development" && yum -y install cppunit-devel   libsigc++20-devel.i686 libsigc++20-devel.x86_64 libcurl-devel   xmlrpc-c-devel.i686 xmlrpc-c-devel.x86_64

Now we can begin building libtorrent and rtorrent.

Code:
tar xzf libtorrent-*.tar.gz
cd libtorrent-0.13.2
./autogen.sh
./configure; make; make install
ldconfig

With libtorrent configured and built, we can proceed to configuring/building rtorrent. Notice that we’re configuring rtorrent with the –with-xmlrpc-c flags. This is so we get the XMLRPC support which is required for any type of WebGUI.

Code:
cd ../
tar xzf rtorrent-*.tar.gz
cd rtorrent-0.9.2
./configure --with-xmlrpc-c
make
make install

With all that done, we should have a functional copy of rTorrent built.
We’ll want to run rtorrent as another user, but we don’t want to allow SSH logins as that user, since that will create a giant security hole. Before we get to that though, we need to download the stock rtorrent.rc file to the home directory of the user we created before. I assume we used sbox.

If you don’t know where the home directory of the user is located:

Code:
grep sbox /etc/passwd
sbox:x:500:500::/home/sbox:/bin/bash
Code:
cd /home/sbox
wget http://libtorrent.rakshasa.no/export/1303/trunk/rtorrent/doc/rtorrent.rc
mv rtorrent.rc .rtorrent.rc

We rename it to .rtorrent.rc, as that’s what rtorrent looks for on startup. Open the .rtorrent.rc configuration file and add/edit/uncomment the following lines:

Code:
#SCGI Port
scgi_port = localhost:5000

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

Now we have to create the directories used by rtorrent.

Code:
mkdir -p /home/sbox/torrents/downloads/
mkdir -p /home/sbox//torrents/session/
chown -R sbox:sbox /home/sbox/torrents

Lastly we have to update our nginx configuration to add the proper SCGI mounts.

Code:
nano /etc/nginx/conf.d/default.conf
[...]
location /RPC2 {
include scgi_params;
scgi_pass localhost:5000
}

Change to your public HTML directory and download rutorrent and the plugins package:

Code:
cd /usr/share/nginx/html/
wget http://rutorrent.googlecode.com/files/plugins-3.5.tar.gz http://rutorrent.googlecode.com/files/rutorrent-3.5.tar.gz
tar xzf rutorrent-3.5.tar.gz
tar xzf plugins-3.5.tar.gz
cp -a plugins/* rutorrent/plugins/
rm -rf plugins*

Last but not least, we have to start rtorrent in a screen session (or some other detachable shell software):

Code:
screen #this will open a new screen seesion
su sbox -c rtorrent -s /bin/sh

To detach from the screen session without closing rtorrent daemon, you can just hit CTRL+A then ‘d’.