RapidPro Deployment (End-to-End Guide)

RapidPRO

This blog outlines the detailed steps to deploy a production-grade RapidPro system. The deployment covers the full stack from PostgreSQL and Redis to ElasticSearch, Mailroom, Courier, RP-Indexer, and the main RapidPro service, with proper configurations for each component.


1. PostgreSQL Installation and Configuration

Install PostgreSQL and PostGIS:

sudo apt install postgresql postgresql-contrib
sudo apt install postgis

Create a Database User:

sudo -i -u postgres
createuser temba –pwprompt -d
createdb temba
psql

Enable Required Extensions in DB:

\c temba
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_topology;
CREATE EXTENSION hstore;
CREATE EXTENSION “uuid-ossp”;
\q

2. Redis Installation and Configuration

sudo apt-get install redis-server
redis-server –version
sudo systemctl start redis-server
sudo systemctl status redis-server

3. Elasticsearch Installation and Configuration

curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg –dearmor -o /usr/share/keyrings/elastic.gpg

echo “deb [signed-by=/usr/share/keyrings/elastic.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main” | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list

sudo apt update
sudo apt install elasticsearch

Configure Elasticsearch:

sudo nano /etc/elasticsearch/elasticsearch.yml

Add:

cluster.name: my-application
node.name: node-1
network.host: localhost
http.port: 9200
sudo systemctl start elasticsearch
sudo systemctl enable elasticsearch
curl -X GET ‘http://localhost:9200’

4. Mailroom Installation and Configuration

Create Mailroom User and Set Up:

sudo adduser mailroom
sudo usermod -aG sudo mailroom

Clone Repository and Install Go:

cd /home/mailroom/
git clone –depth 1 –branch v7.4.1 https://github.com/nyaruka/mailroom.git
wget https://go.dev/dl/go1.17.7.linux-amd64.tar.gz
tar -xzf go1.17.7.linux-amd64.tar.gz

Update Bash Config:

echo ‘export GOPATH=$HOME/go’ >> ~/.bashrc
echo ‘export PATH=$GOPATH/bin:$GOROOT/bin:$PATH’ >> ~/.bashrc
source ~/.bashrc
go version

Build Mailroom:

cd mailroom
go build ./cmd/mailroom
mkdir app
cp mailroom app

Environment File:

sudo vim app/environment

Paste environment variables provided.

Create Systemd Service:

sudo vim /etc/systemd/system/mailroom.service

Add the systemd unit configuration provided.

sudo systemctl daemon-reload
sudo systemctl start mailroom.service

5. Courier Installation and Configuration

Set Up User:

sudo adduser courier
sudo usermod -aG sudo courier

Clone Repo and Build:

cd /home/courier/
git clone –depth 1 –branch v7.4.0 https://github.com/nyaruka/courier.git
cd courier
go build ./cmd/courier
mkdir app
cp courier app

Environment File:

sudo vim app/environment

Paste environment variables provided.

Systemd Service:

sudo vim /etc/systemd/system/courier.service

Add systemd unit file configuration.

sudo systemctl daemon-reload
sudo systemctl start courier.service

6. RP-Indexer Installation and Configuration

Set Up User:

sudo adduser rp-indexer
sudo usermod -aG sudo rp-indexer

Clone Repo and Build:

cd /home/rp-indexer/
git clone –depth 1 –branch v7.4.0 https://github.com/nyaruka/rp-indexer.git
cd rp-indexer
go build ./cmd/rp-indexer
mkdir app
cp rp-indexer app

Environment File:

sudo vim app/environment

Paste required configuration.

Systemd Service:

sudo vim /etc/systemd/system/rp-indexer.service

Add systemd config and start service:

sudo systemctl daemon-reload
sudo systemctl start rp-indexer.service

7. RapidPro Installation and Configuration

System Preparation:

sudo adduser rapidpro
sudo usermod -aG sudo rapidpro

Clone RapidPro Repository:

cd /home/rapidpro/
git clone –depth 1 –branch v7.4.0 https://github.com/nyaruka/rapidpro.git
cd rapidpro

Create Virtual Environment:

sudo apt install python3-venv python3-dev libpq-dev
python3 -m venv venv
source venv/bin/activate

Install Requirements:

pip install –upgrade pip
pip install -r requirements.txt

Environment Configuration:

cp temba/settings.py.example temba/settings.py
sudo vim temba/settings.py

Update database, Redis, Elasticsearch, Mailroom, Courier, and RP-Indexer URLs.

Create .env file with sensitive variables like:

DATABASE_URL=postgres://temba:yourpassword@localhost:5432/temba
REDIS_URL=redis://localhost:6379/0
ELASTICSEARCH_URL=http://localhost:9200

Apply Migrations:

python manage.py migrate

Create Superuser:

python manage.py createsuperuser

Collect Static Files:

python manage.py collectstatic

Configure Gunicorn:

sudo vim /etc/systemd/system/rapidpro.service

Add:

[Unit]
Description=Gunicorn instance to serve RapidPro
After=network.target

[Service]
User=rapidpro
Group=www-data
WorkingDirectory=/home/rapidpro/rapidpro
Environment=”PATH=/home/rapidpro/rapidpro/venv/bin”
ExecStart=/home/rapidpro/rapidpro/venv/bin/gunicorn temba.wsgi:application –bind 127.0.0.1:8000

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start rapidpro
sudo systemctl enable rapidpro

Configure Nginx:

sudo apt install nginx
sudo vim /etc/nginx/sites-available/rapidpro

Example config:

server {
    listen 80;
    server_name your_domain.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/rapidpro/rapidpro;
    }

    location / {
        include proxy_params;
        proxy_pass http://127.0.0.1:8000;
    }
}
sudo ln -s /etc/nginx/sites-available/rapidpro /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx

Set Up Celery Workers and Beat Scheduler:

Celery Worker:

sudo vim /etc/systemd/system/celery.service

Add:

[Unit]
Description=Celery Worker Service
After=network.target

[Service]
User=rapidpro
WorkingDirectory=/home/rapidpro/rapidpro
Environment=”PATH=/home/rapidpro/rapidpro/venv/bin”
ExecStart=/home/rapidpro/rapidpro/venv/bin/celery -A temba worker –loglevel=info

[Install]
WantedBy=multi-user.target

Celery Beat:

sudo vim /etc/systemd/system/celerybeat.service

Add:

[Unit]
Description=Celery Beat Scheduler Service
After=network.target

[Service]
User=rapidpro
WorkingDirectory=/home/rapidpro/rapidpro
Environment=”PATH=/home/rapidpro/rapidpro/venv/bin”
ExecStart=/home/rapidpro/rapidpro/venv/bin/celery -A temba beat –loglevel=info

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start celery.service
sudo systemctl start celerybeat.service

One thought on “RapidPro Deployment (End-to-End Guide)

Leave a Reply

Your email address will not be published. Required fields are marked *