Having developed my Django app, it was time to deploy it so that it can be live, such a thrilling feeling to have my own hosted website online. - I did a couple of searches and decided to host withvultr VPS. Let us jump to the whole process from setting up my server to actual running my website.
Creating a New Instance
I chose cloud compute:
Selecting the region for my server:
selecting server operating system:
Selecting the size of the server:
I chose to name the server Testserver for a practical purpose.
after creating the server:
after receiving the root password via email, I ssh into the server using the server IP Address.
Updating the server
First thing is to upgrade the server's packages:
apt-get update
apt-get upgrade
######Creating Application UserIt is always best practice not to work directly with the root user.so I created another user.<code> adduser django</code>since I am deploying a Django application, It is simple to use a simple name.This is the output. There are few questions to be answered.~~~Adding user `django' ...Adding new group `django' (1000) ...Adding new user `django' (1000) with group `urban' ...Creating home directory `/home/django' ...Copying files from `/etc/skel' ...Enter new UNIX password:Retype new UNIX password:passwd: password updated successfullyChanging the user information for urbanEnter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []:Is the information correct? [Y/n]~~~Adding the user to sudoers to be able to perform root functions:<code>gpassword -a django sudo</code>Now log in to the new user account.##Installing the necessary Dependencies:#####SupervisorThis will be used to start the Django application server and manage it.<code>sudo apt-get install supervisor</code>######Starting and enabling the supervisor:
sudo systemctl enable supervisor
sudo systemctl start supervisor
#####PostgreSQL Installing the dependencies to be used by Postgresql and Django<code>sudo apt-get install build-essential libpq-dev python-dev</code>######Installing PostgreSQL server:<code>sudo apt-get -y install postgresql postgresql-contrib</code>######Creating and Configuring PostgreSQL database:#####Switch users:<code>su - postgres</code>Creating a db user and database:
createuser django_project
createdb prod --owner django_project
psql -c "ALTER USER u_urban WITH PASSWORD '!@#fs_877#$cdfd@@'"
######exit the postgreSQL user:<code>exit</code>####Install and Configure VirtualenvI used python3 that is already installed in ubuntu 16.04######First, install pip3:<code>sudo apt-get install python3-pip</code>######Using pip install virtualenv:<code>pip3 install virtualenv</code>######Then create virtualenv:<code>python3 -m venv django_env</code>######Activating it:cd to the virtualenvdirectory <code>cd django_env</code><code>source bin/activate</code>I used GitHub to store my Django website, so I cloned it from the git repository.<code>git clone https://github.com/ndemo-richard/django_project.git</code>cd into project directory and install project dependencies:<code>pip install -r requirements.txt</code>changing the database credentials in the settings.py file in the project root directory:~~~DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'prod', 'USER': 'django_project', 'PASSWORD': '!@#fs_877#$cdfd@@', 'HOST': 'localhost', 'PORT': '', }}~~~#####migrating the database:<code>python manage.py migrate</code>#####collect project static files:<code>python manage.py collectstatic</code>####Install and configure Gunicorn<code>pip install gunicorn</code>create a file named gunicorn inside bin directory<code> vi bin/gunicorn</code> add this to the empty file:~~~#!/bin/bashNAME="django_project"DIR=/home/django/django_projectUSER=djangoGROUP=djangoWORKERS=3BIND=unix:/home/django/run/gunicorn.sockDJANGO_SETTINGS_MODULE=django_project.settingsDJANGO_WSGI_MODULE=django_project.wsgiLOG_LEVEL=errorcd $DIRsource ../bin/activateexport DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULEexport PYTHONPATH=$DIR:$PYTHONPATHexec ../bin/gunicorn ${DJANGO_WSGI_MODULE}:application \ --name $NAME \ --workers $WORKERS \ --user=$USER \ --group=$GROUP \ --bind=$BIND \ --log-level=$LOG_LEVEL \ --log-file=-~~~make the file executable<code>chmod u+x bin/gunicorn</code>create directory for the UNIX socket file:<code> mkdir run</code>#####Configure Supervisor first, create a directory for log files:<code>mkdir logs</code>######Create an empty log file inside the log directory:<code>touch logs/gunicorn-error.log</code>create a new supervisor config file:<code>sudo vi /etc/supervisor/conf.d/django_project.conf</code>django_project.conf~~~[program:django_project]
command=/home/django/django_project/bin/gunicorn
user=urban
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/home/django/logs/gunicorn-error.log
Reread the config file:```sudo supervisorctl rereadsudo supervisorctl update```Check the status:```sudo supervisorctl status django_projectdjango_project RUNNING pid 42173, uptime 0:00:13```##NGINXInstalling Nginx web server, this will be used to run the Django application behind a proxy server<code>sudo apt-get install nginx</code>create new config file inside /etc/nginx/sites-available/:<code>sudo vim /etc/nginx/sites-available/django_project</code>/etc/nginx/sites-available/djago_project
upstream app_server {
server unix:/home/urban/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 68.152.87.135;keepalive_timeout 5;client_max_body_size 4G;access_log /home/urban/logs/nginx-access.log;error_log /home/urban/logs/nginx-error.log;location /static/ { alias /home/urban/static/;}# checks for static file, if not found proxy to applocation / { try_files $uri @proxy_to_app;}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;}
}
creating a symbolic link:```sudo ln -s /etc/nginx/sites-available/django_project /etc/nginx/sites-enabled/django_project```Remove the default nginx website:<code>sudo rm /etc/nginx/sites-enabled/default</code>Restart nginx:<code>sudo service nginx restart</code>Now we are good to go. My website is online.
Top comments(1)
For further actions, you may consider blocking this person and/orreporting abuse