Cara Deploy Aplikasi Web Menggunakan Kamal untuk Proses yang Efektif

Cara Deploy Aplikasi Web Menggunakan Kamal untuk Proses yang Efektif

Proses deploy aplikasi web dalam container terkadang memang terlihat cukup rumit, apalagi kalau Anda belum memiliki pemahaman teknis tingkat lanjut. Untungnya, Kamal bisa membantu mempermudah prosesnya sehingga alur kerja deployment aplikasi web Anda menjadi lebih efisien dan praktis.

Di artikel ini, Anda akan mempelajari cara deploy aplikasi web menggunakan Kamal di VPS (virtual private server). Kami juga akan membagikan tips untuk meningkatkan efisiensi proses deployment aplikasi Anda.

Setelah membaca tutorial ini, Anda pun bisa mulai menggunakan Kamal untuk membantu menangani berbagai proyek Anda dengan lebih mudah. Yuk, simak panduannya di bawah ini!

Apa Itu Kamal?

Kamal adalah tool deployment yang berguna untuk meluncurkan aplikasi web secara efisien. Tool ini mengintegrasikan layanan dan operasi penting dalam alur kerja yang praktis sehingga proses deployment aplikasi web bisa dilakukan dengan lebih mudah dan minim risiko error.

Dari segi fungsi, Kamal dirancang untuk mengelola dan mengotomatiskan deployment aplikasi web sehingga pengguna tidak perlu repot menyiapkan server atau mengelola layanan secara manual.

Developer pun bisa membuat dan mengupdate aplikasi webnya tanpa biaya tambahan untuk hal-hal terkait deployment.

Kamal juga mendukung deployment di server fisik hingga single VM. Tool ini memungkinkan deployment tanpa downtime, restart bergilir, asset bridging, remote build, dan pengelolaan layanan aksesori yang menyeluruh.

Dengan Kamal, Anda bisa meluncurkan aplikasi web dengan mudah, mengonfigurasi server, mengelola database, dan menangani penyeimbangan traffic. Tool ini mendukung beragam sistem sehingga bisa digunakan untuk meluncurkan aplikasi web di berbagai platform.

Apa Keunggulan Kamal untuk Deploy Aplikasi Web?

tampilan homepage kamal

Kamal menyediakan berbagai fungsi untuk deployment aplikasi web bagi developer dan bisnis. Berikut beberapa keunggulan Kamal:

  • Praktis – Kamal difokuskan untuk memfasilitasi deployment sehingga tidak terlalu rumit dibandingkan dengan tool lainnya. Tool ini membantu menyederhanakan proses deployment aplikasi, yang bisa dilakukan hanya dengan menggunakan beberapa perintah Linux.
  • Automasi – menyediakan automasi untuk deployment, Kamal bisa membantu mempersingkat alur kerja Anda. Tool ini mengotomatiskan tugas mulai dari update hingga upgrade, serta memastikannya diselesaikan dengan cepat dan konsisten. Hal ini membantu mengurangi proses manual sehingga pengembangan bisa dilakukan dengan lebih optimal.
  • Stabil dan andal – dalam hal rilis aplikasi, Kamal bisa memastikan proses yang stabil. Proses deployment yang terstruktur mengurangi risiko error yang mungkin terjadi pada deployment manual, memastikan aplikasi web Anda berjalan dengan lancar dan minim masalah.
  • Kesesuaian – Kamal sangat kompatibel dengan sistem VPS Linux. Artinya, Anda bisa menggunakannya secara lebih maksimal untuk meluncurkan aplikasi di hosting VPS Linux.

Cara Deploy Aplikasi Web Menggunakan Kamal

Di bagian ini, Anda akan mempelajari cara menggunakan Kamal untuk mempermudah proses deployment aplikasi web.

1. Persiapkan Proses Deployment

Baik menggunakan perangkat lokal maupun server virtual, Anda perlu mempersiapkan beberapa hal lebih dulu demi kelancaran proses deployment. Dalam contoh ini, kami akan menggunakan VPS hosting dari Hostinger untuk menyiapkan sistem deployment aplikasi web.

VPS Hostinger menyediakan server yang canggih dan memadai untuk berbagai kebutuhan deployment Anda. VPS ini memiliki prosedur keamanan terbaik, upgrade yang mudah seiring dengan berkembangnya aplikasi, serta asisten AI untuk mempermudah proses pengembangan dan deployment Anda.

Setelah menyiapkan VPS, akses server menggunakan PuTTY atau SSH client lainnya. Kemudian, update package Linux dengan perintah SSH berikut ini:

sudo apt-get update && sudo apt-get upgrade

Selanjutnya, siapkan sistem software yang diperlukan oleh aplikasi web Anda, yang mungkin termasuk menginstal web server seperti Apache atau NGINX dan menyiapkan database seperti MySQL atau PostgreSQL.

Anda juga perlu menerapkan langkah-langkah keamanan server, seperti firewall dan kunci SSH untuk akses yang aman.

Apabila akan mengembangkan aplikasi Rails, pastikan Anda sudah menginstal framework Ruby on Rails. Atau, Anda bisa menginstal Docker dan mengelola container untuk aplikasi Anda.

2. Instal dan Mulai Deployment dengan Kamal

Setelah sistem Anda siap, mari lanjutkan dengan menginstal Kamal. Apabila menggunakan Ruby, instal Kamal secara global pada VPS Linux menggunakan perintah berikut:

gem install kamal

Langkah ini dimaksudkan agar Kamal bisa diakses dari direktori mana pun di server Anda.

Apabila lebih menyukai sistem container untuk deployment Kamal, ambil (pull) image Docker dan tetapkan alias dalam file konfigurasi shell Anda. Dengan demikian, Anda bisa menggunakan perintah Kamal tanpa menginstal dependensi pada server.

Selanjutnya, buka direktori config dan buka file deploy.yml. Di sini, Anda bisa menentukan informasi seperti tahapan deployment, alamat IP publik, dan URL repositori untuk kontrol versi dengan Kamal.

File deploy.yml juga akan menyertakan informasi registri. Apabila menggunakan Docker Hub, Anda tidak perlu menentukan server karena sudah diatur secara default.

Berikut contoh yang bisa disertakan dalam deploy.yml:

# Your web app name. Used to uniquely configure containers.
service: hey
# Your image host or container image name
image: 37s/hey
servers:
  - 192.168.0.1
  - 192.168.0.2
registry:
  # The container registry server, if you're not using Docker Hub
  # server: ghcr.io / ...
  username: registry-user-name
  password:
    secure: KAMAL_REGISTRY_PASSWORD
env:
  secret:
    secure: RAILS_MASTER_KEY
#Configure a custom healthcheck
healthcheck:
  path: /healthz
  port: 4000
  max_attempts: 7
  interval: 20s

Jangan lupa untuk menjaga kredensial Anda tetap aman dengan mengganti KAMAL_REGISTRY_PASSWORD dengan token akses registri Docker Anda.

Setelah file konfigurasi siap, saatnya memulai proses deployment. Untuk deployment awal, jalankan:

kamal setup

Perintah ini akan mempersiapkan server Anda dengan membuat direktori, mengatur izin, dan melakukan tugas-tugas lain yang diperlukan.

Untuk deployment selanjutnya, gunakan:

kamal deploy

Perintah ini menjalankan tugas-tugas yang diuraikan dalam file deploy.yml, seperti update kode, migrasi, dan memulai ulang layanan.

3. Sertakan File Environment

Untuk meluncurkan aplikasi web secara efektif menggunakan Kamal, Anda harus mengelola file environment dengan cermat. File-file ini berisi variabel environment yang sangat penting untuk mengonfigurasi aplikasi Anda dalam berbagai situasi pengembangan, pengujian, dan produksi.

Untuk alasan keamanan, file ENV aplikasi tidak boleh disertakan dalam kontrol versi. Anda bisa memanfaatkan fitur environment management Kamal yang canggih untuk mentransfer file-file ini ke server dengan aman.

Mulailah dengan menyimpan file environment Anda di lokasi yang aman. Anda bisa menggunakan VPS Hostinger untuk mengelola variabel environment aplikasi secara efektif, memastikan variabel tersebut diterapkan dengan aman dan dikelola secara konsisten selama deployment.

Selanjutnya, manfaatkan perintah kamal env push untuk mentransfer file ke server dengan aman.

Kapan pun Anda menambahkan variabel environment baru atau memodifikasi variabel environment yang sudah ada dalam file ENV, jangan lupa untuk mengirimkan (push) perubahan ini ke server remote menggunakan kamal env push.

Sebelum menjalankan perintah kamal deploy, selesaikan langkah ini untuk memastikan variabel yang telah diperbarui dimasukkan ke container aplikasi Anda.

Proses ini sangat penting untuk menjalankan layanan dan container Docker secara optimal, karena akan mengikuti konfigurasi yang ditetapkan oleh variabel-variabel environment.

4. Jalankan Perintah di Server

Guna mempermudah manajemen aplikasi web Anda, Kamal menyediakan fitur yang mudah digunakan untuk menjalankan perintah secara efisien di seluruh infrastruktur server.

Misalnya, untuk menjalankan perintah di semua server Anda guna mengecek versi Ruby, Anda bisa menjalankan:

kamal app exec 'ruby -v'

Outputnya akan mengonfirmasi versi Ruby pada setiap host aplikasi, misalnya:

App Host: 192.168.0.1
ruby 3.1.3p185 (2022-11-24 revision 1a6b16756e) [x86_64-linux]
App Host: 192.168.0.2
ruby 3.1.3p185 (2022-11-24 revision 1a6b16756e) [x86_64-linux]

Untuk menargetkan server utama saja, gunakan perintah berikut:

kamal app exec --primary 'cat .ruby-version'

Apabila perlu menjalankan perintah terkait Rails di semua server, seperti memeriksa pengaturan environment Rails, jalankan perintah berikut:

App Host: 192.168.0.1
About your application's environment
Rails version:             7.1.0.alpha
Ruby version:              ruby 3.1.3p185 (2022-11-24 revision 1a6b16756e) [x86_64-linux]
RubyGems version:          3.3.26
Rack version:              2.2.5
Middleware:                ActionDispatch::HostAuthorization, Rack::Sendfile, ActionDispatch::Static, ActionDispatch::Executor, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, ActionDispatch::RemoteIp, Rails::Rack::Logger, ActionDispatch::ShowExceptions, Action Dispatch::DebugExceptions, Action Dispatch::Callbacks, Action Dispatch::Cookies, Action Dispatch::Session::CookieStore, Action Dispatch::Flash, Action Dispatch::ContentSecurityPolicy::Middleware, Action Dispatch::PermissionsPolicy::Middleware, Rack::Head, Rack::ConditionalGet, Rack::ETag, Rack::TempfileReaper
Application root:          /rails
Environment:               production
Database adapter:          sqlite3
Database schema version:   20221231233303

Untuk tugas-tugas yang lebih interaktif, seperti meluncurkan konsol Rails atau sesi bash, Kamal juga bisa menyederhanakan prosesnya. Cukup jalankan perintah berikut untuk memulai sesi bash di container image aplikasi baru atau container Docker yang sedang berjalan:

# New container bash session
kamal app exec -i bash
# Reuse the current container for bash session
kamal app exec -i --reuse bash
# New container Rails console
kamal app exec -i 'bin/rails console'

5. Periksa Status Server dengan Kamal Details

Anda harus memahami kondisi server untuk menjaga performanya serta memastikan aplikasi Anda berjalan dengan lancar. Kamal menyediakan cara yang efisien untuk memantau hal ini melalui perintah details.

Dengan perintah kamal details, Anda bisa melihat keadaan container Anda, statusnya, serta performanya. Berikut hal-hal yang biasanya bisa dipantau:

Untuk container Traefik:

Traefik Host: 192.168.0.1
CONTAINER ID   IMAGE    COMMAND                 CREATED          STATUS          PORTS
6195b2a28c81   traefik  "/entrypoint.sh…" 30 minutes ago   Up 19 minutes   0.0.0.0:80->80/tcp...

Untuk container aplikasi Anda:

App Host: 192.168.0.1
CONTAINER ID   IMAGE                     COMMAND          CREATED         STATUS          PORTS
badb1aa51db3   registry.domain.tld/...  "/rails/bin/…"  13 minutes ago  Up 13 minutes   3000/tcp

Output ini menjelaskan bahwa container sudah berjalan dan port-port sudah dipetakan dengan benar, yang menunjukkan bahwa kondisi server berjalan dengan baik.

Untuk pengecekan yang lebih spesifik, Anda bisa menargetkan container khusus aplikasi dengan menggunakan kamal app details, atau kamal traefik details untuk container khusus Traefik.

Perintah-perintah ini menyediakan akses langsung ke log dan container secara spesifik, mempermudah pengelolaan konfigurasi sistem serta penanganan error dalam deployment Kamal.

6. Rollback Deployment

Apabila deployment tidak berjalan sesuai rencana, Anda bisa memanfaatkan rollback Kamal yang praktis. Proses ini dilakukan dengan aktivasi ulang container Docker yang sebelumnya berjalan stabil. Untuk mengelola rollback dengan cepat dan efisien, ikuti langkah-langkah berikut:

Pertama, cari tahu container lama yang tersedia dengan menggunakan perintah kamal app containers. Perintah ini akan mencantumkan container yang aktif dan tidak aktif. Cari container aktif terakhir berdasarkan tag image atau ID container sebelum terjadi kegagalan deployment.

Contohnya, Anda mungkin melihat output seperti berikut:

App Host: 192.168.0.1
CONTAINER ID   IMAGE               COMMAND                  STATUS
1d3c91ed1f51   [previous_image]    "/rails/bin/docker-e…"   Up 19 minutes
539f26b28369   [failed_image]      "/rails/bin/docker-e…"   Exited (1) 27 minutes ago

Untuk melakukan rollback, jalankan kamal rollback [previous_image_tag]. Kamal akan menghentikan container yang saat ini bermasalah dan memulai ulang container terakhir yang stabil. Mengingat container sebelumnya sudah ada di host, proses rollback bisa dilakukan dengan cepat tanpa proses pull lagi dari registri.

Perlu diperhatikan bahwa container lama akan otomatis dibersihkan dalam tiga hari setelah kamal deploy dilakukan. Jadi, konfirmasikan apakah deployment Anda berhasil dalam jangka waktu ini agar bisa memanfaatkan opsi rollback cepat.

Selain itu, pastikan Anda memiliki file backup dan restore yang tepat dengan Kamal untuk berjaga-jaga kalau terjadi masalah yang tidak terduga. Nah, kalau menggunakan VPS Hosting dari Hostinger, Anda bisa memanfaatkan fitur backup otomatis untuk proses rollback yang jauh lebih mudah.

7. Bersihkan Server dengan Kamal Remove

Anda bisa menghapus aplikasi yang tidak digunakan untuk mengelola ruang dan performa server. Dengan Kamal, proses ini bisa dilakukan dengan sangat mudah. Untuk menghapus seluruh aplikasi, jalankan perintah kamal remove.

Kamal kemudian akan menghapus semua komponen yang terkait dengan aplikasi di server, termasuk menghentikan dan menghapus container Docker, menghapus image Docker apa pun, dan menghapus sesi registri yang terkait.

Perintah ini berfungsi untuk memastikan server Anda tetap berjalan secara efisien dan optimal. Namun, Anda harus menggunakan fitur ini dengan hati-hati. Sebelum menjalankan kamal remove, pastikan untuk membackup data apa pun yang ingin Anda simpan.

8. Reboot Traefik

Ketika mengelola load-balancer dan reverse proxy, terutama di server NGINX, mungkin ada kalanya Anda perlu reboot Traefik, layanan yang merutekan traffic HTTP Anda. Hal ini biasanya perlu dilakukan setelah argumen atau label Traefik diperbarui, yang mengharuskan pengguna melakukan reboot agar perubahan diterapkan.

Untuk reboot Traefik menggunakan Kamal, jalankan perintah berikut:

kamal traefik reboot

Proses ini akan memulai ulang layanan Traefik dan menerapkan konfigurasi yang baru. Namun, di lingkungan produksi yang mengutamakan stabilitas dan uptime, pilihlah fitur rolling reboot:

kamal traefik reboot --rolling

Rolling reboot akan memulai ulang container Traefik secara berurutan, membantu meminimalkan downtime dan menjaga load-balancer agar tetap berfungsi optimal.

Metode yang lebih aman ini memastikan bahwa aplikasi web Anda tetap bisa diakses oleh pengguna saat update sedang berlangsung di latar belakang.

Tips Terbaik Deploy Aplikasi Web dengan Kamal

Setelah mempelajari cara deploy aplikasi web Anda ke server, mari simak beberapa tips terbaik dalam proses deployment Kamal untuk manajemen aplikasi web yang lancar dan efisien.

Otomatiskan Alur Kerja Deployment

Berkat automasi deployment Kamal, tugas-tugas manual yang berulang bisa dilakukan dalam cara yang jauh lebih praktis. Anda bisa mengotomatiskan setup awal, update, dan maintenance aplikasi web dengan perintah dan skrip Kamal sehingga proses deployment menjadi lebih cepat, stabil, dan minim risiko kesalahan pengguna.

Selain itu, Anda bisa mengintegrasikan tool automasi deployment Kamal dalam pipeline CI/CD untuk meningkatkan efisiensi lebih lanjut. Pipeline ini memfasilitasi peningkatan performa dan update yang lancar sehingga membantu mengoptimalkan prosesnya secara keseluruhan, mulai dari pengembangan hingga deployment.

Dalam hal ini, VPS Hosting dari Hostinger adalah opsi yang ideal. Anda bisa memanfaatkan Asisten AI untuk mempermudah automasi skrip guna mengelola dan menyesuaikan aplikasi web. Gunakan Asisten AI VPS Hostinger untuk mendapatkan petunjuk tentang cara mengotomatiskan alur kerja deployment Anda.

Misalnya, Anda bisa menggunakan prompt AI VPS seperti “Bagaimana cara mengotomatiskan backup server database menggunakan Kamal?”

Asisten AI kami kemudian akan memberikan panduan langkah demi langkah yang lengkap. Anda bisa mengajukan pertanyaan lanjutan kalau membutuhkan panduan lebih lanjut. Asisten AI VPS Hostinger juga bisa menyediakan template kode aplikasi untuk mempercepat proses setup.

Deploy Lock dan Operasi Serentak yang Aman

Anda perlu mengelola operasi serentak secara efektif ketika meluncurkan aplikasi web untuk mencegah konflik dan menjaga integritas aplikasi Anda. Kamal memfasilitasi hal ini dengan fitur deploy lock, yaitu mekanisme koordinasi yang mengizinkan satu deployment saja dalam satu waktu.

Berikut cara menerapkan deploy lock dalam proses deployment Anda:

Sebelum Deployment

Mulai deploy lock agar proses deployment tidak saling menimpa dengan menggunakan perintah kamal lock acquire -m “Your reason for locking”. Perintah ini akan membuat direktori kamal_lock pada server utama, yang menunjukkan bahwa proses deployment sedang berlangsung.

Selama Deployment

Verifikasikan status lock dengan kamal lock status guna menentukan siapa yang memulai lock dan apa tujuannya, serta versi mana yang digunakan. Anda mungkin akan melihat output seperti berikut:

Locked by: A.N. Other on 2023-03-24 09:49:03 UTC
Version: 77f45c0686811c68989d6576748475a60bf53fc2
Message: Automatic deploy lock

Output ini menyediakan informasi tentang aktivitas deployment yang sedang berlangsung dan memastikan tidak ada operasi yang saling bertentangan.

Setelah Deployment Berhasil

Selesaikan proses deployment dengan merilis deploy lock menggunakan kamal lock release. Tindakan ini berfungsi untuk membersihkan sistem kalau perlu melakukan deployment lagi dan mengoptimalkan keseluruhan prosesnya.

Gunakan Kamal Hook

Kamal menyediakan sistem hook bagi developer untuk menjalankan skrip khusus pada area tertentu dalam proses deployment. Sistem ini memungkinkan automasi yang disesuaikan serta memastikan proses deployment yang konsisten dan stabil.

Ada empat jenis hook Kamal:

  • Pre-connect hook – dieksekusi sebelum Kamal mengambil deploy lock dan sebelum membuat sambungan ke remote host. Hook ini berguna untuk tugas DNS warming.
  • Pre-build hook – dijalankan sebelum proses build dimulai, melakukan validasi pre-build seperti memeriksa perubahan yang belum diterapkan atau memastikan integrasi berkelanjutan (CI/continuous integration) telah berlalu.
  • Pre-deploy hook – dipicu tepat sebelum deployment dimulai, cocok untuk pemeriksaan akhir seperti memverifikasi penyelesaian CI.
  • Post-deploy hook – diaktifkan setelah deploy, redeploy, atau rollback hook. Post-deploy hook bisa mengirimkan notifikasi deployment atau mendaftarkan versi baru ke sistem manajemen performa aplikasi (APM).

Skrip dalam hook ini memiliki akses ke berbagai variabel environment KAMAL_*, yang menyediakan konteks mendetail tentang proses deployment, termasuk timestamp, informasi pengguna, detail versi, dan daftar host.

Apabila ada skrip yang diselesaikan dengan status bukan nol, proses deployment akan dibatalkan untuk mencegah risiko error yang menyebar.

Berikut salah satu contoh pembuatan skrip post-deploy hook yang mengirimkan notifikasi deployment ke chatbot di Basecamp menggunakan variabel KAMAL_*:

#!/usr/bin/env bash
curl -q -d "content=[My App] ${KAMAL_PERFORMER} Rolled back to version ${KAMAL_VERSION}" https://3.basecamp.com/XXXXX/integrations/XXXXX/buckets/XXXXX/chats/XXXXX/lines

Skrip ini akan memposting pesan yang menunjukkan siapa yang melakukan rollback beserta versi targetnya.

Apabila hook tidak diperlukan, Anda bisa melewatinya dengan menggunakan flag -skip_hooks selama perintah deployment, yang mencegah eksekusi skrip kustom ini.

Kesimpulan

Di tutorial ini, Anda sudah mempelajari apa itu Kamal, keunggulannya, dan langkah-langkah deploy aplikasi web menggunakan Kamal di VPS Linux.

Kami juga memberikan tips-tips deployment Kamal, seperti automasi alur kerja, mengamankan operasi dengan deploy lock, dan mengoptimalkan proses dengan hook Kamal.

Apabila berencana untuk mengembangkan aplikasi web Anda, cobalah VPS hosting dari Hostinger yang bisa Anda atur sesuai kebutuhan. Dengan harga mulai dari Rp85900.00/bulan, Anda bisa memanfaatkan berbagai fitur canggih untuk segala kebutuhan aplikasi Anda.

Misalnya, Anda akan mendapatkan snapshot real-time gratis, backup mingguan otomatis, serta Asisten AI yang membantu memaksimalkan strategi deployment dan meningkatkan performa proyek Anda.

Jadi, tunggu apa lagi? Yuk, coba VPS hosting dari Hostinger dengan berbagai fitur canggihnya! Semoga berhasil!

Artikel Lainnya seputar Deployment dan Containerization

Apa itu Docker dan Bagaimana Cara Kerjanya?
Cara Menginstal dan Setup Redis di Ubuntu

Tanya Jawab (FAQ) Cara Deploy Aplikasi Web Menggunakan Kamal

Bagian ini akan menjawab pertanyaan-pertanyaan umum tentang cara deploy aplikasi web menggunakan Kamal.

Apa Persiapan Menggunakan Kamal untuk Deploy Aplikasi Web?

Sebelum melakukan deployment dengan Kamal, pastikan Anda sudah menginstal Git untuk kontrol versi, memiliki akses SSH ke server untuk koneksi yang aman, dan sistem aplikasi Rails dengan dependensi yang diperlukan. Persiapan ini sangat penting untuk proses deployment Kamal yang lancar.

Apakah Bisa Deploy Aplikasi Web Apa Pun Dengan Kamal?

Ya, Kamal bisa menangani berbagai jenis aplikasi web selain aplikasi Rails. Kamal menyediakan sistem deployment yang fleksibel dan cocok untuk berbagai framework aplikasi web sehingga developer bisa meluncurkan proyeknya secara efektif, apa pun teknologi dasarnya.

Apakah Kamal Bisa Mengelola Aplikasi Web Sesuai Kebutuhan?

Kamal sangat ideal untuk mengatur aplikasi web sesuai kebutuhan karena mendukung deployment di beberapa host dan terintegrasi dengan load-balancer, yang penting untuk distribusi traffic dan memastikan aplikasi Anda selalu tersedia seiring dengan bertambahnya pengguna dan traffic.

Author
Penulis

Faradilla A.

Faradilla, yang lebih akrab disapa Ninda, adalah Content Marketing Specialist di Hostinger. Ia suka mengikuti tren teknologi, digital marketing, dan belajar bahasa. Melalui tutorial Hostinger ini, Ninda ingin berbagi informasi dan membantu pembaca menyelesaikan masalah yang dialami. Kenali Ninda lebih dekat di LinkedIn.