Sistem seleksi end-to-end terintegrasi: pendaftaran pelamar, seleksi administratif, test online (CBT), wawancara, hingga pengumuman kelulusan.
Platform penerimaan Pendamping & Pengawas Desa yang menjalankan proses seleksi
secara menyeluruh dari pendaftaran hingga pengumuman kelulusan. Terdiri dari
4 aplikasi web yang saling terintegrasi dan berbagi
1 basis data PostgreSQL bernama online_test.
Portal pelamar: isi data diri, pilih posisi & lokasi, unggah dokumen ke MinIO.
Panel panitia: orkestrasi seluruh seleksi, multi-role, CSV export, pengumuman publik.
Portal CBT: pelamar login, kerjakan soal pilihan ganda & esai, upload jawaban.
Isi data diri, pilih posisi, upload dokumen. Status: draft β submitted
Panitia verifikasi berkas β passed / rejected
CBT pilihan ganda & esai. Panitia set passing score β publish
Jadwal + penguji. Multi-kriteria 0-100, rata-rata otomatis
Keputusan akhir + pengumuman publik (bisa dicetak)
online_test
1 database bersama Β· remote server :5432
Frontend (Vite dev) me-proxy /api ke backend-nya masing-masing.
MinIO menyimpan dokumen pendaftaran β dipakai bersama oleh Pendaftaran PD & Manajemen Test.
Keempat aplikasi berbagi satu database PostgreSQL (online_test), bukan saling
memanggil API. Artinya, data yang ditulis satu aplikasi langsung terbaca aplikasi lain. Alur integrasinya:
pd_test_schedules / pd_test_invitations); pelamar yang sama login di Test Online dan mengerjakan test via jadwal tersebut.test_sessions (berkorelasi test_id + user_id); Manajemen membaca skor untuk set passing score & publish.pd_applicants; pelamar melihat progres 5 tahap di portal Pendaftaran karena membaca tabel yang sama.pd_interview_*.pd_settings diubah panitia (Manajemen), dibaca publik oleh Pendaftaran untuk menutup/menampilkan banner.| Aplikasi | Portal | Role | Hak Akses / Kemampuan |
|---|---|---|---|
| test_online CBT |
Pelamar | participant | Login, melihat jadwal/undangan test, mulai sesi, kerjakan pilihan ganda & esai, upload jawaban/foto, melihat skor sesi. Tidak ada role admin di app ini β semua pengaturan via Manajemen. |
| pendaftaran_pd Portal Pelamar |
Pelamar (publik) | participant | Registrasi, isi/simpan form pendaftaran (draft), unggah dokumen, submit saat gelombang buka, pantau status 5 tahap. Tidak ada login panitia; pengaturan gelombang dari Manajemen. |
| manajemen_test_pd Panel Panitia |
Panitia / Manajemen | pd_admin seleksi@test.com |
Akses penuh: semua grup menu (Pendaftaran, Seleksi Adm, Test Online, Wawancara, Hasil Akhir), kelola gelombang, verifikasi seleksi, jadwal CBT, passing score & publish, jadwal wawancara, kelola penguji (CRUD + is_active), keputusan kelulusan, ekspor CSV, pengumuman. Admin wawancara digabung ke pd_admin. |
| test_wawancara Penguji-only |
Penguji Wawancara | penguji penguji1@test.com penguji2@test.com |
Jadwal & Penilaian: melihat jadwal wawancara yang ditugaskan (read-only), mengisi nilai multi-kriteria (0β100) + catatan. Hanya bisa menilai jadwal miliknya (ownership guard). Admin tidak bisa login di app ini β kelola akun penguji (CRUD, is_active) dilakukan di Manajemen. |
Skeema autentikasi Manajemen: hanya pd_admin_users (type pd_admin) yang bisa login.
Akun di pd_interview_users (penguji & admin wawancara) ditolak di Manajemen.
Penguji login di Test Wawancara. Admin wawancara digabung ke pd_admin.
Test Wawancara authenticate: role penguji + is_active check.
| Aplikasi | Fungsi Utama | Port | DB Tables | Status |
|---|---|---|---|---|
| pendaftaran_pd | Portal pelamar: form pendaftaran, upload dokumen (MinIO), pemilihan posisi & lokasi, progres 5 tahap | 5001 / 5174 | pd_provinces, pd_regencies, pd_districts, pd_villages, pd_applicants, pd_education, pd_work_experiences, pd_documents | Aktif |
| manajemen_test_pd | Panel panitia: 5 grup menu (Pendaftaran, Seleksi, Test Online, Wawancara, Hasil Akhir), multi-role, CSV async (job queue + BullMQ), pengumuman publik | 5002 / 5175 | pd_admin_users, pd_settings, pd_selections, pd_test_schedules, pd_test_invitations, pd_interview_*, job_queue | Pusat |
| test_online | CBT: login pelamar, kerjakan soal PG & esai, bulk submit jawaban (multi-row), hitung skor bulk | 5000 / 5173 | users, tests, questions, answer_options, test_sessions, user_answers, essay_scores | Aktif |
| test_wawancara | Aplikasi khusus penguji: jadwal wawancara (read-only) + penilaian multi-kriteria. Admin tidak bisa login. | 5004 / 5177 | pd_interview_users, pd_interview_criteria, pd_interviews, pd_interview_scores | Idle |
Sistem dirancang untuk menangani volume peserta riil: Β±600.000 pendaftar, Β±600.000 peserta CBT, Β±200.000 peserta wawancara. Arsitektur berikut memastikan stabilitas di skala tersebut.
Tabel job_queue di DB online_test (shared). Worker polling tiap 3 dtk dengan FOR UPDATE SKIP LOCKED, retry 3Γ, exponential backoff. Tanpa infra baru β langsung jalan.
Queue export.csv, invitation.send, announcement.broadcast di Redis. Rate-limit 50 email/dtk, concurrency 3, exponential backoff. Monitoring via /admin/queues (bull-board).
| Tugas | Queue | Tier | Mekanisme |
|---|---|---|---|
| Ekspor CSV (5 tahap, Β±600rb baris) | export.csv | BullMQ + Postgres | Stream DB β csv-stringify β MinIO β presigned download URL. Bukan lagi res.send(csv()) di memori. |
| Kirim undangan CBT (Β±600rb) | invitation.send | BullMQ | Multi-row INSERT 1 transaksi + batch email (50/dtk via limiter). Bukan N+1 per pelamar. |
| Publish hasil test online | β (bulk SQL) | Postgres | Bulk UPDATE via unnest() β1 query untuk semua peserta, bukan loop per baris. |
| Submit jawaban CBT | β (bulk SQL) | Postgres | POST /save-answers multi-row INSERT ... ON CONFLICT dalam1 transaksi. Scoring via bulk UPDATE unnest(). |
| Upload dokumen pendaftaran | β (presigned PUT) | MinIO langsung | Browser upload langsung ke MinIO via presigned PUT URL (offload backend). Backend hanya generate URL + simpan metadata. |
online_testSemua aplikasi berbagi 1 database PostgreSQL yang sama. Berikut pembagian tabel per scope:
users
tests
questions
answer_options
test_sessions
user_answers
essay_scores
pd_provinces, pd_regencies,
pd_districts, pd_villages
pd_applicants
pd_education
pd_work_experiences
pd_documents
pd_admin_users
pd_settings
pd_selections
pd_test_schedules
pd_test_invitations
job_queue
pd_interview_users
pd_interview_criteria
pd_interviews
pd_interview_scores
Setiap aplikasi berjalan mandiri. Jalankan backend & frontend secara terpisah:
Penting: isi file backend/.env sebelum menjalankan (DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME, JWT_SECRET, PORT, dll).
Kredensial tidak tercantum di dokumentasi ini demi keamanan.
Urutan deploy penting β ada dependency antar layanan. Ikuti urutan di bawah agar tidak ada error koneksi.
| Layanan | Port | Keterangan |
|---|---|---|
| PostgreSQL 14+ | 5432 | Buat database online_test. Semua 4 app share DB ini. |
| Redis 6+ | 6379 | Untuk BullMQ (job queue tier 2). Wajib untuk manajemen_test_pd. |
| MinIO | 9002 | Object storage dokumen & ekspor CSV. Bucket: seleksi-pendamping-desa. |
| Node.js 18+ | β | Semua backend & build frontend. |
Redis dipakai oleh manajemen_test_pd untuk BullMQ (job queue tier 2).
Kalau Redis pakai password: REDIS_URL=redis://:password@127.0.0.1:6379 di .env manajemen_test_pd.
BullMQ berjalan otomatis saat manajemen_test_pd start β tidak perlu proses terpisah. Worker + queue terintegrasi di src/server.js.
| Queue | Fungsi | Rate Limit | Retry |
|---|---|---|---|
| export.csv | Ekspor CSV async (stream DBβMinIO) | β | 3Γ |
| invitation.send | Kirim undangan CBT (batch email) | 50/dtk | 3Γ |
| announcement.broadcast | Broadcast pengumuman | β | 2Γ |
| Variable | Wajib di | Contoh |
|---|---|---|
| DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME | Semua backend | localhost, 5432, postgres, ****, online_test |
| JWT_SECRET, JWT_EXPIRES | Semua backend | rahasia-super-rahasia, 24h |
| PORT | Semua backend | 5000, 5001, 5002, 5004 |
| PG_POOL_MAX | Semua backend | 20 (default) |
| MINIO_ENDPOINT, MINIO_PORT, MINIO_ACCESS_KEY, MINIO_SECRET_KEY, MINIO_BUCKET | pendaftaran_pd, manajemen_test_pd | 47.251.15.245, 9002, ****, seleksi-pendamping-desa |
| REDIS_URL | manajemen_test_pd | redis://127.0.0.1:6379 |
| TEST_ONLINE_URL | manajemen_test_pd | http://localhost:5000 (integrasi CBT) |
1. PostgreSQL β buat DB online_test
2. Redis β jalankan redis-server
3. MinIO β buat bucket seleksi-pendamping-desa, set CORS
4. Backend test_online β migrate β start (:5000)
5. Backend pendaftaran_pd β migrate β start (:5001)
6. Backend manajemen_test_pd β migrate β seed admin β start (:5002)
7. Backend test_wawancara β migrate β start (:5004)
8. Frontend (4 app) β npm run build β serve dist/ via Nginx
9. Verifikasi: /api/health di semua backend + /admin/queues di manajemen
| Folder | Repository |
|---|---|
| test_online | gitlab.com/digitak_labs/test_online.git |
| pendaftaran_pd | gitlab.com/digitak_labs/pendaftaran_pd.git |
| manajemen_test_pd | gitlab.com/digitak_labs/manajemen_test_pd.git |
| test_wawancara | gitlab.com/digitak_labs/test_wawancara.git |
Setiap project punya repo git sendiri (folder .git masing-masing). Folder induk ini bukan repo git, sehingga dokumentasi tidak ikut terpush.