Selamat datang di pusat dokumentasi pengembangan Sotto. Dokumen ini dirancang untuk membantu Anda memahami, menyiapkan, dan menjalankan lingkungan pengembangan lokal dengan cepat dan efisien.
Sebelum memulai, pastikan sistem lokal Anda telah terpasang beberapa perkakas berikut:
- Docker & Docker Compose: Digunakan untuk menjalankan basis data dan komponen infrastruktur lokal secara terisolasi.
- Node.js (v18+) & pnpm: Manajer paket untuk eksekusi server lokal (frontend & backend) serta migrasi database.
- Kredensial Layanan Pihak Ketiga (Simpan di file
.env):- Cloudflare R2 / S3 Storage: Endpoint URL, Access & Secret Key, serta nama Bucket untuk manajemen berkas.
- Midtrans (Sandbox): Server Key dan Client Key untuk simulasi donasi/pembayaran.
- Ngrok: Token otentikasi Ngrok untuk membuat tunnel HTTPS lokal (diperlukan untuk webhook Midtrans).
Sebelum menjalankan proyek, pastikan Anda memahami di mana letak file konfigurasi .env yang digunakan oleh masing-masing mode:
- Mode Hybrid (Opsi A - Kode Dijalankan di Host OS):
- Backend NestJS membaca konfigurasi dari
backend/.env. - Frontend Vite membaca konfigurasi dari
frontend/.env. - Kontainer database di Docker hanya membaca konfigurasi dasar dari
infrastructure/.env.docker.
- Backend NestJS membaca konfigurasi dari
- Mode Full Docker Compose (Opsi B - Kode Dijalankan di Docker):
- Semua kontainer (backend, frontend, database, dsb.) membaca konfigurasi terpusat dari berkas
infrastructure/.env.docker. - File
.envdi dalam folderbackend/danfrontend/diabaikan sepenuhnya.
- Semua kontainer (backend, frontend, database, dsb.) membaca konfigurasi terpusat dari berkas
Warning
Setiap kali Anda ingin mengubah variabel konfigurasi (seperti kredensial DB, Endpoint Object Storage, API Key Midtrans, dll.), selalu edit berkas .env yang sesuai dengan mode eksekusi yang sedang Anda gunakan.
Terdapat dua opsi utama untuk menjalankan dan mengembangkan Sotto di mesin lokal Anda:
Infrastruktur (database, cache, broker) berjalan di dalam Docker, sedangkan kode aplikasi (backend NestJS dan frontend Vite) berjalan langsung di Host OS Anda.
- Kelebihan: Mendukung Hot-Reloading (HMR) secara instan pada frontend dan backend tanpa perlu membangun ulang kontainer Docker.
-
Jalankan Infrastruktur (Docker):
pnpm infra:up
Ini akan menyalakan kontainer database:
postgres,scylladb,redis, danminio. -
Jalankan Migrasi & Seeding Database (Hanya untuk Pertama Kali):
pnpm db:migrate pnpm db:seed
-
Jalankan Backend NestJS (Terminal 1):
pnpm backend:dev
Berjalan di
http://localhost:3000dengan GraphQL Playground di/graphql. -
Jalankan Frontend Vite (Terminal 2):
pnpm frontend:dev
Berjalan di
http://localhost:5173dengan fitur HMR.
Seluruh ekosistem Sotto (termasuk kode aplikasi, frontend, dan gateway Nginx) berjalan secara terisolasi di dalam kontainer.
- Jalankan Seluruh Stack Kontainer:
docker compose up -d --build
- Akses Aplikasi:
- Melalui Nginx Gateway:
http://localhost:8080(Akses terpadu). - Langsung ke Frontend:
http://localhost:5173(Dipetakan langsung dari kontainer).
- Melalui Nginx Gateway:
- Membangun Ulang (Bila Ada Perubahan Kode):
docker compose build backend && docker compose up -d backend
Jika Anda ingin membersihkan seluruh data lokal (fresh install), lakukan langkah berikut secara berurutan:
- Jalankan perintah migrasi dev:
pnpm db:migrate
- Jika Prisma mendeteksi ketidaksinkronan (drift) atau menanyakan persetujuan reset:
Ketik
ylalu tekan Enter. - Skema PostgreSQL akan dihapus dan dibangun ulang dari awal secara otomatis.
-
Wajib: Matikan aplikasi Backend NestJS (
pnpm backend:dev) jika sedang menyala, untuk mencegah error kegagalan koneksi (NoHostAvailableError). -
Jalankan perintah pembersihan keyspace ScyllaDB:
pnpm db:scylla:reset
Perintah ini akan masuk ke kontainer
sotto_scylladan menghapus keyspacesottosecara bersih. -
Jalankan kembali Backend NestJS Anda:
pnpm backend:dev
Saat startup, backend secara otomatis akan mendeteksi keyspace yang kosong, membuat ulang keyspace, serta menyusun seluruh struktur tabel NoSQL yang dibutuhkan.
Setelah kedua database di-reset, jalankan perintah seeding untuk memasukkan data sekolah, jurusan, dan kategori awal:
pnpm db:seedUntuk menguji fitur pembayaran/donasi Midtrans Sandbox, backend Anda wajib menerima webhook notifikasi (/payments/webhook) dari server Midtrans.
- Jalankan database (
pnpm infra:up) serta backend dan frontend di Host OS Anda. - Jalankan Ngrok secara langsung di Host OS Anda ke port backend:
ngrok http 3000
- Selesai! Backend otomatis mendeteksi URL Ngrok aktif di port
4040host OS dan mendaftarkannya ke Midtrans. Akses frontend Anda langsung dihttp://localhost:5173.
- Jalankan kontainer penuh:
docker compose up -d. - Dapatkan URL publik HTTPS aktif dengan membuka antarmuka web Ngrok di: http://localhost:4040
- Akses aplikasi Anda melalui URL publik Ngrok tersebut. Nginx akan mengarahkan rute
/ke frontend dan/graphql//payments/webhookke backend. - Catatan: File frontend/vite.config.ts sudah dikonfigurasi dengan
allowedHosts: trueagar browser tidak memblokir akses domain Ngrok.
Jalankan perintah-perintah terpusat ini langsung dari direktori root monorepo:
| Perintah | Deskripsi |
|---|---|
pnpm infra:up |
Menyalakan database & infra lokal di latar belakang. |
pnpm infra:down |
Menghentikan kontainer infrastruktur Docker. |
pnpm infra:logs |
Melihat log kontainer database secara real-time. |
pnpm backend:dev |
Menjalankan backend NestJS dengan mode watch (Hot-Reload) di host. |
pnpm frontend:dev |
Menjalankan frontend React Router / Vite di host (port 5173). |
pnpm db:migrate |
Menjalankan migrasi skema database PostgreSQL secara lokal. |
pnpm db:seed |
Memasukkan data dummy awal ke PostgreSQL. |
pnpm db:scylla:reset |
Menghapus keyspace ScyllaDB lokal (untuk mereset skema NoSQL). |
pnpm dev:hybrid |
Pintasan satu langkah untuk menyiapkan infrastruktur Mode Hybrid. |
Tip
Ingat kembali peta penggunaan file .env di atas. Jika Anda menggunakan Mode Hybrid, edit berkas di backend/.env dan frontend/.env. Jika menggunakan Mode Full Docker, edit berkas di infrastructure/.env.docker.
Cocok jika Anda ingin mengembangkan aplikasi tanpa membutuhkan koneksi internet.
- Konfigurasi
backend/.env:MINIO_ENDPOINT=localhost MINIO_PORT=9000 MINIO_USE_SSL=false MINIO_PUBLIC_URL=http://localhost:9000
- Konfigurasi
frontend/.env:VITE_MINIO_PUBLIC_URL=http://localhost:9000/public-assets
Menghubungkan langsung lingkungan pengembangan lokal ke bucket Cloudflare R2 asli.
- Konfigurasi
backend/.env:MINIO_ENDPOINT=<account_id>.r2.cloudflarestorage.com MINIO_PORT= MINIO_USE_SSL=true MINIO_PUBLIC_URL=https://cdn.sotto.auttomus.xyz
- Konfigurasi
frontend/.env:VITE_MINIO_PUBLIC_URL=https://cdn.sotto.auttomus.xyz
Berikut adalah daftar perkakas (tools) dan konfigurasi untuk mengamati data pada masing-masing basis data:
- Development (Lokal):
- Prisma Studio (Web GUI): Jalankan perintah
pnpm --filter backend prisma studiodi direktori root. Buka http://localhost:5555 di browser Anda. - Aplikasi GUI (DBeaver / TablePlus):
- Host:
localhost| Port:5432 - Username:
postgres| Password:supersecret_postgres_password - Database:
sotto_platform_db
- Host:
- Prisma Studio (Web GUI): Jalankan perintah
- Production (VPS):
- Karena port
5432di VPS tidak diekspos ke publik demi keamanan, Anda wajib menggunakan fitur SSH Tunneling di DBeaver atau TablePlus untuk terhubung.- SSH Host:
IP_VPS_ANDA| SSH User:root(atau nama user VPS Anda). - Database Host:
localhost| Database Port:5432. - Username & Password: Sesuai isi
.env.prodAnda di VPS.
- SSH Host:
- Karena port
-
Development (Lokal):
-
cqlsh (Terminal CLI): Jalankan perintah berikut di terminal Anda:
docker exec -it sotto_scylla cqlshGunakan perintah CQL untuk melihat data, contoh:
USE sotto; SELECT * FROM posts LIMIT 10;
-
Aplikasi GUI (DbGate / TablePlus / Magda):
- DbGate: 100% Free & Open Source (mendukung Cassandra/ScyllaDB secara penuh).
- TablePlus (Free Tier): Mendukung Cassandra (terbatas 2 koneksi aktif).
- Magda: GUI khusus Cassandra open-source berbasis Rust.
- Pengaturan Koneksi: Buat koneksi baru jenis Cassandra ➔ Host:
localhost| Port:9042.
-
-
Production (VPS):
- CLI di VPS: Hubungi VPS Anda melalui SSH, kemudian jalankan:
docker exec -it sotto_scylla cqlsh. - GUI Client (SSH Tunnel): Hubungkan DbGate atau TablePlus lokal Anda dengan mengaktifkan fitur SSH Tunneling mengarah ke port
9042VPS Anda.
- CLI di VPS: Hubungi VPS Anda melalui SSH, kemudian jalankan:
-
Development (Lokal):
-
redis-cli (Terminal CLI):
docker exec -it sotto_redis redis-cli_Gunakan perintah
keys _untuk melihat key, atauflushalluntuk menghapus seluruh cache.* -
Aplikasi GUI (Redis Insight): Alat resmi gratis dari Redis yang sangat visual untuk memantau data cache dan antrean BullMQ. Hubungkan ke Host:
localhost| Port:6379.
-
-
Production (VPS):
- CLI di VPS: Hubungi VPS via SSH, jalankan
docker exec -it sotto_redis redis-cli. - Redis Insight (SSH Tunnel): Konfigurasi koneksi baru menggunakan SSH Tunnel mengarah ke port
6379VPS Anda.
- CLI di VPS: Hubungi VPS via SSH, jalankan
- Development (Lokal - MinIO):
- Buka antarmuka web konsol MinIO di browser: http://localhost:9001.
- Masuk dengan kredensial developer default:
- Username:
admin_minio - Password:
supersecret_minio_passwordatau sesuai dengan yang kamu ubah (bila ada mengubahnya)
- Username:
- Production (Cloudflare R2):
- Buka dashboard resmi Cloudflare ➔ Menu R2 ➔ Pilih bucket produksi Anda. Semua file media/aset yang diunggah di produksi dapat langsung diinspeksi atau diunduh dari sana.
Port server pengembangan (Vite Dev Server) dipindahkan ke 5173 (sebelumnya 8080) untuk menghindari konflik dengan port kontainer Nginx Gateway (8080).
Nginx dipisah menjadi dua berkas konfigurasi di bawah direktori ./nginx/:
nginx.dev.conf: Proxy aset/public-assets/ke kontainer MinIO lokal aktif (development).nginx.prod.conf: Proxy aset MinIO dinonaktifkan karena langsung dilayani oleh CDN R2 publik (produksi).
Pencarian endpoint Ngrok di backend secara berurutan mengecek:
process.env.NGROK_API_URLhttp://localhost:4040/api/tunnels(jika berjalan di host OS)http://ngrok:4040/api/tunnels(jika berjalan di dalam Docker network)
docker-compose.yml(Development): Membaca variabel dari infrastructure/.env.docker.docker-compose.prod.yml(Production VPS): Membaca variabel dari infrastructure/.env.prod.
Frontend berkomunikasi langsung ke backend di port 3000 (bukan lewat Nginx). Backend mengizinkan komunikasi langsung ini dengan mengaktifkan CORS bagi asal http://localhost:5173 (diatur via variabel FRONTEND_URL di backend/.env).
Seluruh modifikasi lokal ini dijamin tidak akan mengganggu sistem produksi di VPS:
- Kontainer
ngrokhanya ada didocker-compose.yml(development) dan tidak didefinisikan sama sekali didocker-compose.prod.yml(produksi menggunakan Cloudflare Tunnel resmi).