Skip to content

Architecture Overview

Platform Waqfuel menggunakan arsitektur microservices dengan 4 backend services yang ditulis dalam Rust, 2 frontend clients (Next.js), dan shared proto definitions.

External

Data Stores

Backend Services

Clients

REST

REST

REST

REST

REST

REST

gRPC

gRPC

gRPC

JWKS

waqfuel-web

(Next.js 15 — Public)

platform-client

(Next.js 16 — Admin)

auth-api

Axum + Tonic

:3001 REST / :50051 gRPC

main-api

Axum

:8081 REST

notif-api

Tonic

:50052 gRPC

reference-api

Axum + Tonic

:4000 REST / :50050 gRPC

PostgreSQL

waqfuel_auth

PostgreSQL

waqfuel_main

PostgreSQL

waqfuel_reference

Redis

AWS S3

waqfuel-assets

Resend

(Email)

ServiceTanggung JawabDatabase
auth-apiRegistrasi, login, JWT, JWKS, user profile, invitationwaqfuel_auth
main-apiFamily, volunteer, collector, collection, pickup request, impact, CMSwaqfuel_main
notif-apiEmail verification code, invitation email via Resend-
reference-apiData lokasi Indonesia (provinsi→kelurahan), validasi fotowaqfuel_reference

Semua client (web, platform) berkomunikasi dengan backend via REST API. JWT access token dikirim via Authorization: Bearer <token> header.

Komunikasi internal antar services menggunakan gRPC melalui Fly.io private network (di production). Proto definitions di-share via Git submodule waqfuel-proto-defs.

auth/v1/auth.proto → Auth messages
user/v1/user.proto → UserService (GetUserById, CreateUser, dll)
notif/v1/notif.proto → NotifService (SendEmailCodeVerification, dll)
reference/v1/reference.proto → ReferenceService (ValidateLocation, dll)
shared/v1/common.proto → Shared types (Gender, ErrorResponse, dll)

Main API memvalidasi JWT token tanpa perlu shared secret — cukup fetch public key dari Auth API:

GET https://auth.waqfuel.com/.well-known/jwks.json

Auth API meng-expose JWKS endpoint, Main API fetch dan cache public key untuk verifikasi signature.

main-apinotif-apiauth-apiwaqfuel-webmain-apinotif-apiauth-apiwaqfuel-webVolunteer Self-Registration FlowLogin FlowAccessing Protected ResourcesUserKlik "Daftar Relawan"POST /auth/register-volunteerValidate input, hash password (Argon2)Generate 6-digit verification codegRPC SendEmailCodeVerificationEmail dengan kode verifikasi201 CreatedInput kode verifikasiPOST /auth/verify-email-codeVerify code, mark user verified200 OKLogin (email + password)POST /auth/loginVerify password (Argon2)Generate JWT (RSA signed)access_token (900s) + refresh_token cookie (7 hari)Lihat daftar keluargaGET /families (Authorization: Bearer token)Fetch JWKS (cached)Verify JWT signatureExtract user role dari claims200 JSON dataUser
  • users — id, email, phone, password_hash, name, photo, role, is_verified
  • audit_logs — tracking semua user actions
  • invitations — token untuk admin-created users (collector, admin)

Roles: volunteer, admin, super_admin, collector, family

  • families — data keluarga yang mengumpulkan UCO
  • volunteers — relawan yang mengelola keluarga di area tertentu
  • collectors — mitra pengumpul (perusahaan)
  • collections — catatan pengumpulan UCO (liter, timestamp, bukti foto)
  • pickup_requests — workflow permintaan pengambilan UCO
  • impact_factors — faktor dampak per liter (CO2, air, dll)
  • landing_content — CMS untuk landing page
  • gallery_photos — galeri foto kegiatan
  • locations — seluruh data lokasi Indonesia (provinsi, kota/kabupaten, kecamatan, kelurahan)
Production:
├── Fly.io (Singapore region)
│ ├── auth-api (REST :8080, gRPC :50051 internal)
│ ├── main-api (REST :8081)
│ ├── notif-api (gRPC :50052 internal)
│ └── reference-api (REST :4000, gRPC :50050 internal)
├── Neon (Managed PostgreSQL)
│ ├── waqfuel_auth
│ └── waqfuel_main
├── AWS S3 (ap-southeast-1)
│ └── waqfuel-assets
├── Vercel
│ ├── waqfuel-web (waqfuel.com)
│ └── platform-client (platform.waqfuel.com)
└── External Services
├── Resend (email)
└── Redis (via Fly.io)