Backend aplikasi chat real-time yang dibangun dengan teknologi modern dan performa tinggi menggunakan Rust, Axum, WebSockets, dan SQLx.
- Fitur
- Teknologi
- Persyaratan
- Cara Menjalankan
- Struktur Project
- API Endpoints
- Testing
- CI/CD
- Docker
- Lingkungan Pengembangan
- Lisensi
- β Autentikasi dengan JWT (JSON Web Token)
- β REST API untuk operasi CRUD
- β WebSocket untuk komunikasi real-time
- β Mendukung pesan pribadi dan publik
- β Melacak status online pengguna secara real-time
- β Mendukung multiple database (SQLite dan PostgreSQL)
- β CORS middleware untuk integrasi dengan frontend
- Rust - Bahasa pemrograman dengan performa tinggi dan keamanan memori
- Axum - Framework web yang cepat dan ergonomis
- SQLx - Library database async yang type-safe dengan validasi compile-time
- PostgreSQL/SQLite - Database relasional untuk penyimpanan persisten
- JWT - JSON Web Token untuk autentikasi aman
- WebSockets - Protokol komunikasi real-time dua arah
- Rust 1.80 atau lebih baru
- SQLite atau PostgreSQL (opsional)
- Cargo (package manager Rust)
-
Clone repository ini
git clone https://github.com/badruzbby/chat-app-backend.git
-
Masuk ke direktori project
cd chat-app-backend
-
Salin
.env.example
ke.env
dan sesuaikan pengaturan (opsional)cp .env.example .env
Konfigurasi database dan pengaturan lainnya dalam file
.env
-
Bangun dan jalankan aplikasi
cargo run
Server akan berjalan di http://127.0.0.1:8080
(atau sesuai konfigurasi PORT di .env
).
src/
βββ config/ # Konfigurasi aplikasi dan environment
βββ handlers/ # Handler HTTP dan WebSocket
βββ middleware/ # Middleware (auth, dll)
βββ models/ # Model data dan logika bisnis
βββ routes/ # Definisi routes API
βββ utils/ # Utility functions
migrations/ # Migrasi database SQLx
Endpoint | Metode | Deskripsi |
---|---|---|
/auth/register |
POST | Registrasi pengguna baru |
/auth/login |
POST | Login pengguna |
Endpoint | Metode | Deskripsi |
---|---|---|
/users/me |
GET | Mendapatkan profil pengguna saat ini |
/users/online |
GET | Mendapatkan daftar pengguna online |
/users/status |
POST | Memperbarui status online |
Endpoint | Metode | Deskripsi |
---|---|---|
/messages |
POST | Mengirim pesan |
/messages/public |
GET | Mendapatkan pesan publik |
/messages/{receiver_id} |
GET | Mendapatkan pesan antara dua pengguna |
Endpoint | Deskripsi |
---|---|
/ws?token={jwt_token} |
Koneksi WebSocket untuk komunikasi real-time |
Proyek ini dilengkapi dengan test suite komprehensif yang mencakup unit test untuk model dan autentikasi.
tests/
βββ test_user_model.rs # Test untuk model User
βββ test_message_model.rs # Test untuk model Message
βββ test_auth.rs # Test untuk autentikasi JWT
βββ test_auth_handlers.rs # Test untuk handler registrasi dan login
Untuk menjalankan semua test:
cargo test
Untuk menjalankan test spesifik:
# Menjalankan semua test dalam file tertentu
cargo test --test test_user_model
# Menjalankan test spesifik
cargo test test_user_creation
Untuk menampilkan output dari test:
cargo test -- --nocapture
-
Test Model User
- Pembuatan user baru
- Verifikasi password
- Konversi user ke format response
-
Test Autentikasi
- Pembuatan token JWT
- Validasi token kedaluwarsa
- Penanganan token dengan signature tidak valid
-
Test Model Pesan
- Pembuatan pesan
- Penanganan pesan publik
- Konversi pesan ke format response
-
Test Handler Auth
- Validasi input registrasi (username dan password)
- Pembuatan user dari data registrasi
- Verifikasi password untuk login
Untuk test yang memerlukan database, proyek ini menggunakan pendekatan berikut:
- Mode Debug: Menggunakan implementasi model yang mengembalikan data dummy pada fungsi-fungsi tertentu
- Struktur Modular: Pemisahan kode ke dalam lib.rs dan app.rs untuk memudahkan testing
- CI Pipeline: Konfigurasi database test terpisah untuk continuous integration
Proyek ini menggunakan GitHub Actions untuk Continuous Integration dan Continuous Deployment dengan alur kerja berikut:
-
Linting & Format Check
- Memeriksa format kode dengan
cargo fmt
- Menjalankan analisis statis dengan
cargo clippy
- Memeriksa format kode dengan
-
Unit Testing
- Menjalankan semua unit test yang independen dari database
- Memeriksa fungsionalitas model dan autentikasi
-
Integration Testing
- Menjalankan database PostgreSQL di container
- Menerapkan migrasi database
- Menjalankan test yang membutuhkan akses database
-
Code Coverage
- Menghasilkan laporan coverage menggunakan cargo-llvm-cov
- Mengunggah hasil ke Codecov untuk visualisasi dan monitoring
-
Build
- Mengkompilasi aplikasi dalam mode release
- Menyimpan artifact untuk deployment
Untuk memungkinkan kompilasi di lingkungan CI/CD tanpa akses ke database, proyek ini menggunakan Offline Mode dari SQLx. Ini memungkinkan validasi query pada waktu kompilasi tanpa koneksi database aktif.
-
Membuat file sqlx-data.json:
# Pastikan database lokal Anda berjalan cargo install sqlx-cli cargo sqlx prepare -- --lib
-
Commit file
sqlx-data.json
ke repositori:File ini berisi metadata tentang query SQL Anda dan memungkinkan SQLx untuk memeriksa query tanpa koneksi database.
-
Mengaktifkan offline mode di CI:
# Mengaktifkan mode offline menggunakan environment variable SQLX_OFFLINE=true cargo build
Perhatikan bahwa kita tidak menggunakan feature
offline
karena versi SQLx yang kita gunakan (0.8.3) tidak mendukung feature ini. Sebagai gantinya, kita menggunakan environment variableSQLX_OFFLINE=true
.
Pastikan untuk memperbarui file sqlx-data.json
setiap kali Anda mengubah query SQL dengan menjalankan cargo sqlx prepare
kembali.
Deployment otomatis ke server melalui SSH saat perubahan di-push ke branch main
atau master
:
-
SSH Deployment
- Terhubung ke server menggunakan SSH dengan password
- Menyalin aplikasi yang sudah dikompilasi ke server
- Mengkonfigurasi dan memulai layanan systemd
-
Docker Build & Push (opsional)
- Membuat Docker image
- Mengunggah ke Docker Hub dengan tag
latest
Untuk mengaktifkan deployment, tambahkan secrets berikut di repositori GitHub Anda:
SSH_HOST
- Alamat host server untuk deploymentSSH_USERNAME
- Username untuk login SSHSSH_PASSWORD
- Password untuk login SSHSSH_PORT
- Port SSH (opsional, default 22)DATABASE_URL
- URL database untuk aplikasi di serverJWT_SECRET
- Secret key untuk JWT di serverDOCKERHUB_USERNAME
- Username Docker Hub (opsional)DOCKERHUB_TOKEN
- Token akses Docker Hub (opsional)CODECOV_TOKEN
- Token untuk upload hasil coverage ke Codecov
Anda dapat menjalankan aplikasi ini menggunakan Docker:
docker pull badruzbby/chat-app-backend:latest
docker run -p 8080:8080 \
-e DATABASE_URL=postgres://user:password@host:5432/db \
-e JWT_SECRET=your_secret_key \
badruzbby/chat-app-backend:latest
Atau build image secara lokal:
docker build -t chat-app-backend .
docker run -p 8080:8080 chat-app-backend
Cara termudah untuk menjalankan aplikasi beserta database PostgreSQL adalah menggunakan Docker Compose:
# Jalankan aplikasi dan database
docker-compose up -d
# Lihat logs
docker-compose logs -f
# Hentikan semua container
docker-compose down
# Hentikan dan hapus volume data (akan menghapus semua data database)
docker-compose down -v
Docker Compose akan secara otomatis:
- Membangun image backend dari Dockerfile
- Menjalankan database PostgreSQL
- Mengkonfigurasi jaringan antar kontainer
- Memetakan port yang diperlukan
- Menyediakan volume persisten untuk data PostgreSQL
Variabel lingkungan yang diperlukan sudah dikonfigurasi dalam file docker-compose.yml
.
Aplikasi ini menggunakan file .env
untuk konfigurasi. Variabel-variabel lingkungan yang tersedia:
PORT=8080 # Port server
HOST=127.0.0.1 # Host server
DATABASE_URL=postgres://postgres:postgres@localhost/db # URL database
JWT_SECRET=super_secret_key # Secret untuk JWT
JWT_EXPIRATION=86400 # Waktu kadaluarsa token (detik)
MIT Β© [Muhammad Badruz Zaman]