Thursday, October 6, 2022

Deploy Aplikasi Django menggunakan Droplet di DigitalOcean Bagian 1

Deploy Aplikasi Django menggunakan Droplet di DigitalOcean Bagian 1

Digital Ocean

Bagi yang bekerja dalam dunia cloud pasti sudah sering mendengan Digital Ocean sebagai perusahaan yang menyediakan layanan berbasis cloud salah satunya untuk infrastruktur website. Digital Ocean merupakan server cloud yang menggunakan SSD sebagai penyimpanan sehingga mempercepat akses data. Dengan menggunakan cloud juga kita bisa dengan mudah melakukan upgrade untuk menaikan spek layanan ataupun downgrade untuk menurunkan layanan dengan cepat dan mudah.

Digital Ocean menyediakan layanan VPS dengan paket yang murah dan user friendly. Perusahaan ini menurut sya dalam layanan cloud VPS hampir sebanding dengan layanan Amazon Web Service. Beberapa alasan untuk memilih menggunakan VPS dari Digital Ocean adalah sebagai berikut:

  • Control Panel yang sederhana,
  • Komunitas developer yang banyak tersedia,
  • Harga cukup terjangkau dari mulai $5 untuk hosting VPS
  • Kemudahan dalam instalasi
Dalam tulisan ini saya akan berbagi bagaimana melakukan deploy aplikasi Django menggunakan Digital Ocean. Dengan catatan sebelumnya kita harus mendaftar terlebih dahulu akun digital ocean dengan membayar $5 dengan paypal atau kartu kredit.

Step 1 — Membuat Droplet 

Untuk mebuat Droplet silahkan login ke web Digital Ocean dan create Droplet dengan memilih jenis sistem operasi dan fitur atau spek VPS yang diinginkan. 

Step 2 — Koneksi ke VPS menggunakan MobaXterm

Download aplikasi MobaXterm download disini

Step 3 — Konfigurasi Server

Berikut beberapa skrip untuk konfigurasi dan persiapan library yang dibutuhkan untuk aplikasi Django

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:~# sudo apt update

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:~# sudo apt install python3-pip

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:~# sudo apt install python3-dev

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:~# sudo apt install libpq-dev

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:~# sudo apt install postgresql

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:~# sudo apt install postgresql-contrib

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:~# sudo apt install curl

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:~# sudo apt install nginx

Step 4 — Creating the PostgreSQL Database and User

Dalam langkah ini akan membuat sebuah database dan user database untuk aplikasi Django dengan menggunakan aplikasi RDBMS PostgrSQL dan ekstensi Postgres untuk mengolah data spasial.

Secara standarnya user Postgres digunakan sebagai sebuah skema autentifikasi yang dinamakan peer authentication untuk dalam koneksi lokal. Artinya jika user pengguna sistem operasi sesuai dengan username Postgres maka user dapat login tanpa autentifikasi lebih lanjut.

Selama proses instalasi Postgres, sebuah username dengan nama postgres dibuat sebagai user postgres PostgreSQL. User ini akan dapat digunakan untuk melakukan operasi administrasi database. Untuk bisa login ke sesi interkatif Postgres digunakan sudo dan memasukan username dengan menuliskan perintah opsi -u:

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:~# sudo -u postgres psql

Perintah diatas akan menampilkan prompt PostgreSQL untuk setup kebutuhan dalam mebuat projek database. Pertama buat database baru dengan nama myproject.

postgres=# CREATE DATABASE myproject;

Selanjutnya, buat user untuk database tersebut dan tentukan password yang aman:

postgres=# CREATE USER myprojectuser WITH PASSWORD 'password';

Kemudian, lakukan sedikit modifikasi paramter koneksi untuk user yang sudah dibuat. Hal ini akan mempercepat operasi database sehingga nilai yang tepat tidak akan ditanyakan dan disetel setiap koneksi tersambung. 

Set nilai encoding ke UTF-8, yang diharapkan aplikasi Django.

postgres=# ALTER ROLE myprojectuser SET client_encoding TO 'utf8';

Kemudian set skema standar isolasi transaksi menjadi read committed untuk membaca commit dan mencegah pembacaan dari transaksi uncommitted:

postgres=# ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';

Project Django secara standar akan di set menggunakan UTC, set zona waktu yang relevan:

postgres=# ALTER ROLE myprojectuser SET timezone TO 'UTC';

Langkah-langkah diatas merupakan hal yang direkomendasikan dalam sebuah aplikasi Django. Sekarang berikan akes user yang dibuat ke datase yang ditentukan:

postgres=# GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

Jika langkah-langkah tersebut sudah selesai, untuk keluar dari prompt PostgreSQL gunakan perintah berikut:

postgres-# \q

Step 5 — Membuat User di VPS

Untuk membuat user dalam VPS Droplet menggunakan perintah add <namauser>. Selanjutnya masukan password dan data lainnya.

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:~# adduser user1

Untuk membuat user dalam VPS Droplet menggunakan perintah add <namauser>. Selanjutnya masukan password dan data lainnya. Dan gunakan perintah usermod untuk merubah user yang dibuat menjadi admin. 

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:~# usermod -aG sudo user1

Selanjutnya pindah ke direktori user yang sudah dibuat. 

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:~# cd /home/user1

Step 6 — Membuat Virtual Environment untuk Project Python

Setelah selesai membuat database, selanjutnya siap untuk mempersiapkan proyek aplikasi Django. Untuk membuat aplikasi Django sebaiknya menggunakan sebuah virtual environment untuk efiensi managemen paket library yang digunakan. Menginstal Django dalam sebuah virtual environment memungkinkan sebuah proyek aplikasi Django terpisah dari aplikasi lain yang secara khusus menggunakan library-library versi terntentu. Dengan virtual environment dalam sebuah sistem operasi memungkinkan membuat beragam aplikasi Django dalam berbagai versi yang membutuhkan tipe atau versi library yang berbeda-beda sesuai kebutuhan dari aplikasi Django.

Untuk melakukan ini, dibutuhkan untuk library virtualenv menggunakan pip:

Upgrade pip:

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:~# sudo -H pip3 install --upgrade pip

Instal paket virtulaenv:

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1# sudo -H pip3 install virtualenv

Buat folder direktori proyek misal myprojectdir:

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1# mkdir myprojectdir

Pindah ke folder myprojectdir:

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1# cd myprojectdir

Buat virtualenv misal dengan nama myprojectenv:

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1/myprojectdir# virtualenv myprojectenv

Aktifkan virtual environment myprojectenv:

root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1/myprojectdir# source myprojectenv/bin/activate

Hasilnya virtual environment myprojectenv aktif dan selajutnya library dan paket-paket yang dibutuhkan untuk membuat aplikasi Django secara terisolasi.Folder kerja terlihat seperti ini:

 (myprojectenv)user@host:~/myprojectdir$.

Dengan aktifnya virtual environment selanjutnya install Django, Gunicorn, and the psycopg2 PostgreSQL adaptor:

(myprojectenv) root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1/myprojectdir# pip3 install django


(myprojectenv) root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1/myprojectdir# pip3 install gunicorn

(myprojectenv) root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1/myprojectdir# pip3 install psycopg2-binary


Selanjutnya buat project Django misal dengan nama myproject:

(myprojectenv) root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1/myprojectdir# python3 -m django startproject myproject ../myprojectdir

Selanjutnya ubah file settings.py yang terdapat di folder myprojectdir/myproject. Pada bagian ALLOWED_HOSTS tentukan alamat server atau IP yang bisa mengakses ke aplikasi Django. Silahkan masukan alamat web atau ip dan localhost.

# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
ALLOWED_HOSTS = ['159.223.181.170','localhost']
Kemudian setting pada bagian database.

. . .

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

. . .
Kemudian pada bagian bawah file settings.py yang menentukan dimana static files harus diletakan. Ini diperlukan agar Nginx dapat menangani permintaan untuk item ini.

. . .

STATIC_URL = '/static/'
import os
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

Step 7 — Menyelesaikan Setup Initial Project

Langkah selanjutnya adalah melakukan migrasi inisialskema database ke database PostgreSQL menggunakan kode:

(myprojectenv) root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1/myprojectdir# python manage.py makemigrations


(myprojectenv) root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1/myprojectdir# python manage.py migrate

Langkah selanjutnya adalam membuat user admin. misal admin

(myprojectenv) root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1/myprojectdir# python manage.py createsuperuser

Lakukan Collect semua file static kedalam lokasi directori yang sudah ditentukan:

(myprojectenv) root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1/myprojectdir# python manage.py collectstatic

Kemudian buka akses port  8000:

(myprojectenv) root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1/myprojectdir# sudo ufw allow 8000

Terakhir, test project dengan menjalankan palikasi server Django dengan menggunakan perintah:

(myprojectenv) root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1/myprojectdir# python manage.py runserver 0.0.0.0:8000

Jika berhasil, buka alamat http://alamat_server atau IP:8000, maka hasilnya:



Step 8 — Testing Gunicorn’s agar Aplikasi Django sebagai Server

Sebelum keluar dari virtual environment, test Gdahulu unicorn untuk memastikanbahwa Gunicorn dapat melayani aplikasi. Masukan perintah di direktory myprojectdir:

(myprojectenv) root@ubuntu-s-1vcpu-1gb-intel-nyc1-01:/home/user1/myprojectdir# gunicorn --bind 0.0.0.0:8000 myproject.wsgi

Jalankan lagi aplikasi, buka alamat http://alamat_server atau IP:8000 hasilnya sama dengan gambar diatas.

Jika ingin mematikan server ketik Ctrl + C. Dan jika akan keluar dari virtual environment, silahkan ketikan deactivate.

Step 9 — Membuat File systemd Socket and Service untuk Gunicorn

Buat file gunicorn.socket di folder /etc/systemd/system/

  1. $ sudo nano /etc/systemd/system/gunicorn.socket

Kemudian inputkan kode sebagai berikut.

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Buat file gunicorn.service di folder /etc/systemd/system/

Kemudian masukan kode sebagai berikut:

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=user1
Group=www-data
WorkingDirectory=/home/user1/myprojectdir
ExecStart=/home/user1/myprojectdir/myprojectenv/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          myproject.wsgi:application

[Install]
WantedBy=multi-user.target

Buat file gunicorn.socket di folder /etc/systemd/system/

Jalankan socket Gunicorn socket yang akan menghasilkan file socket di /run/gunicorn.sock:

  1. $ sudo systemctl start gunicorn.socket

Lalu enable gunicorn socket, systemd secara otomatis akan menjalankan gunicorn.service:

  1. $ sudo systemctl enable gunicorn.socket

Step 10 — Checking for the Gunicorn Socket File

alu enab



Referensi:
  • https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-18-04