“Gue ga ngerti docker-dockeran….” How to deploy your Django API with PostgreSQL database to Portainer
Pada tulisan sebelumnya saya sudah menggambarkan secara kasar bagaimana Docker bekerja, sekarang saya akan memberikan langkah-langkah yang harus dilakukan agar API django dapat diakses di Portainer.
Setup Django Project
Terdapat beberapa hal penting dalam pengaturan project agar API dapat diakses di portainer meliputi:
settings.py
Di file ini diatur konfigurasi untuk url, port, dan database yang digunakan untuk meng-serve API.
Saat program di-run maka settings.py akan menggunakan konfigurasi berdasarkan isi dari environment variable dengan key ‘DJANGO_ENV’. Jika tidak ditemukan maka akan digunakan nilai default yaitu ‘LOCAL’.
File settings untuk environment
Seluruh file settings untuk environment berbeda meng-import file base.py yang menyimpan pengaturan yang sama untuk seluruh environment. Dalam environment development, staging, dan production, yang umum dibedakan adalah pengaturan DEBUG dan databasenya. Berikut contoh dari konfigurasi untuk environment staging:
Untuk dapat menggunakan konfigurasi ini maka kita harus mengatur environment variable di mesin tempat program berjalan.
Setup Docker
Berikut ini adalah file-file yang penting untuk membuat Docker image.
requirements.txt
Berisi package yang perlu diinstall pada project. Untuk mengetahui package apa saja yang terinstall dalam project dapat dijalankan pip freeze > requirements.txt. Berikut contoh requirements.txt project kami:
Dockerfile
Untuk melakukan build image, maka Docker akan mencari Dockerfile untuk mengetahui apa saja yang dibutuhkan pada image.
Image project ini akan memanfaatkan image python yang sudah ada yaitu python:3.5-slim. Install package di requirements.txt, kemudian atur sehingga image akan menjalankan command di start.sh saat dijalankan
start.sh
File ini mengatur agar gunicorn menjalankan proses server untuk project. Atur di port mana program dijalankan di file ini.
Buat image PostgreSQL
Berikut adalah Dockerfile untuk membuat image database seperti pada https://docs.docker.com/engine/examples/postgresql_service/. Atur konfigurasi database pada bagian USER <nama_user>. User ini akan digunakan untuk nilai ‘NAME’ pada pengaturan database di settings.py. Tentukan ‘USER’ dan ‘PASSWORD’ di settings.py di project django di bagian create user. Build image, kemudian push ke registry.
Manual deployment
Jika proses deployment tidak perlu di automasi maka build image dapat dijalankan di local. Gunakan command berikut untuk membuat image project dan melakukan push ke portainer:
Gitlab Deployment
Agar project dapat terdeploy secara otomatis setiap kali melakukan push ke gitlab maka perlu diatur di .gitlab-ci.yml
.gitlab-ci.yml
only: -sit_uat membuat job staging hanya dijalankan pada branch sit_uat saja. script akan menjalankan command untuk membuat image dan melakukan push ke portainer
Portainer
Berikut ini adalah langkah langkah untuk meng-serve API di portainer
Pull image dari registry
Di bagian images pull image yang sebelumnya dipush di registry. Pull image untuk database dan image untuk API.
Buat container database
Di bagian container, buat container baru dengan pengaturan sebagai berikut. Tentukan port container sesuai dengan yang ada di Dockerfile dan port Host bebas sesuai keinginan. Jika sudah, tekan tombol deploy the container
Buat container API
Tentukan port container sesuai dengan yang ada di start.sh dan port host sesuai keinginan.
Atur environment variable yang diperlukan. DB_HOST diisi dengan url container database, begitu juga dengan DB_NAME, DB_USER, DB_PASS, DB_PORT seperti container database yang dibuat sebelumnya.
Lakukan migration
Sebelumnya cek apakah kedua container sudah berjalan.
Tekan icon console (>_) di container backend untuk menjalankan command migration. Tekan tombol connect, lalu ketik command.
Test apakah API sudah bekerja
Buat superuser untuk halaman admin
Buka halaman tempat container berada dan akses halaman admin kemudian login. Jika berhasil maka API sudah dapat digunakan.