Ini adalah repositori core-backend sistem SEJASA, sebuah platform berbasis arsitektur high-performance menggunakan bahasa Rust dan framework Axum. Backend ini mengelola penawaran proyek sosial, pencocokan geografis berbasis koordinat, penyimpanan file asinkronus, serta komunikasi real-time stateful via WebSockets.
Sistem ini mengadopsi pola pemisahan beban kerja (separation of concerns) yang agresif untuk menjamin throughput tinggi:
- Reverse Proxy (NGINX): Berfungsi sebagai gerbang utama TLS termination, membatasi ukuran muatan (payload limit), serta menangani serving file statis secara langsung dari disk OS memanfaatkan efisiensi C-level kernel.
- Application Server (Axum + Tokio): Memproses logika bisnis, validasi tipe data yang ketat via type-state pattern, enkapsulasi event WebSockets, dan pengelolaan database connection pool.
- Database Layer (PostgreSQL): Penyimpanan data persisten yang dioptimasi dengan query relasional kompleks (JSONB aggregation) untuk memangkas overhead pemetaan memori di level aplikasi.
Sistem mengimplementasikan perhitungan matematis rumus Haversine Formula langsung di dalam query relational PostgreSQL untuk menyaring dan mengurutkan proyek terdekat berdasarkan parameter koordinat (lat, lon) dan radius maksimal (distance_meters) yang dikirimkan oleh klien.
Perhitungan dilakukan dalam satu kali trip query tanpa membebani runtime Rust:
-- Formula Haversine dalam SQL untuk mengukur jarak antara dua titik koordinat bumi
(6371000 * acos(
cos(radians($1)) * cos(radians(latitude)) * cos(radians(longitude) - radians($2)) +
sin(radians($1)) * sin(radians(latitude))
)) AS distance_meters
Pencarian dan penyaringan proyek pada endpoint /project ditangani secara dinamis. Parameter query mendukung:
- Pencarian Teks (
q): Menggunakan klausaILIKE %q%pada judul dan deskripsi proyek. - Penyaringan Lanjutan: Filter instan berdasarkan
status,category, dan pembatasan radius maksimal. - Sorting (
most_distance): Pengurutan presisi sepertinearest(jarak terdekat) memanfaatkan hasil kalkulasi Haversine secara dinamis.
Untuk mencegah Memory Exhaustion (OOM) akibat pengunggahan file biner berukuran besar, backend menggunakan interpenetrasi Tokio Async I/O Buffer.
- Zero RAM Overloading: Payload bertipe
multipart/form-datadibaca sedikit demi sedikit per segmen (chunk streaming) menggunakanwhile let Some(chunk) = field.chunk().await. - Isolated File System Storage: File divalidasi ekstensinya (white-listing mencegah Stored XSS) lalu di-rename menggunakan
Uuid::new_v4()sebelum ditulis ke sub-direktori host berdasarkan ID pengguna (/public/uploads/{user_id}/). - Shared Storage Volume: Sinkronisasi instan antara Axum (Akses Tulis) dan NGINX (Akses Baca) dikelola menggunakan Docker Bind Mounts.
Fitur obrolan interaktif mengandalkan protokol WebSocket (axum::extract::ws) untuk meminimalisir overhead HTTP:
- Auto-Load History: Saat koneksi terbuka, sistem melakukan eager-loading riwayat chat lalu mengirimkannya ke klien sebelum melakukan proses stream splitting (
sender&receiver). - Atomic Read Updates: Setelah riwayat dikirim, backend menembakkan perintah bulk update asinkronus ke database untuk mengubah seluruh pesan milik lawan bicara menjadi
is_read = truedalam satu operasi database tunggal (WHERE chat_id = $1 AND sender_id != $2 AND is_read = false).
Semua endpoint API (baik sukses maupun gagal) wajib mematuhi skema JSON standar industri untuk mempermudah parsing tipe data statis di sisi klien:
Dokumentasi API (Postman): Lihat di Postman
{
"success": true,
"status": 200,
"message": "List projects!",
"path": "/project",
"timestamp": "2026-05-21T14:59:44Z",
"meta": {
"current_page": 1,
"limit_page": 5,
"total_items": 2,
"total_pages": 1
},
"data": [
{
"id": "019e3656-6624-742d-b367-ea64e10c7f50",
"name": "Pengembangan Sistem Greenhouse Duck Egg",
"status": "hiring",
"rating": 4.8,
"descriptions": "Membangun otomatisasi inkubasi telur bebek...",
"slug": "pengembangan-sistem-greenhouse-duck-egg",
"address": "Yogyakarta, Indonesia",
"latitude": -7.784130,
"longitude": 110.402604,
"distance_meters": 12.50,
"max_participant": 5,
"requirements": {
"skills": ["Rust", "Embedded C", "IoT"]
},
"category": {
"id": "019e3656-abcd-efgh-b367-ea64e10c7f50",
"name": "Testing"
},
"owner": {
"id": "019e3656-9999-8888-b367-ea64e10c7f50",
"name": "Bakutani Tech",
"image": "/uploads/9999/avatar.png"
},
"updated_at": "2026-05-21T10:00:00Z",
"created_at": "2026-05-21T08:00:00Z"
}
]
}
Backend dikemas menggunakan multi-container Docker Compose. NGINX diletakkan di depan sebagai pelindung internal network container Axum.
services:
axum-sejasa:
build: .
container_name: axum-sejasa
restart: unless-stopped
env_file: .env
ports:
- "8010:8010"
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- ./public/uploads:/app/public/uploads
nginx-sejasa:
image: nginx:alpine
container_name: nginx-sejasa
restart: unless-stopped
ports:
- "80:80"
depends_on:
- axum-sejasa
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./public/uploads:/usr/share/nginx/html/uploads:ro
- Rust Compiler / Toolchain (MSRV 1.75+)
- PostgreSQL Database v14+
- Docker & Docker Compose (Untuk deployment instan)
- Clone Repositori Backend:
git clone https://github.com/Arbath/sejasa_be.git
cd sejasa_be
- Konfigurasi Environment Variable:
Buat file
.envdi direktori utama:
APP_PORT=8010
# Options: DEBUG, INFO, WARN, ERROR, TRACE
LOG_LEVEL=DEBUG
CORS_ORIGINS=http://127.0.0.1:8011,http://localhost:5173
JWT_SECRET=secret
# Default: 15 minutes
ACCESS_TTL_IN_MINUTES=15
# Default: 7 days
REFRESH_TTL_IN_DAYS=7
DATABASE_URL=postgres://username:password@localhost:5432/database
# for postgresql in host machine
# DATABASE_URL=postgres://username:password@host.docker.internal:5432/database
DB_CONNECTIONS=10
# Set true for auto migrations
# MIGRATE=true
- Eksekusi Migrasi Database:
Pastikan Anda telah menginstal
sqlx-cli, lalu jalankan migrasi schema jika tidak menggunakan auto migration:
sqlx database setup
- Kompilasi & Jalankan Server:
cargo run --release
- Siapkan struktur folder lokal untuk volume sharing agar terhindar dari permission issue:
mkdir -p public/uploads
- Bangun citra (build image) dan nyalakan seluruh infrastruktur kontainer di latar belakang:
docker compose up -d --build
- Pastikan semua log berjalan normal:
docker compose logs -f