“Gue ga ngerti docker-dockeran….” How to deploy your Django API with PostgreSQL database to Portainer

Anisha Inas
PPL cewe semua!
Published in
4 min readMar 17, 2019

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.

file settings.py mengatur konfigurasi mana yang akan digunakan

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:

File staging.py mengatur konfigurasi pada 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.

--

--