Installation

This guide will step you through setting up a Python-based virtualenv, installing the required packages, and configuring the basic web service.

Dependencies

Some basic prerequisites which you’ll need in order to run Rio:

  • A UNIX-based operating system.
  • Python 2.7
  • python-setuptools, python-pip, python-dev, libffi-dev, libssl-dev, libyaml-dev
  • A broker. It might be one of RabbitMQ(recommend), Redis(recommend), MongoDB, ZeroMQ, CouchDB, SQLAlchemy, Django ORM, Amazon SQS, and more..
  • A result store. It might be one of AMQP, Redis, memcached, MongoDB, SQLAlchemy, Django ORM, Cassandra
  • Nginx (nginx-full)
  • A dedicated domain to host Rio on (i.e. rio.your-corp.com).

If you’re building from source you’ll also need:

Node.js 4 or newer.

Setting up an Environment

The first thing you’ll need is the Python virtualenv package. You probably already have this, but if not, you can install it with:

$ pip install -U virtualenv

It’s also available as python-virtualenv on ubuntu in the package manager.

Once that’s done, choose a location for the environment, and create it with the virtualenv command. For our guide, we’re going to choose /var/www/rio:

$ mkdir /var/www/rio
$ virtualenv --distribute /var/www/rio

Finally, activate your virtualenv:

$ source /www/rio/bin/activate

Install Rio

Once you’ve got the environment setup, you can install Rio and all its dependencies with the same command you used to grab virtualenv:

$ pip install -U rio

To check installation successfully, run Rio CLI, via rio:

$ rio --help

Installing from Source

If you are going to install from source, you will need to install npm. Once your system is prepared, symlink your source into the virtualenv:

$ python setup.py develop

Initializing the Configuration

To create default configuration, you will use the init subcommand of rio. You can specify an alternative configuration path as the argument to init, otherwise it will use the default of current directory:

$ rio init /etc/rio

Set RIO_CONF as an environment variable so that rio can find this directory later:

$ export RIO_CONF=/etc/rio

The init subcommand create a config.py. Use your flavoured text editor to edit config.py file to adjust to your infrastructure.

You need to configure:

  • configure_broker
  • configure_storage_backend

Running Migrations

Rio provides an easy way to run migrations on the database on version upgrades. Before running it for the first time you’ll need to make sure you’ve created the database:

mysql> CREATE DATABASE rio;

Once done, you can create the initial schema using the upgrade command:

$ rio upgrade

Starting the Web Service

Rio provides a built-in webserver (powered by Gunicorn) to get you off the ground quickly. You can also setup Rio as WSGI application by specifying wsgi application rio.app:app. To start the built-in webserver run rio start:

$ rio start web

You should now be able to test the web service by visiting http://localhost:8009/.

Starting Background Workers

A large amount of Rio’s work is managed via background workers. These need run in addition to the web service workers:

$ rio start worker

Process Management

It is recommended to using process management software to keep Rio processes alive. supervisor is a fancy tool to archive that. This is an example of supervisor config part:

[program:rio-web]
directory=/www/rio/
environment=RIO_CONF="/etc/rio"
command=/www/rio/bin/rio start web
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=syslog
stderr_logfile=syslog

[program:rio-worker]
directory=/www/rio/
environment=RIO_CONF="/etc/rio"
command=/www/rio/bin/sentry start worker
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=syslog
stderr_logfile=syslog

Setup a Reverse Proxy

You’ll use the builtin HttpProxyModule within Nginx to handle proxying:

upstream rio_servers {
    server    127.0.0.1:9001;
}

server {
    listen 80;
    server_name rio.intra.yourcorp.com;

    location / {
        client_max_body_size 10M;
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_pass         http://rio_servers;
    }
}

Removing Old Data

One of the most important things you’re going to need to be aware of is storage costs. The stale data in Backend storage should be automatically removed by a cron job:

$ crontab -e
0 0 * * * RIO_CONF=/etc/rio rio cleanup --days=30