.. _hosted-solution:

Deploy |RCE| From a Hosted Server
=================================

If you wish to deploy your own |RCE| instance from something like a
`Digital Ocean`_ droplet, or a `hetzner`_ server use the following
instructions to get it setup.

I'm using an Ubuntu 14.04 image for the purposes of this
tutorial, but all other Unix environments will be pretty similar. You can
check out the full lists of supported platforms and versions in the
:ref:`system-overview-ref` section.


Create a Digital Ocean Droplet
------------------------------

1. Sign into Digital Ocean.
2. Create a Droplet choosing Ubuntu 14.04 as your |os|.
3. (Optional) Add SSH keys if you have them set up.

Configure Your Server
---------------------

Once you have your server created, you need to sign into it and set it up to
host |RCE|.

1. Open a terminal and sign into your server. Digital Ocean will mail you the
   IP address. You'll need to change your password on the first login if you
   don not have SSH keys set up.

.. code-block:: bash

    $ ssh root@203.0.113.113

2. It is not advised to install |RCE| as the ``root`` user. So create a user
   with sudo permissions and then carry out the rest of the steps from that user
   account.

.. code-block:: bash

    # Create a user with sudo permissions
    root@rhodecode:~# sudo useradd -m -s /bin/bash -d /home/brian -U brian
    root@rhodecode:~# sudo usermod -a -G sudo brian

    # Set the password for that user
    root@rhodecode:~# passwd brian
    Enter new UNIX password:
    Retype new UNIX password:
    passwd: password updated successfully

    # Switch to that user for the rest of the steps
    root@rhodecode:~# su brian

    # You should see your home dir change to what was set during installation
    brian@rhodecode:~$ cd ~
    brian@rhodecode:~$ pwd
    /home/brian

Once you have this set up, you are ready to install |RCC|.

Install |RCC|
-------------

|RCC| will install and manage the package dependencies for your |RCE| instance.

1. Download the |RCC| installer from https://rhodecode.com/download/
2. Once downloaded to your computer, transfer the package to your server

.. note::

   These steps happen on your computer, not on the server.

.. code-block:: bash

    # Change to where the file is downloaded
    $ cd Downloads/

    # SFTP to your server
    $ sftp brian@203.0.113.113

    # Use mput to transfer the file
    sftp> mput RhodeCode-installer-linux-391_b1a804c4d69b_d6c087d520e3
    Uploading RhodeCode-installer-linux-391_b1a804c4d69b_d6c087d520e3 to /home/brian/RhodeCode-installer-linux-391_b1a804c4d69b_d6c087d520e3
    RhodeCode-installer-linux-391_b1a804c4d69b_d6c087d 100%  289MB   4.1MB/s   01:11
    sftp> exit

The |RCC| installer is now on your server, and you can read the full
instructions here
:ref:`Install RhodeCode Control <control:rcc-linux-ref>` ,
but below is the example shortcut.

.. code-block:: bash

    # Check that the script is uploaded to your home directory
    $ ls -1
    RhodeCode-installer-linux-391_b1a804c4d69b_d6c087d520e3

    # Change the script permissions
    $ chmod 755 RhodeCode-installer-linux*

    # Run the installer and accept the prompts
    $ ./RhodeCode-installer-linux-*

.. important::

   Once finished, exit the terminal and sign in again. This is to refresh you
   session to pick up the new commands.

Install |RCE|
-------------

Now that |RCC| is installed, you can install |RCE|. For the full
instructions, see
:ref:`Install RhodeCode Enterprise <control:rce-cli-install-ref>`,
but the below is an example shortcut.

.. code-block:: bash

    # Install a VCS Server and follow the prompts
    $ rccontrol install VCSServer --start-at-boot

    Extracting VCSServer ...
    Configuring RhodeCode VCS Server ...
    Supervisord state is: RUNNING
    Added process group vcsserver-1

    # Install a RhodeCode Enterprise instance and follow the prompts
    $ rccontrol install Enterprise --start-at-boot

    Configuration of RhodeCode Enterprise passed.
    Supervisord state is: RUNNING
    Added process group enterprise-1

|RCE| is now installed on your server, and is running on the port displayed
by the ``rccontrol status`` command.

.. code-block:: bash

    brian@rhodecode:~$ rccontrol status

     - NAME: enterprise-1
     - STATUS: RUNNING
     - TYPE: Enterprise
     - VERSION: 3.1.1
     - URL: http://127.0.0.1:10002

     - NAME: vcsserver-1
     - STATUS: RUNNING
     - TYPE: VCSServer
     - VERSION: 1.1.1
     - URL: http://127.0.0.1:10001

Serve |RCE| using Nginx
-----------------------

Now that |RCE| is running, you need to use Nginx or Apache to serve it to
users. For detailed instructions about setting up your webserver, see the
:ref:`rhodecode-admin-ref` section. But the below shortcut should help serve
it.

1. Install Nginx on your server.

.. code-block:: bash

    # Install nginx
    $ sudo apt-get install nginx

2. Create a virtual hosts file for RhodeCode Enterprise. Create
   the file in this location :file:`/etc/nginx/sites-available`. In this demo
   I have called it ``vcs.conf``

.. code-block:: bash

   # Create the file
   $ sudo vi /etc/nginx/sites-available/vcs.conf

Use the following example to create yours.

.. code-block:: nginx

    server {
        listen 80;
        # Change to your IP, or a domain name if you've set that up
        server_name     203.0.113.113 ;

        location / {
        # Set this line to match the RhodeCode Enterprise Instance URL
            proxy_pass		http://127.0.0.1:10002/;
            proxy_set_header	Host $Host;
            proxy_buffering		off;
        # Setting this to a high number allows large repo pushes
            client_max_body_size	4G;
            }
        }

3. Symlink the virtual hosts file to the ``sites-enabled`` folder,
   and then restart Nginx.

.. code-block:: bash

   # Symlink the virtual hosts file
   $ ln -s /etc/nginx/sites-available/vcs.conf /etc/nginx/sites-enabled/vcs.conf

   # You can also delete the Nginx default symlink
   $ rm /etc/nginx/sites-enabled/default

   # Restart Nginx
   $ sudo  /etc/init.d/nginx restart
     * Restarting nginx nginx                                     [ OK ]

Once restarted, you should see a clean |RCE| instance running on the IP
address, or the domain you have set up.

.. image:: ../images/clean-rce.png
   :alt: A fresh RhodeCode Enterprise Instance

.. _Digital Ocean: https://www.digitalocean.com/
.. _hetzner: https://www.hetzner.de/en/
