Aplikasi CBT dan modul latihan pribadi berbasis Node.js, Express, InsForge PostgreSQL, InsForge Storage, HTML/CSS/JavaScript murni, dan MathJax CDN.
Tidak ada integrasi AI, API AI, atau logika berbasis AI di dalam aplikasi. Database tidak berisi dummy data atau seeder.
- UI penuh Bahasa Indonesia.
- InsForge Auth: daftar/masuk email, Google OAuth, dan keluar akun.
- Backend Express stateless, siap deploy ke Dokploy.
- Database memakai InsForge PostgreSQL.
- File lampiran memakai InsForge Storage, bukan folder upload lokal.
- Row Level Security membatasi data per
user_id; user hanya bisa membaca/menulis datanya sendiri. - Soal, opsi, pembahasan, flashcard, Adu Kata, dan Fill-in-the-Blank mendukung LaTeX MathJax dan tag HTML gambar.
- Input soal manual, bulk JSON, preview ujian, simulasi CBT 2 kolom, timer, navigasi warna, skor
+4/-1/0, dan hasil pembahasan. - Modul tambahan: Flashcard, Adu Kata, dan Fill-in-the-Blank.
- Node.js 20 disarankan.
- npm.
- Akun/proyek InsForge.
Login dan link project memakai CLI InsForge. Jangan simpan user API key di repository.
npx @insforge/cli login --user-api-key <INSFORGE_USER_API_KEY>
npx @insforge/cli link --project-id 99688844-c482-443e-b7c8-08b217610538Buat tabel kosong dengan menjalankan SQL di:
scripts/insforge-schema.sql
File tersebut membuat tabel, kolom user_id, attachment metadata, RLS policies, dan sample awal Flashcard/Fill-in-the-Blank Bahasa Inggris untuk user pertama yang tersedia.
Pastikan bucket storage dengan nama berikut tersedia di InsForge:
uploads
Nama bucket bisa diganti lewat INSFORGE_STORAGE_BUCKET.
Salin contoh env untuk lokal:
copy .env.example .envIsi nilai rahasia secara lokal saja. Jangan commit .env.
NODE_ENV=production
PORT=3000
INSFORGE_BASE_URL=https://acfzi5wy.ap-southeast.insforge.app
INSFORGE_ANON_KEY=
INSFORGE_STORAGE_BUCKET=uploadsKeterangan:
INSFORGE_BASE_URL: base URL backend InsForge.INSFORGE_ANON_KEY: anon key dari dashboard/project InsForge.INSFORGE_STORAGE_BUCKET: bucket untuk gambar.
npm install
npm startBuka:
- Beranda:
http://localhost:3000 - Input Soal:
http://localhost:3000/input-soal - Mulai Simulasi:
http://localhost:3000/simulasi - Flashcard:
http://localhost:3000/flashcard - Adu Kata:
http://localhost:3000/adu-kata - Fill-in-the-Blank:
http://localhost:3000/fill-blank
Buka:
http://localhost:3000/auth
Fitur yang tersedia:
- Daftar/Masuk email dan kata sandi.
- Masuk dengan Google OAuth.
- Keluar akun dari tombol
Keluardi topbar.
Semua endpoint data utama membutuhkan bearer token user. Data questions, attempts, attempt_answers, flashcards, word_quizzes, dan cloze_tests dibatasi oleh RLS user_id = auth.uid().
Di halaman Input Soal, gunakan panel Upload File ke InsForge.
Aplikasi akan menghasilkan tag seperti:
<img src="https://..." alt="">Tempel tag tersebut ke teks soal, opsi jawaban, pembahasan, flashcard, Adu Kata, atau Fill-in-the-Blank.
File yang diupload dari form ini juga otomatis dilampirkan ke soal manual berikutnya yang disimpan.
Pastikan .env tidak ikut commit:
git status --ignoredPerintah awal dari project lokal ke GitHub:
git init
git branch -M main
git add .
git status
git commit -m "Initial ZDNCH BELAJAR CBT app"
git remote add origin https://github.com/<username>/<repo>.git
git push -u origin mainJika repository sudah pernah di-init, mulai dari git add ..
- Buat aplikasi baru di Dokploy dari repository GitHub.
- Pilih mode build dari
Dockerfile. - Set port aplikasi ke
3000. - Isi environment variables secara manual:
NODE_ENV=production
PORT=3000
INSFORGE_BASE_URL=https://acfzi5wy.ap-southeast.insforge.app
INSFORGE_ANON_KEY=<isi dari InsForge>
INSFORGE_STORAGE_BUCKET=uploads- Deploy.
Jangan memasukkan token atau isi .env ke GitHub. DOKPLOY_ADMIN_TOKEN bukan environment aplikasi web; token itu hanya credential operator untuk menjalankan API Dokploy dari luar aplikasi.
Build lokal:
docker build -t zdnch-belajar-cbt .Run lokal:
docker run --env-file .env -p 3000:3000 zdnch-belajar-cbtBoilerplate tersedia di:
utils/dokployService.js
Fungsi yang tersedia:
getSystemHealth(): GET/settings.healthrestartDockerContainer(containerId): POST/docker.restartContainer
Token selalu dibaca dari process.env.DOKPLOY_ADMIN_TOKEN hanya saat utilitas ini dijalankan sebagai tool/operator script. Jangan set token ini sebagai environment runtime aplikasi CBT di Dokploy.