Arsitektur Pengembangan Perangkat Lunak AdHub

Arga Ghulam Ahmad
AdHub Team
Published in
9 min readFeb 16, 2019

Arsitektur perangkat lunak adalah struktur sistem dari suatu program atau sistem komputer yang terdiri dari komponen-komponen perangkat lunak, ciri yang tampak secara eksternal dari komponen-komponen tersebut, serta hubungan antar komponen tersebut. Istilah ini juga merujuk pada dokumentasi arsitektur perangkat lunak suatu sistem.

Halo Sobat AdHub, ketemu lagi dengan Arga di artikel ‘Arsitektur Pengembangan Perangkat Lunak AdHub’. Artikel ini akan menjelaskan bagaimana Saya mempersiapkan struktur folder, konfigurasi Docker, dan Docker Compose pada proyek perangkat lunak AdHub.

AdHub merupakan sebuah perangkat lunak berbasis web. Dalam pengembangan perangkat lunak tersebut, Kami sepakat untuk menggunakan Django sebagai web framework dan PostgreSQL sebagai database produksi. Kami menggunakan Docker sebagai teknologi containerization perangkat lunak kami. Agar service-service aplikasi AdHub dapat saling berkomunikasi, Kami menggunakan Docker Compose sebagai docker orchestra.

Sebelum Saya menjelaskan lebih jauh menjelaskan arsitektur perangkat lunak AdHub, mari terlebih dahulu kita memahami teknologi apa saja yang digunakan dalam pengembangan perangkat lunak AdHub

Docker

Seringkali kecepatan pengembangan suatu perangkat lunak terhambat oleh masalah perbedaan lingkungan pengembangan perangkat lunak. Perbedaan sistem operasi, dependensi, dan beberapa faktor lain terkadang menyulitkan tim development dalam mengembangkan perangkat lunak. Oleh karena itu dibutuhkan sebuah alat yang dapat mencegah masalah kompatibilitas pada tahap development maupun deployment. Alat tersebut berupa teknologi operating-system virtualization atau disebut juga dengan containerization. Ada banyak alat yang digunakan sebagai operating-system virtualization, salah satunya adalah Docker.

Docker is a tool designed to make it easier to create, deploy, and run applications by using containers. Containers allow a developer to package up an application with all of the parts it needs, such as libraries and other dependencies, and ship it all out as one package. — OpenSource.com, What is Docker?

Docker memungkinkan pemisahan antara kode sumber dengan dengan infrastruktur, sehingga tim development hanya perlu fokus dalam mengembangkan aplikasi mereka daripada mengkhawatirkan sistem dimana aplikasi tersebut dijalankan. Devops person lah bertanggung jawab untuk memastikan aplikasi yang dikembangkan berjalan dengan baik di atas docker container.

Docker Compose

Dalam pengembangan suatu perangkat lunak, banyak teknologi yang digunakan secara sekaligus. Sebagai contoh, AdHub menggunakan Django sebagai web framework dan PostgreSQL sebagai basis data. Service-service tersebut harus dijalankan di dalam beberapa docker container yang berbeda. Dibutuhkan sebuah alat yang dapat menjalankan beberapa docker container tersebut secara bersamaan. Alat tersebut biasa disebut dengan Docker Orchestration. Docker Orhcestration yang Kami pakai adalah Docker Compose.

“Docker compose is a tool for defining and running multi-container Docker applications” — Docker, Overview of Docker Compose

Agar dapat menggunakan docker compose, kita harus mendefinisikan sebuah file docker-compose.yml yang berisi konfigurasi service-service yang digunakan.

Django Web Framework

Agar perangkat lunak AdHub lebih cepat dan mudah untuk dikembangkan, Kami memilih Django Web Framework.

Django makes it easier to build better Web apps more quickly and with less code. — Django, Homepage of Official Django Web Framework Site

PostgreSQL

The World’s Most Advanced Open Source Relational Database — PostgreSQL, Homepage of Official PostgreSQL Site

Basis data yang digunakan oleh perangkat lunak AdHub adalah PostgreSQL. PostgreSQl merupakan basis data relasional yang umum digunakan. Terlebih, Kami cukup terbiasa menggunakan basis data ini dalam kegiatan perkuliahan 😃.

Arsitektur Aplikasi AdHub

Arsitektur perangkat lunak merupakan struktur sebuah sistem, yang meliputi elemen perangkat lunak, sifat yang tampak dari elemen itu, serta relasi di antara elemen-elemen tersebut (Bass et al dalam Krafzig et al, 2004). Sifat yang tampak misalnya fungsi apa saja yang disediakan oleh elemen, bagaimana kinerja nya, bagaimana penanganan kesalahannya, sumber daya apa saja yang digunakan.

Software-layer merupakan salah konsep utama yang harus diketahui, dikenali, dimengerti dan diimplementasikan pada saat akan membangun sebuah perangkat lunak (software). Software-layer terbagi menjadi empat lapisan, yaitu

A Quality Focus

Dalam mengembangkan sebuah aplikasi, tim harus menentukan kualitas, sasaran pengguna, dan lain-lain. Sehingga, tim pengembang dapat mengetahui level aplikasi yang dibangun. Sebagai contoh, Kami mengembangkan aplikasi AdHub. Kami harus mengetahui persona aplikasi AdHub. Dengan begitu, Kami dapat mengetahui quality focus aplikasi AdHub.

Process

Setelah, tim pengembang memahami quality focus aplikasi yang dikembangkan. Tim pengembang harus mengetahui bagaimana aplikasi dikembangkan. Proses pengembangan berhubungan dengan quality focus yang diharapkan. Proses-proses yang ada akan dikerjakan sesuai dengan Kunci Proses Area yang ada (KPA/Key Process Area).

Methods

Methods atau Metode merupakan salah satu hal yang penting dalam Pembuatan Perangkat Lunak. Dengan metode, pembuat program akan melakukan langkah-langkah dan tindakan-tindakan yang sesuai dengan metode yang ada. Metode yang digunakan harus disesuaikan dengan perangkat lunak yang dibangun, dan tujuan dari pembuatan perangkat lunak.

Tools

Tools merupakan alat bantu yang dapat digunakan oleh Programmer dalam menyelesaikan proyek yang ada. Dalam mengerjakan proyek ini kami menggunakan tools seperti Python, Django, Docker, PostgreSQL, PyCharm, Figma, GIMP, dan InkScape.

Jenis Arsitekur Aplikasi AdHub yaitu

Layered (n-tier) architecture

AdHub menggunakan arsitektur perangkat lunak yang paling umum yaitu layered architecture. Kode disusun sehingga data masuk dari layer paling atas dan bekerja di setiap layer sampai mencapai layer paling bawah. Layer paling bawah biasanya merupakan basis data aplikasi. Setiap layer memiliki tugas tertentu, seperti memeriksa konsistensi data. Dalam pengembangan aplikasi dengan arsitektur seperti ini, biasanya tim pengembang mengembangkan layer-layer berbeda secara independen.

Setelah memahami arsitektur pengembangan perangkat lunak dan teknologi-teknologi yang digunakan dalam pengembangan perangkat lunak AdHub. Saya mulai mempersiapkan struktur folder kode sumber proyek menggunakan django-admin. Kemudian, Saya mengatur beberapa konfigurasi perangkat lunak seperti basis data, folder berkas-berkas statis, dan folder templates sesuai best practice dan kebutuhan tim.

ROOT_URLCONF = 'adhub.urls'

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]

WSGI_APPLICATION = 'adhub.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

STATIC_URL = '/static/'

STATICFILES_DIRS = [os.path.abspath(os.path.join(
BASE_DIR, 'static'))]

# Simplified static file serving.
# https://warehouse.python.org/project/whitenoise/
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

Setelah mempersiapkan struktur folder kode sumber proyek, Saya membuat Dockerfile dan docker-compose.yml sesuai dengan rancangan services yang Saya sudah buat sebelumnya. Service-service tersebut adalah web dan db.

Workspace dimana Saya mempersiapkan arsitektur perangkat lunak AdHub

Dari tangkapan layar di atas, terlihat ada dua berkas kode penting dalam konfigurasi arsitektur perangkat lunak AdHub. Berkas-berkas tersebut adalah Dockerfile dan docker-compose.yml.

FROM python:3
ENV PYTHONUNBUFFERED 1

RUN mkdir /adhub
WORKDIR /adhub

COPY requirements.txt /adhub/
RUN
pip install -r requirements.txt
COPY . /adhub/

Dockerfile merupakan sebuah berkas konfigurasi yang akan di baca oleh docker untuk menghasilkan sebuah docker image. Format Dockerfile adalah INSTRUCTION arguments. Pada berkas Dockerfile diatas, terdapat lima INSTRUCTION berbeda yaitu FROM, ENV, RUN, WORKDIR, dan COPY.

  • FROM merupakan instruksi yang menerima argumen berupa nama docker image yang digunakan sebagai base image. Karena Kami menggunakan Django web framework, base image yang digunakan adalah Python versi 3.
  • ENV merupakan instruksi yang menerima pasangan nama environment variable dengan nilainya yang digunakan oleh perangkat lunak.
Hasil periksa env pada bash container service adhub web.
  • RUN merupakan instruksi yang menerima perintah dalam sistem operasi linux. Saya menulis dua instruksi RUN, instruksi pertama digunakan untuk membuat folder /adhub pada container dan instruksi kedua digunakan untuk memasang semua dependensi yang dibutuhkan menggunakan python package management system yaitu pip.
  • WORKDIR merupakan instruksi yang menerima lokasi standar yang digunakan. WORKDIR perlu didefinisikan untuk memisahkan folder aplikasi AdHub dengan file sistem Linux.
Lokasi folder ‘/adhub’ pada container adhub_web.
  • COPY merupakan instruksi yang digunakan agar docker menyalin file ke folder tujuan. Pada berkas ‘Dockerfile’ proyek AdHub, kode sumber AdHub disalin ke dalam container adhub_web.
version: '3'

services:
db:
image: postgres
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/adhub
ports:
- "8000:8000"
depends_on:
- db

Berkas ‘docker-compose.yml’ digunakan untuk mendefinisikan dan menjalankan beberapa container secara bersamaan. Dalam berkas tersebut, Saya mendefinisikan dua service yaitu ‘db’ dan ‘web’.

Service db merupakan service yang digunakan sebagai container dimana database berada. Container tersebut menggunakan PostgreSQL sebagai base image nya. Service web merupakan service yang digunakan sebagai container dimana kode sumber proyek kami berada. Pada service web, berkas ‘Dockerfile’ akan digunakan sebagai instruksi oleh proses build image docker compose.

Saat container dimulai, container tersebut akan menjalankan perintah runserver pada localhost:8000. Agar kami dapat mengakses aplikasi tersebut dari mesin lokal, Saya menulis konfigurasi port fowarding dari port 8000 container ke port 8000 mesin lokal.

Setiap ada perubahan kode sumber pada mesin lokal, Docker perlu memperbaharui kode sumber pada pada container. Oleh karena itu, Saya menggunakan docker volumes. Docker volumes memungkinkan adanya persistent storage pada docker container.

Service web membutuhkan koneksi dengan service database. Agar kedua service tersebut saling terkoneksi, Saya mendefinisikan ‘depends_on db‘ pada service web.

Setelah selesai mempersiapkan kode sumber, ‘Dockerfile’, dan ‘docker-compose.yml’ proyek. Mari kita lihat bagaimana Saya dapat menjalankan aplikasi ini di mesin lokal menggunakan docker-compose.

Tangkapan layar workspace Saya yang menampilkan file HOW-TO.md.
# How To
## Run this project using docker

- To build image of this project, use
``docker-compose build``
- To run this project, use
``docker-compose up``
- To shut down this project, use
``docker-compose down``
- To access terminal of this project running process, use
``docker-compose run web bash``

Dokumen di atas merupakan markdown yang berisi bagaimana menjalankan AdHub di mesin lokal menggunakan Docker Compose. Dokumen tersebut bernama ‘HOW-TO.md’ dan terletak pada root folder kode sumber proyek AdHub. Saya membuat dokumen tersebut dengan tujuan agar anggota tim yang lain dapat mengetahui perintah-perintah Docker apa saja yang dapat digunakan.

Membangun docker image dari proyek kode sumber AdHub

Proyek AdHub harus di-deploy pada server yang sudah disediakan tim pengajar proyek perangkat lunak tahun 2019. Saya dapat mem-push hasil build image ke registry docker ppl dan menjalankan image tersebut pada sebuah docker container yang dibuat di portainer ppl.

Karena Saya sudah menggunakan Docker Compose dalam proyek ini, Saya menggunakan perintah `docker-compose build`. Perintah tersebut akan membuat docker image sesuai dengan konfigurasi yang telah Saya tulis pada ‘Dockerfile’ dan ‘docker-compose.yml’.

Proses build docker image dan memberi tag docker image milik proyek Kami.

Setelah docker image proyek adhub_web berhasil dibuat, Saya mem-push image tersebut ke repository docker ppl.

Proses push docker image adhub_web ke repository docker ppl.
Tangkapan layar dari katalog registry docker ppl.

Pada registry docker ppl, terlihat adanya docker image ‘adhub_web’. Docker image tersebut siap di-deploy ke server ppl menggunakan portainer.

Mencoba menjalankan aplikasi ini menggunakan Docker Compose

Agar aplikasi ini dapat berjalan di mesin lokal, gunakan perintah ‘docker-compose up’ dan lihat hasilnya pada port yang telah dikonfigurasi di dalam file ‘docker-compose.yml’.

Proses menjalankan aplikasi AdHub menggunakan ‘docker-compose up -d’.
Tangkapan layar aplikasi web AdHub

Perintah tersebut akan menjalankan docker-compose dan secara otomatis akan membuat container untuk setiap service yang sudah didefinisikan pada ‘docker-compose.yml’.

Dilihat dari portainer yang telah dipasang di mesin lokal, berikut hasilnya

Tangkapan layar dari portainer lokal, setelah aplikasi AdHub berhasil dijalankan.

Terlihat dari hasil tangkapan layar tersebut, terdapat dua container yang berjalan yaitu adhub_web_1 dan adhub_db_1. Container adhub_web_1 merupakan container yang berisi kode sumber proyek kami, sedangkan container adhub_db_1 merupakan container yang berisi database aplikasi adhub.

Menjalankan hasil build image aplikasi AdHub pada portainer ppl

Pada tahap ini, Saya berhasil menjalankan hasil build docker image aplikasi AdHub pada portainer ppl. Konfigurasi berupa ‘docker-compose.yml’ versi 2 digunakan sebagai portainer stack untuk menjalankan docker image tersebut pada portainer.

version: '2'services:
database:
image: postgres:latest
volumes:
- data:/var/lib/postgresql
ports:
- "21202:5432"
web:
image: registry.docker.ppl.cs.ui.ac.id/ppla2:latest
command: python3 manage.py runserver 0.0.0.0:8000
ports:
- "21201:8000"
environment:
- DB_HOST=152.118.201.222
- DB_PORT=21202
depends_on:
- database

Development server: http://152.118.201.222:21201
Staging server: http://152.118.201.222:21203

Sekian, pengalaman Saya dalam mempersiapkan arsitektur pengembangan perangkat lunak AdHub. Sampai jumpa di artikel Saya yang lain 😄.

--

--