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 |
This is my first time visit at here and i am actually happy to read everthing at alone place.