Tutorial Deploy Django 4 Pada VPS Ubuntu 22.04
Note :Tutorial ini dibuat hanya untuk dokumentasi semata oleh penulis agar mudah dalam mempelajari sesuatu hal yang baru berdasarkan pemahaman penulis!.
Pada tutorial kali ini, kita akan memcoba untuk mendeploy django pada VPS Ubuntu 22.04
Artikal ini berdasarkan referensi dari:
Versi yang digunakan:
nginx/1.18.0 (Ubuntu)
uwsgi --2.0.18
Ubuntu 22.04.3 LTS
Django 4.1
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
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
.
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
.
# 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
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
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!.