Proyek: Aplikasi Rust dan PostgreSQL

REST API katalog item yang ditulis dengan Rust (axum 0.8) dan PostgreSQL lewat driver tokio-postgres dengan pool koneksi deadpool-postgres. Aplikasi menjalankan migrasi skema secara otomatis saat startup, menerima SIGTERM dengan graceful shutdown, dan diuji lewat integration test black-box yang berjalan sebagai service Compose terpisah.

Struktur Berkas #

BerkasPeran
src/main.rsKonfigurasi environment, routing, migrasi, graceful shutdown
Cargo.toml / Cargo.lockDefinisi dan checksum dependensi
migrations/001_create_items.sqlSkema awal tabel items
tests/integration_test.rsTest black-box HTTP dengan reqwest
DockerfileBuild multi-stage (builder Rust → runtime Alpine)
compose.yamlService app, db, dan test (profile)
.dockerignoreMembatasi build context

Endpoint #

MetodePathKeterangan
GET/healthzCek kesehatan aplikasi dan database
GET/api/itemsDaftar seluruh item
POST/api/itemsBuat item baru (body: name, note)
GET/api/items/{id}Ambil satu item (404 jika tidak ada)

Menjalankan #

Password database diambil dari environment; paling mudah lewat berkas .env:

bash
echo 'POSTGRES_PASSWORD=rahasia123' > .env
docker compose up -d --build

Menguji #

Aplikasi dipublikasikan di port 8081 host agar tidak bentrok dengan proyek Go yang memakai 8080:

bash
curl -s http://localhost:8081/healthz
curl -s -X POST http://localhost:8081/api/items \
  -H 'Content-Type: application/json' \
  -d '{"name":"Kopi Torabika","note":"favorit pelanggan"}'
curl -s http://localhost:8081/api/items
curl -s http://localhost:8081/api/items/1

Hasil yang diharapkan: healthz mengembalikan {"status":"ok"}, POST mengembalikan 201 dengan item ber-id 1, daftar memuat item tersebut, dan GET /api/items/999 mengembalikan 404.

Integration Test #

Test menembak HTTP aplikasi dari container rust terpisah dengan profile test (aplikasi dan database tetap berjalan):

bash
docker compose --profile test run --rm test

Membersihkan #

bash
docker compose down          # volume db-data tetap ada
docker compose down -v       # sekaligus menghapus data