Overview Sistem
QRIS Acquirer System adalah platform pembayaran digital terintegrasi yang dibangun dengan arsitektur microservices. Sistem menghubungkan merchant, switching Artajasa, dan disbursement Flip dalam satu ekosistem yang scalable.
Arsitektur Sistem
Sistem menggunakan arsitektur microservices yang dikelola oleh Caddy sebagai reverse proxy. Setiap service berjalan dalam Docker container yang terisolasi dan terhubung melalui jaringan internal app-network.
pocikode.web.id Β· nexuscode.web.id Β· system.pocikode.web.id
:1500
:1200
:1400
:1300
:1100
:3000
:8000
4 schemas
cache + queue
QRIS Switching
Disbursement
:3200
http://core-auth:1500). Logging-stack menggunakan network terpisah logging-network dan terhubung ke Docker socket untuk collect container logs via Promtail.Service Catalog
Rincian setiap service, teknologi, port, database, dan endpoint utama yang tersedia.
| Service | Stack | Port | Database | Endpoint Utama |
|---|---|---|---|---|
| core-auth Autentikasi & User Mgmt |
Go 1.25 Fiber v2 | :1500 | db_user | /api/v1/health /backoffice/merchant /backoffice/user /merchant/auth/login /internal/merchant |
| core-wallet Saldo, Mutasi, Ledger |
Go 1.25 Fiber v2 | :1200 | db_wallet | /api/v1/health /api/v1/balance /api/v1/mutation /api/v1/ledger |
| core-payment QRIS Generate & Artajasa |
Go 1.25 Fiber v2 | :1400 | db_payment | /openapi/v1.0/qr/qr-mpm-generate /openapi/v1.0/qr/qr-mpm-query /secure/jsonAPI/v1/echo /secure/jsonAPI/v1/paycredit /secure/jsonAPI/v1/cut-over |
| core-transfer Disbursement & Flip |
Go 1.25 Fiber v3 | :1300 | db_transfer | /api/v1/inquiry /api/v1/payment /api/v1/disbursement/flip/transfer /callback/disbursement/flip |
| core-worker Background Jobs & Scheduler |
Go 1.25 Fiber v2 | :1100 | db_payment | /health /api/v1/jobs/summary /api/v1/jobs/check-pending /api/v1/jobs/retry-callbacks /api/v1/jobs/settlement-cutoff |
| dashboard-web-app Portal Merchant |
Next.js 16 React 19 | :3000 | via API | dashboard-merchant.nexuscode.web.id /login Β· /onboarding Β· /admin/* |
| backoffice-portal Admin Panel |
Laravel 13 PHP 8.3 | :8000 | portal_backoffice | backoffice.nexuscode.web.id /login Β· /merchant Β· /transaction |
| logging-stack Observability |
Grafana 10.4 | :3200 | file/volume | logs.pocikode.web.id Loki :3100 Β· Promtail β Docker logs |
Database Schema
Sistem menggunakan PostgreSQL 16 dengan 5 database terpisah per domain. Setiap service memiliki database isolasi sendiri untuk mendukung prinsip loose coupling.
users (id, merchant_id, role, ...)
sessions (id, user_id, token, ...)
merchant_configs (fee, limit, ...)
files (key, url, type, ...)
mutations (id, wallet_id, amount, type, ...)
ledgers (id, ref_id, debit, credit, ...)
settlements (id, date, amount, status, ...)
artajasa_callbacks (id, order_id, payload, ...)
merchant_callbacks (id, order_id, url, status, ...)
configurations (key, value, ...)
cutoff_logs (id, date, processed_at, ...)
flip_transactions (id, disbursement_id, flip_id, ...)
inquiries (id, account_no, bank_code, ...)
transfer_logs (id, ref_id, status, ...)
5433 (bukan standar 5432) untuk alasan keamanan. Redis berjalan di port standar 6379 sebagai session store, cache layer, dan message broker antar service.Technology Stack
Seluruh komponen dipilih untuk performa tinggi, keandalan, dan kemudahan deployment.
Infrastruktur VPS
Sistem berjalan pada single VPS IDCloudHost dengan spesifikasi berikut.
| Provider | IDCloudHost |
| IP Address | 103.59.94.229 |
| OS | Ubuntu 24.04 LTS |
| Kernel | 6.8.0-134-generic |
| CPU | 2 vCPU |
| RAM | 4 GB (3.8 GiB) |
| Disk | 29 GB SSD |
| User | tpid_project |
/home/tpid_project/app/
βββ core-auth/ (5.0 MB)
βββ core-wallet/ (1.2 MB)
βββ core-payment/ (114 MB)
βββ core-transfer/ (884 KB)
βββ core-worker/ (580 KB)
βββ dashboard-web-app/ (24 MB)
βββ backoffice-portal/ (13 MB)
βββ logging-stack/ (5.5 MB)
# Web root (Caddy serve)
/var/www/api-docs-portal/
CI/CD Pipeline
Setiap push ke branch main di GitLab akan memicu GitLab Runner yang berjalan langsung di VPS untuk auto-deploy.
developer local
proyek-candi group
VPS (shell executor)
build + up -d
# Cara pakai β dari local setelah git push:
sshpass -p '...' ssh tpid_project@103.59.94.229 "bash ~/deploy-api-docs.sh"
# Yang dilakukan script:
β git fetch + reset --hard # pull versi terbaru
β‘ rsync --delete # sync ke /var/www/api-docs-portal/
β’ --chown=caddy:caddy # set owner ke Caddy
β£ Exclude .git, tests/ # tidak deploy file dev
ssh tpid_project@103.59.94.229
# Masuk direktori service
cd ~/app/core-auth
# Pull latest code
git pull origin staging
# Rebuild dan restart container
docker compose build --no-cache
docker compose up -d
# Verifikasi
docker ps --filter "name=core-auth"
curl -s http://127.0.0.1:1500/api/v1/health
β {"status":"ok"}
Deployment Guide β From Scratch
Panduan lengkap setup sistem dari awal pada server baru (fresh Ubuntu 24.04 LTS).
-
Install Prerequisites# Update system
sudo apt update && sudo apt upgrade -y
# Install Docker
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Install Caddy
sudo apt install -y caddy
# Install PostgreSQL 16
sudo apt install -y postgresql-16 -
Clone Repositories & Setup Environment# Clone semua service
mkdir -p ~/app && cd ~/app
git clone git@gitlab.com:proyek-candi/core-auth.git
git clone git@gitlab.com:proyek-candi/core-wallet.git
git clone git@gitlab.com:proyek-candi/core-payment.git
git clone git@gitlab.com:proyek-candi/core-transfer.git
git clone git@gitlab.com:proyek-candi/core-worker.git
git clone git@gitlab.com:proyek-candi/dashboard-web-app.git
git clone git@gitlab.com:proyek-candi/backoffice-portal.git
# Copy dan isi .env untuk setiap service
cp core-auth/.env.example core-auth/.env -
Setup Database & Docker Network# Buat databases
sudo -u postgres psql -c "CREATE DATABASE db_user;"
sudo -u postgres psql -c "CREATE DATABASE db_wallet;"
sudo -u postgres psql -c "CREATE DATABASE db_payment;"
sudo -u postgres psql -c "CREATE DATABASE db_transfer;"
sudo -u postgres psql -c "CREATE DATABASE portal_backoffice;"
# Buat shared Docker network
docker network create app-network -
Build & Start Backend Services# Start semua service (urutan penting!)
cd ~/app/core-wallet && docker compose up -d --build
cd ~/app/core-auth && docker compose up -d --build
cd ~/app/core-payment && docker compose up -d --build
cd ~/app/core-transfer && docker compose up -d --build
cd ~/app/core-worker && docker compose up -d --build
# Frontend
cd ~/app/dashboard-web-app && docker compose up -d --build
cd ~/app/backoffice-portal && docker compose up -d --build
# Logging stack
cd ~/app/logging-stack && docker compose up -d
# Verifikasi semua container
docker ps --format "table {{.Names}}\t{{.Status}}" -
Konfigurasi Caddy Reverse Proxy# Edit Caddyfile
sudo nano /etc/caddy/Caddyfile
# Reload Caddy setelah edit
sudo systemctl reload caddy
sudo caddy validate --config /etc/caddy/Caddyfile
# Caddy otomatis handle TLS/SSL via Let's Encrypt
β HTTPS tersedia otomatis untuk semua domain -
Verifikasi Health Check Semua Servicecurl -s http://127.0.0.1:1100/health # core-worker
curl -s http://127.0.0.1:1200/api/v1/health # core-wallet
curl -s http://127.0.0.1:1300/api/v1/health # core-transfer
curl -s http://127.0.0.1:1400/api/v1/health # core-payment
curl -s http://127.0.0.1:1500/api/v1/health # core-auth
curl -s http://127.0.0.1:3000/ # dashboard
curl -s http://127.0.0.1:8000/ # backoffice
Konfigurasi Caddy
Caddy berfungsi sebagai entry point semua traffic, mengelola TLS otomatis via Let's Encrypt, dan melakukan routing ke service yang sesuai.
pocikode.web.id {
root * /var/www/api-docs-portal
file_server
rewrite * /pocikode-landing.html
}
system.pocikode.web.id {
root * /var/www/api-docs-portal
file_server
rewrite * /system.html
}
api.pocikode.web.id {
encode gzip zstd
handle_path /auth/* { reverse_proxy 127.0.0.1:1500 }
handle_path /payment/* { reverse_proxy 127.0.0.1:1400 }
handle_path /transfer/* { reverse_proxy 127.0.0.1:1300 }
handle_path /wallet/* { reverse_proxy 127.0.0.1:1200 }
handle_path /worker/* { reverse_proxy 127.0.0.1:1100 }
handle / { root * /var/www/api-docs-portal; file_server }
}
dashboard-merchant.nexuscode.web.id {
reverse_proxy 127.0.0.1:3000
}
backoffice.nexuscode.web.id {
reverse_proxy 127.0.0.1:8000
}
logs.pocikode.web.id {
reverse_proxy 127.0.0.1:3200
}
Logging Stack & Observability
Semua log dari container Docker dikumpulkan secara otomatis via Promtail, dikirim ke Loki, dan divisualisasikan di Grafana.
stdout/stderr logs
:docker socket
:3100 (local)
:3200 β logs.pocikode.web.id
/var/lib/docker/containers dan /var/run/docker.sock untuk collect log semua container secara otomatis. Memory limit: Loki 250MB, Promtail 100MB, Grafana 200MB.Security Model
Implementasi keamanan berlapis sesuai OWASP API Top 10 dan standar QRIS Bank Indonesia.
- β OAuth 2.0 B2B Token (SNAP Standard)
- β JWT dengan expiry & refresh token
- β RBAC (Role-Based Access Control)
- β Internal Signature HMAC untuk antar-service
- β Session management via Redis
- β HTTPS / TLS 1.3 (Caddy auto-cert)
- β Idempotency Key pada transaksi payment
- β Rate limiting & request validation
- β CORS headers dikonfigurasi per domain
- β Security headers (HSTS, X-Frame-Options)
- β Immutable audit trail (ledger anti-manipulasi)
- β Centralized log β semua request tercatat
- β Pen-test internal OWASP API Top 10
- β Zero critical vulnerability ditemukan
- β³ Pentest eksternal (auditor independen)
- β Artajasa β HMAC-SHA512 request signing
- β Flip β Webhook signature validation
- β Callback URL whitelist per merchant
- β Sandbox / Live mode separation
Tim Pengembang QRIS Acquirer Β· Nomor SPK: SPK/2026/05/12/001
Portal Β· API Docs Β· Performance Β· Progress