Safepal Documentation¶
Introduction¶
Safepal is an app that helps report GBV related cases. Provide users with educational content and access to CSOs
Tools¶
- Django
- Django Rest Framework
- Python3
- Wagtail
- Swagger
- Firebase
- Redis
- Celery
- Supervisord
- Nginx
- FFmpeg
Resources¶
- Deployment
https://simpleisbetterthancomplex.com/tutorial/2016/10/14/how-to-deploy-to-digital-ocean.html
- Celery
https://medium.com/analytics-vidhya/integrating-django-signals-and-celery-cb2876ebd494 https://www.codingforentrepreneurs.com/blog/celery-redis-django/ https://code.tutsplus.com/tutorials/using-celery-with-django-for-background-task-processing–cms-28732
https://simpleisbetterthancomplex.com/tutorial/2017/08/20/how-to-use-celery-with-django.html#starting-the-worker-process https://stackoverflow.com/questions/28643011/deploy-django-project-with-celery
- Redis
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04
- FFmpeg
https://github.com/aminyazdanpanah/python-ffmpeg-video-streaming
- SSL certificate. Step 4 and 5
Server Deployment¶
Setup EC2 instance¶
- Log into the Safepal AWS account
- Go to Services > compute > EC2.
- Click on Launch Instance.
- Select Ubuntu Server 18.04 TLS(or higher)
- Click Review and Launch > Launch .
- Use existing pair(please check the documentation folder for the pem file sellio_aws_instance.pem
- Finally Click on Launch Instances.
SSH into the Server, Install dependencies & setup postgreSql¶
- cd Desktop/
- sudo chmod 400 sellio_aws_instance.pem
- ssh -i sellio_aws_instance.pem ubuntu@public_ip_address
- sudo apt-get update && apt-get upgrade -y
- sudo apt-get install postgresql postgresql-contrib nginx git
- sudo apt-get install python3-venv
- sudo apt-get -y install nginx
- sudo apt-get -y install supervisor
- sudo apt install redis-server
- sudo apt install python3-pip
- sudo add-apt-repository ppa:jonathonf/ffmpeg-4
- sudo apt-get update
- sudo apt-get install ffmpeg
- source venv/bin/activate(or install without env)
- git clone https://github.com/UNFPAInnovation/SafepalDjangoBackend.git
- pip install -r requirements.txt
Note
All servers in the Safepal Project use the sellio_aws_instance.pem.
Warning
Activate allowed hosts in /home/ubuntu/SafepalDjangoBackend/SafepalDjangoBackend/settings.py ALLOWED_HOSTS = [‘*’] Requests may not work if not activated or add the actual IP address of the server
Enable supervisor
sudo systemctl enable supervisor
sudo systemctl start supervisor
Configure Postgres¶
su - postgres OR sudo -u postgres psql
createuser safepaluser
createdb safepaldb --owner safepaluser
psql -c "ALTER USER safepaluser WITH PASSWORD '123'"
exit
Change password
su - postgres
\password
exit
Configure The Application User¶
adduser safepal
gpasswd -a safepal sudo
su - safepal
Configure python environment¶
Clone the project and install requirements
python3 -m venv .
source bin/activate
git clone https://github.com/UNFPAInnovation/SafepalDjangoBackend.git
pip install -r requirements.txt
Add the database configs
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'dbname',
'USER': 'username',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
Run migrations
python manage.py migrate
python manage.py collectstatic
Test if the server is running by running
python manage.py runserver 0.0.0.0:8000
Configure gunicorn¶
Add these to bin/activate file. Do this for production and test
export DEBUG=False
export SECRET_KEY=''
export DB_NAME=''
export DB_USER=''
export DB_PASSWORD=''
export DB_HOST=''
Note
Check the Safepal drive for the test and production credentials. Contact the Outbox developers for details. codephillip@gmail.com - 0756878460
Configure gunicorn¶
Install gunicorn
pip install gunicorn
Add the code vim home/safepal/bin/gunicorn_start
#!/bin/bash
NAME="safepaltest"
DIR=/home/safepal/SafepalDjangoBackend
USER=safepal
GROUP=safepal
WORKERS=3
BIND=unix:/home/safepal/run/gunicorn.sock
DJANGO_SETTINGS_MODULE=SafepalDjangoBackend.settings
DJANGO_WSGI_MODULE=SafepalDjangoBackend.wsgi
LOG_LEVEL=error
cd $DIR
source ../bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DIR:$PYTHONPATH
exec ../bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $WORKERS \
--user=$USER \
--group=$GROUP \
--bind=$BIND \
--log-level=$LOG_LEVEL \
--log-file=-
Change permission of gunicorn_start
chmod u+x bin/gunicorn_start
Make directory run
mkdir /home/safepal/run
Folder structure
Configure redis server¶
Edit redis settings
sudo vim /etc/redis/redis.conf
Allow systemd to run redis in a daemon
supervised systemd
6380
Restart redis
sudo systemctl restart redis.service
Configure supervisor¶
Create config files and log files
mkdir logs
touch logs/gunicorn-error.log
vim /etc/supervisor/conf.d/safepal-program.conf
Add service to run gunicorn and reddis
[program:safepal-program]
command=/home/safepal/bin/gunicorn_start
user=safepal
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/home/safepal/logs/gunicorn-error.log
[program:safepal-celery]
command=/home/safepal/bin/celery worker -A SafepalDjangoBackend --loglevel=INFO
directory=/home/safepal/SafepalDjangoBackend
user=safepal
numprocs=1
stdout_logfile=/home/safepal/logs/celery.log
stderr_logfile=/home/safepal/logs/celery.log
autostart=true
autorestart=true
startsecs=10
; Need to wait for currently executing tasks to finish at shutdown.
; Increase this if you have very long running tasks.
stopwaitsecs = 600
stopasgroup=true
; Set Celery priority higher than default (999)
; so, if redis is supervised, it will start first.
priority=1000
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl restart safepal-program
sudo supervisorctl restart safepal-celery
if this error is thrown. supervisor: couldn't exec /home/ubuntu/bin/gunicorn_start: EACCES
RUN: chmod +x gunicorn_start
Add static files and collect static¶
Add these lines to the /home/ubuntu/SafepalDjangoBackend/SafepalDjangoBackend/settings.py
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
Then collect static files
source venv/bin/activate
(venv)$ python manage.py collectstatic
Explanation: This allows the static files like css and images to get rendered in django admin dashboard and swagger
Configure Nginx to Proxy Pass to Gunicorn¶
Create file named safepal-program sudo vim /etc/nginx/sites-available/safepal-program
Insert the following commands
upstream app_server {
server unix:/home/safepal/run/gunicorn.sock fail_timeout=0;
}
server {
listen 80;
# add here the ip address of your server
# or a domain pointing to that ip (like example.com or www.example.com)
server_name x.x.x.x;
keepalive_timeout 5;
client_max_body_size 4G;
access_log /home/safepal/logs/nginx-access.log;
error_log /home/safepal/logs/nginx-error.log;
location /static/ {
alias /home/safepal/SafepalDjangoBackend/SafepalDjangoBackend/static/;
}
# checks for static file, if not found proxy to app
location / {
try_files $uri @proxy_to_app;
}
location /content {
alias /mnt/content; # change the media url incase ints not in mnt
access_log off;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
}
Enable the file by linking it to the sites-enabled directory
sudo ln -s /etc/nginx/sites-available/safepal-program /etc/nginx/sites-enabled
sudo service nginx restart
Add SSL certificate¶
The command handles renewal of the domain as well
sudo add-apt-repository ppa:certbot/certbot
sudo apt install certbot
sudo apt-get install python-certbot-nginx
sudo apt-get install software-properties-common
sudo certbot --nginx -d webdashboard.safepal.co
Activate storage drive(optional)¶
Incase you have a separate storage drive for your content, add the location in the settings.py. Then activate the drive
su - root
sudo mkfs -t ext4 /dev/sdb
sudo mount /dev/sdb1 /mnt
sudo chmod -R -v 777 /mnt/
Update of code and server¶
ssh ubuntu@IPADDRESS
su - safepal (then enter password)
source bin/activate
cd SafepalDjangoBackend
git add .
git stash save
git pull origin master
python manage.py collectstatic
python manage.py migrate
sudo supervisorctl restart safepal-program
OR run the script deploy.sh
cd SafepalDjangoBackend
../deploy.sh