Diagram diatas merupakan flow user dari internet menuju ingress hingga mencapai pod. Ingress sebenarnya adalah resource pada Kubernetes yang digunakan untuk mengexpose service ke dunia luar (internet) melalui konfigurasi host dan path untuk masing-masing service. Dari service tersebut akan meneruskan ke pod, dimana pada pod terdapat aplikasi sc-auth yang berjalan.
Saat user berhasil login, maka user akan mendapatkan access_token
dan refresh_token
yang digunakan untuk mengakses resource yang ada di aplikasi seperti profile dan menambahkan user baru melalui API users
jika memiliki previleges Admin
.
.
├── api
│ └── v1
│ └── accounts.py
├── app.db
├── config.py
├── Dockerfile
├── images
│ └── db.png
├── infra
│ ├── apply.sh
│ ├── sc-auth-deployment.yaml
│ ├── sc-auth-ingress.yaml
│ ├── sc-auth-namespace.yaml
│ ├── sc-auth-secret.yaml
│ └── sc-auth-service.yaml
├── main.py
├── models
│ ├── roles.py
│ ├── tokens.py
│ └── users.py
|── README.md
├── requirements.txt
├── schemas
│ └── user.py
├── test_app.db
├── tests
│ └── test_auth.py
└── wsgi.py
Keterangan folder:
api
: older yang digunakan untuk membuat backend dari apps
config.py
: file config dari database
infra
: folder untuk menaruh script deployment k8s
models
: foder yang berisi model database
schemas
: folder untuk scripts schema/input validation & ouput
tests
: berisi test case untuk check function pada apps
main.py
: main executor file untuk project
wsgi.py
: digunakan untuk executor di production
Terdapat 4 buah tabel utama yang digunakan pada pada aplikasi ini, yaitu users
, roles
, tokens
dan alembic_version
.
Tabel users
digunakan untuk menampung data users dengan identifier yang unique pada kolom id, uuid, email dan username
. Agar users diketahui rolesnya terdapat kolom role_id
yang mengarah pada tabel roles
. Isi dari role_id
berupa integer dengan nilai yang mereferensikan id
dari table roles
Tabel roles
berperan dalam hal identifikasi role apa saja yang ada di sisi tabel users
. Dalam kasus ini terdapat 2 roles yaitu Admin
dan User
. Admin
berperan sebagai hak akses yang memanage aplikasi secara menyeluruh, sedangkan User
hanya bisa memiliki peran standard tanpa bisa mengakases endpoint dengan privilege Admin
.
Tabel tokens
digunakan untuk tracking token yang di generate saat login dan di revoke saat logout. Sehingga ketika user melakukan logout token akan dihapus aksesnya.
Sedangkan tabel alembic_version
digunakan untuk tracking migrations dari proses pembuatan/perubahan struktur tabel.
- Download project
git clone https://github.com/sahalaww/sc-auth
cd sc-auth
cp .env.example .env
- Membuat vituralenv python dan install dependencies
sudo apt install python3-venv python3-pip
python3 -m venv venv
source venv/bin/activate
pip install ---upgrade pip
pip install -r requirements.txt
- Edit File .env menjadi
DEBUG=True
SECRET_KEY=abcdefghijklmn0pqw213
CONFIG_ENV=config.DevConfig
- Init database (membuat migrations)
export FLASK_APP=main.py
flask db init
flask db migrate
flask db upgrade
# insert new data
flask seed-default-data
- Run dev
flask run
- Edit File .env menjadi
DEBUG=True
SECRET_KEY=abcdefghijklmn0pqw213
CONFIG_ENV=config.DevConfig
- Init database (membuat migrations)
export FLASK_APP=main.py
flask db init
flask db migrate
flask db upgrade
# insert new data
flask seed-default-data
- Run Docker Build dan Run Container Detach Mode
docker build -t sc-auth:latest .
docker run -d -p 8000:8000 --env-file ".env" sc-auth:latest
- Edit File .env menjadi
DEBUG=True
SECRET_KEY=abcdefghijklmn0pqw213
CONFIG_ENV=config.TestConfig
- Init database & run tes
export FLASK_APP=main.py
flask db init
flask db migrations
flask db upgrade
flask run-test
Pada proses ini saya menggunakan minikube
sebagai cluster Kubernetes. Maka step deploymentnya sebagai berikut:
- Install Minikube dan jalankan cluster
- Install MySQL
- Edit
.env
file untuk generate tabel pada server
DB_HOST=localhost
DB_USER=sahl
DB_PASS=2504
DB_NAME=sc_auth
DEBUG=False
SECRET_KEY=9r93mau0o3212bcepper90909090909am
CONFIG_ENV=config.ProductionConfig
- Init tabel
export FLASK_APP=main.py
flask db init
flask db migrations
flask db upgrade
# menambahkan default data
flask seed-default-data
- Edit config/secret pada file
infra/sc-auth-secret.yaml
dan sesuaikan dengan server MySQL yang dibuat apply.sh
dan tunggu beberapa menit
cd infra
./apply.sh
Pada script diatas akan membuat namespace bernama sc-auth
, deployment sc-auth
dengan jumlah replica 2 buah dan terdapat limit resource sebesar 500m
untuk CPU, 128Mi
untuk memory. Lalu terdapat resource sc-auth-secret
yang digunakan pada deployment untuk menyimpan environment variable sebagai config database MySQL.
Kemudian terdapat resource ingress
yang digunakan untuk mengexpose sc-auth-svc
ke dunia luar agar dapat diakses melalui internet.
- Cek ingress dengan
kubectl get ing -n sc-auth
kubectl get ing -n sc-auth
NAME CLASS HOSTS ADDRESS PORTS AGE
sc-auth-ingress <none> sc-auth.io 192.168.49.2 80 31h
- Update file hosts
/etc/hosts
menjadi
192.168.49.2 sc-auth.io
- Service bisa diakes secara lokal melalui
http://sc-auth.io
Role: Admin
Username: admin
Password: pass1234
Role: User
Username: userman
Password: pass134
Demo API saat diakses melalui curl
Via Postman https://documenter.getpostman.com/view/18592251/UVJhCE5d