Guide to setup and deploy Django web application with MongoDB in GCP (Google Cloud Platform)

I hope this article help you to setup and deploy Django web application with MongoDB in GCP (Google Cloud Platform)
Create a VM in GCP
Create an account or use your existing google account to access cloud.google.com, create a project and select “VM Instance” in “Compute Engine” of Compute section.
Select “Machine Type” based on your application requirement — I have selected “custom (2 vCPUs, 4 GB memory)” . In the “Boot disk” section, select OS and presistant disk size (I have selected “Ubuntu 18.04 LTS” and 10GB standard persistant disk to startwith).
Once VM successfully created, you may note down the IP (your IP is ephemeral and for static IP, you have to raise a request there and there is a cost associated with the same)
Enabling SSH access to your VM
For enabling ssh access from your local, add your local RSA key to VM in section “SSH Keys” of Metadata menu in “Compute Engine”. After adding your RSA key, you can access the VM from your local,
eg: ssh user_name@VM_IP
for copying files to your new VM, you can use scp command,
eg: scp /path/of/files user_name@VMIP:/path/of/remote/
Installing Python and Django
Install python 3.6.7
python3 — version
if python 3 not present, please install by below command,
sudo apt-get install python3.6
sudo apt-get install python3-setuptools
sudo apt-get update
Install pip3
pip3 — version
if pip3 not installed, please install by below command,
sudo apt install python3-pip
Install django
sudo pip3 install django
sudo pip3 install django — upgrade
Install and configure MongoDB
Install mongodb
sudo apt-get install mongodb
sudo service mongodb start
MongoDB security configuration
mongod — port 27017 — dbpath /var/lib/mongodb
Above command will start mongod service and then, we can open mongo console by giving below command,
mongo — port 27017
Create an admin user
use admin
db.createUser(
{
user: “admin”,
pwd: “<<pwd here>>”,
roles: [ { role: “userAdminAnyDatabase”, db: “admin” }, “readWriteAnyDatabase” ]
}
);
Granting root role for user admin — this is essential for managing other users
db.grantRolesToUser(‘admin’, [{ role: ‘root’, db: ‘admin’ }])
Shutdown db to open in auth mode
db.adminCommand( { shutdown: 1 } )
Opening mongodb in auth enabled mode
sudo mongod — auth — port 27017 — dbpath /var/lib/mongodb –bind_ip_all
# — auth will enable mongo in auth mode and –bind_ip_all makes mongo host accessable from outside.
sudo mongo — port 27017 -u “admin” — authenticationDatabase “admin”
# it will prompt for admin password
use admin
Creating application user — you are going to use this user from your web app,
db.createUser(
{
user: “user_name”,
pwd: “<<pwd>>”,
roles: [ { role: “readWrite”, db: “<<db name>>” }]
}
);
use <<app db name>>
# creating application user — you are going to use this user from your web app,
db.createUser(
{
user: “user_name”,
pwd: “<<pwd>>”,
roles: [ { role: “readWrite”, db: “<<db name>>” }]
}
);
# create ubuntu user
adduser <<user_name here>>
# above command will prompt you to enter required details like name, password etc
# below command is to enable sudo access to the newly created user
sudo usermod -aG sudo <<user_name here>>
# below command is to switch user to newly created user session,
sudo su <<user_name here>>
# below command is to restore data from your local DB to GCP.
mongorestore — username admin — password <<admin_pwd_here>> — authenticationDatabase admin -d <<DB_name_to_import_data>> <<folder_name_where_data_exported>>
Run your Django application
Copy django code into server by scp or using filezilla etc. From your project root folder, run below command to start application
/usr/bin/python3 manage.py runserver 0.0.0.0:8000
IP 0.0.0.0 is for accessing application with the right IP of the server. You may specify * at ALLOWED_HOSTS in Django settings
Now, you can access your Django application by giving direct URL in your browser, ie: http://VM_IP:8000
Thanks for reading this article, I will cover Django application production deployment with SSL and Nginx in next article.
