Tutorial Deploy Django 2 Pada VPS Ubuntu 18.04

Note :Tutorial ini dibuat hanya untuk dokumentasi semata oleh penulis agar mudah dalam mempelajari sesuatu hal yang baru berdasarkan pemahaman penulis!.

The easiest way to deploy your django project on VPS.

Pada tutorial kali ini, kita akan memcoba untuk mendeploy django pada VPS Ubuntu 18.04

Artikal ini berdasarkan referensi dari:

Persiapan tempur

  • SSH Client / Putty (untuk Windows user) & Ubuntu 18.04

Versi yang digunakan:

  • nginx/1.14.0 (Ubuntu)
  • uwsgi --2.0.18
  • Ubuntu 18.04.3 LTS
  • Django 2.2

First step:

Langkah pertama adalah kita harus mempunya password & ip address yang akan kita remote dari terminal.
Untuk username default biasanya kita akan mendapat user root.

Contoh:

$ ssh root@IP_PUBLIC

$ ssh root@134.987.187.099
root@134.987.187.099's password: 

Jika sudah berhasil login,

Jika kita sudah berhasil login, buatlah user baru yang akan kita gunakan, hindari akses root saat akan deploy pada server, karena akan membuat system crash jika secara tidak sengaja kita salah menggunakannya.

# Menambahkan user bernama iColdPlayer
$ adduser icoldplayer

# Memberikan hak akses superuser kepada user iColdPlayer
$ usermod -G sudo icoldplayer

Setelah kita berhasil membuat user iColdPlayer, maka langsung saja logout dari akses root tersebut, exit.

Login ulang ke server:

# Login sebagai user yang baru saja kita buat
$ ssh icoldplayer@134.987.187.099

icoldplayer@134.987.187.099's password: 

Pastikan semua dependencies pada server kita telah terupdate ke versi mutakhir (latest version).

$ sudo apt update

$ sudo apt upgrade -y

Second step (Installing Python, pip, Django):

Pada Ubuntu, maka secara default Python3.6 telah terinstall.

Check Python Version

$ python3.6 --version 
Python 3.6.8

Install pip

$ sudo apt install python3-pip

$ pip --version

# atau

$ pip3 --version
Keyring is skipped due to an exception: 'function' object has no attribute 'func_name'
pip 19.2.3 from /home/icoldplayer/anaconda3/lib/python3.6/site-packages/pip (python 3.6)

VirtualEnv / Virtual Environment Setelah berhasil menginstall pip, langkah selanjutnya membuat virtual environment agar dependencies project yang kita kerjakan tidak bentrok dengan dependencies project lainnya maupun OS itu sendiri.

Baca selengkapnya tentang pengertian virtual environment --->

Membuat Virtual Environment untuk project kita:

# install secara global seperti:
$ sudo -H pip3 install virtualenv

Pindah ke home directory kita dengan cara:

$ cd

# membuat folder & berpindah  directory untuk project kita
$ mkdir DjangoServer 

# berpindah ke directory yang baru saja kita buat
$ cd DjangoServer

:~/DjangoServer$

Buatlah virtual environment di dalam / di luar directory yang baru saja kita buat. Kita kan membuatnya di dalam directory yang baru saja kita buat.

# cara yang biasa saya gunakan
:~/DjangoServer$ python -m venv env

# cara lain
:~/DjangoServer$ virtualenv env

# env adalah nama virtual environment kita.
# aktifkan virtual environment 
:~/DjangoServer$ source env/bin/activate

# kita telah berada di virtual environment yang baru saja kita buat.
(env)~/DjangoServer$

Install Django & Create Project

#Install Django
(env)~/DjangoServer$ pip install django

#create project
(env)~/DjangoServer$ django-admin startproject DjangoVPS

# Masuk ke dalam directory project yang baru saja kita buat.
(env)~/DjangoServer$ cd DjangoVPS

# lakukan migrate dengan cara
(env)~/DjangoServer/DjangoVPS$ python manage.py migrate 

#atau
(env)~/DjangoServer/DjangoVPS$ ./manage.py migrate

# Jalankan server dengan cara
(env)~/DjangoServer/DjangoVPS$ ./manage.py runserver 0.0.0.0:8000

#periksalah jika django telah berjalan di ip public & port kita (134.987.187.099:8000)

Jika kita arahkan ke 134.987.187.099:8000, maka di sana akan terlihat landing page khas django yang berjalan.

Apabila kita menemukan error 404, cobalah pergi ke settings.py di dalam project kita dan rubah ALLOWED_HOSTS menjadi ip public kita atau cukup menambahkan symbil bintang *.

Apabila cara di atas tidak berhasil, cobalah memeriksa firewall dengan cara:

# cek status 
$ sudo ufw status

#Contoh 
Status: active

To                         Action      From
--                         ------      ----
5432/tcp                   ALLOW       Anywhere                  
8288                       ALLOW       Anywhere                  
8001                       ALLOW       Anywhere                  
Nginx Full                 ALLOW       Anywhere                  
80                         ALLOW       Anywhere                  
8000                       ALLOW       Anywhere                  
443/tcp                    ALLOW       Anywhere                  
Apache Full                ALLOW       Anywhere                  
5432/tcp (v6)              ALLOW       Anywhere (v6)             
8288 (v6)                  ALLOW       Anywhere (v6)             
8001 (v6)                  ALLOW       Anywhere (v6)             
Nginx Full (v6)            ALLOW       Anywhere (v6)             
80 (v6)                    ALLOW       Anywhere (v6)             
8000 (v6)                  ALLOW       Anywhere (v6)             
443/tcp (v6)               ALLOW       Anywhere (v6)             
Apache Full (v6)           ALLOW       Anywhere (v6) 



# kita dapat menonaktifkannya dengan cara 
$ sudo ufw disable

# dan mengaktifkannya kembali 
$ sudo udw enable

# untuk membuka port yang akan kita gunakan, cukup dengan cara:
$ sudo ufw allow 8000

Cek kembali di browser kita, 134.987.187.099:8000.

Third step, setting up uWSGI.

Sampai step kedua di atas, kita telah berhasil melakukan installasi di server kita dengan mulus (kaya paha doi).

Akan tetapi, jika kita menghentikan proses berjalannya server (./manage.py runserver), maka project kita pun akan berhenti, karena sama halnya dengan kita menjalankannya pada localhost pc kita.
Sedangkan tujuan kita adalah untuk membuat project / aplikasi tersebut selalu berjalan, oleh karenanya kita membutuhkan uWSGI (Web Server Gateway Interface).

Untuk alternatif lain, kita bisa menggunakan Gunicorn

Ada dua cara untuk menginstall uWSGI.

  • Pertama: menggunakan pip. contoh:
# cara pertama dengan menggunakan pip
(env)~/DjangoServer/DjangoVPS$ pip install uwsgi

# sedangkan cara kedua adalah dengan menginstallnya secara global.
(env)~/DjangoServer/DjangoVPS$ deactivate
:~/DjangoServer/DjangoVPS$ cd

# install uwsgi secara global (lebih direkomendasikan, karena kita tidak perlu menginstallnya berulang kali untuk mendeploy aplikasi lainnya)
:~/DjangoServer$ sudo -H pip3 install uwsgi

# cek uwsgi version
:~/DjangoServer$ uwsgi --version
2.0.18

Kita dapat memulai uwsgi service langsung dari terminal dengan cara:

sudo uwsgi --http 0.0.0.0:8000 --home /home/icoldplayer/DjangoServer/env --chdir /home/icoldplayer/DjangoServer/DjangoVPS --wsgi-file /home/icoldplayer/DjangoServer/DjangoVPS/DjangoVPS/wsgi.py

Jika berhasil, cobalah pergi ke browser url : 134.987.187.099:8000, maka Django akan berjalan di sana.

Maksud dari command di atas adalah:

http : kita akan menggunakan http dan port pada uwsgi.

home : path / lokasi virtual environment yang sudah kita buat di atas.

chdir : root directory project yang telah kita buat seperti di atas.

wsgi-file : path / lokasi file wsgi.py di dalam project kita.

Untuk menjalankan command di atas secara otomatis, kita dapat membuat file seperti berikut:

#kembali ke directory awal / home
$ cd ~

# membuat folder bernama uwsgi & masuk ke dalamnya.
$ mkdir uwsgi && cd uwsgi

# di dalam folder uwsgi, kita membuat kemabli folder bernama sites
$ mkdir sites && cd sites
 
# membuat file uwsgi_service.ini di dalam folder sites
$ nano uwsgi_server.ini

Di dalam file uwsgi_server.ini:

[uwsgi]
home        = /home/icoldplayer/DjangoServer/env
chdir       = /home/icoldplayer/DjangoServer/DjangoVPS
wsgi-file   = /home/icoldplayer/DjangoServer/DjangoVPS/DjangoVPS/wsgi.py

http        = 0.0.0.0:8000

save dan jalankan file di atas dengan cara:

$ sudo uwsgi uwsgi_server.ini

[uWSGI] getting INI configuration from cpm.ini
*** Starting uWSGI 2.0.18 (64bit) on [Thu Aug 15 11:44:05 2019] ***
compiled with version: 7.4.0 on 14 August 2019 14:09:32
os: Linux-4.15.0-58-generic #64-Ubuntu SMP Tue Aug 6 11:12:41 UTC 201
.....

Jika berhasil, cobalah periksa kembali browser kita dengan url 134.987.187.099:8000.

Karena semuanya akan berjalan dalam system (Ubuntu / Unix), pada server tersebut, maka kita dapat menggunakan sebuah UNIX Socket yang akan terbuat secara otomatis & menjalankan uwsgi ketika server (nginx) dijalankan.

Edit file di atas (uwsgi_server.ini) menjadi:

[uwsgi]
home        = /home/icoldplayer/DjangoServer/env
chdir       = /home/icoldplayer/DjangoServer/DjangoVPS
wsgi-file   = /home/icoldplayer/DjangoServer/DjangoVPS/DjangoVPS/wsgi.py

socket      = /home/icoldplayer/uwsgi.
vacuum      = true
chown-socket= icoldplayer:www-data
chmod-socket= 660

Setelah kita membuat file uwsgi_server.ini seperti di atas, kita ingin uwsgi tersebut juga berjalan secara otomatis ketika system booting / setelah server reboot.

Buatlah file bernama uwsgi.service seperti di bawah ini:

$ cd /etc/systemd/system

$ sudo nano uwsgi.service

uwsgi.service

[Unit]
Description=uWSGI Emperor service[Service]

ExecStartPre=/bin/bash -c 'mkdir -p /run/uwsgi; chown icoldplayer:www-data /run/uwsgi'
ExecStart=/usr/local/bin/uwsgi --emperor /home/icoldplayer/uwsgi/sites
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all

[Install]
WantedBy=multi-user.target

Nginx setup.

Install Nginx

$ sudo apt install nginx

$ nginx -v
nginx version: nginx/1.14.0 (Ubuntu)

Buatlah config nginx di dalam folder:

$ cd /etc/nginx/sites-available

$ sudo nano djangovps

Pada file djangovps kita isi seperti di bawah ini:

server {
    listen 8000;
    server_name 134.987.187.099;    
    
    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/icoldplayer/uwsgi/uwsgi_server.sock;
    }
}

Kita perlu mengaktifkan file djangovps yang baru saja kita buat dengan cara:

$ sudo ln -s /etc/nginx/sites-available/djangovps /etc/nginx/sites-enabled

Last step

Aktifkan Nginx, uWSGI, & Reboot Server di VPS

# checking if syntax is ok
$ sudo nginx -t

# mengaktifkan nginx server
$ sudo systemctl enable nginx
# or
$ sudo service nginx start

# mengaktifkan uwsgi
$ sudo systemctl enable uwsgi
# or
$ sudo service uwsgi start

# mengaktifkan nginx firewall
$ sudo ufw allow 'Nginx Full'

# reboot VPS / Server
$ sudo reboot

and we’re done!!!.

Congrats, your site now is live in 134.987.187.099:8000, And you’re welcome dude!.

Next Step… Cara Custom Domain Pada VPS


Tags: #python, #UbuntuServer, #Django