DeskPoint adalah aplikasi IT service desk berbasis fullstack Next.js.
- Next.js 16 App Router
- TypeScript
- Tailwind CSS v4
- Prisma ORM
- MySQL native
- Custom JWT session via httpOnly cookie
- Zod, React Hook Form
npm install
npm run prisma:generate
npm run prisma:migrate
npm run db:seed
npm run devDATABASE_URL="mysql://user:password@127.0.0.1:3306/deskpoint"
AUTH_SECRET="change-this-secret-in-production"
APP_URL="http://localhost:3000"
ALLOWED_DEV_ORIGINS=""
SESSION_COOKIE_SECURE="true"
SETTINGS_ENCRYPTION_KEY=""DATABASE_URL, AUTH_SECRET, dan APP_URL wajib tersedia saat deploy. Untuk production, gunakan secret kuat dan APP_URL domain HTTPS production.
Telegram bot token dan webhook secret dikonfigurasi lewat halaman Settings. Nilai disimpan terenkripsi di database memakai SETTINGS_ENCRYPTION_KEY jika tersedia, fallback ke AUTH_SECRET.
ALLOWED_DEV_ORIGINS opsional dan hanya diperlukan untuk development origin tambahan. Isi hostname tanpa path; protocol http:// atau https:// akan dinormalisasi otomatis. Pisahkan beberapa origin dengan koma.
SESSION_COOKIE_SECURE=false hanya untuk testing production lewat HTTP. Untuk production HTTPS, biarkan true atau kosong.
Jangan commit credential, export data, attachment, atau dump database ke repository.
Deploy production disiapkan untuk PM2 pada port 3015.
Prasyarat server:
- Node.js dan npm tersedia.
- PM2 tersedia secara global:
npm install -g pm2. - Database MySQL/MariaDB production sudah dibuat.
- File
.envsudah dibuat di server dan tidak dipull dari repository.
Jalankan:
chmod +x ./deploy.sh
./deploy.shScript deploy menjalankan:
- Validasi env wajib.
- Validasi folder upload
public/uploadstersedia dan writable. npm ci.npm run prisma:generate.npm run prisma:migrate:deploy.npm run build.pm2 startOrReload ecosystem.config.cjs --env production.
Jika folder upload tidak writable, perbaiki ownership di server:
sudo chown -R $(whoami):$(whoami) public/uploads
chmod 755 public public/uploadsManual command untuk migrasi production:
npm run prisma:migrate:deployAdmin dapat menyimpan bot token, webhook secret, dan set webhook dari halaman Settings. Webhook target memakai <APP_URL>/api/telegram/webhook.
Command Telegram bersifat opsional, tapi direkomendasikan agar user mudah menemukan action bot.
Rekomendasi command yang diset via BotFather:
start - Mulai bot dan tampilkan menu
refresh - Refresh tombol menu sesuai role login
Cara set command lewat BotFather:
- Buka chat Telegram dengan
@BotFather. - Jalankan
/mybots. - Pilih bot DeskPoint.
- Pilih
Edit Bot. - Pilih
Edit Commands. - Kirim daftar command:
start - Mulai bot dan tampilkan menu
refresh - Refresh tombol menu sesuai role login
Command /refresh akan meminta bot mengirim ulang tombol menu utama sesuai role user yang terhubung ke telegramChatId.
Role aplikasi:
ADMIN: mengelola user, kategori, unit kerja, settings Telegram, report, semua order, dan action order penuh.TECHNICIAN: melihat order terbuka dan order yang ditugaskan, lalu menjalankan action teknisi.USER: membuat order dan melihat order miliknya sendiri.
Behavior menu order di web:
- Semua role aktif dapat membuat order lewat tombol
Create Orderdi menu order, termasuk upload foto pelapor opsional maksimal 5 foto per order, maksimal 5MB per file, format JPG/PNG/WEBP/GIF. - Nomor order memakai format
YY.NNNNN, contoh26.00001, dengan counter berurutan per tahun. USERhanya melihat order denganrequesterIdmiliknya.TECHNICIANmelihat orderOPEN, order yang menjadi teknisi utama, dan order yang masuk assignment teknisi tersebut.ADMINmelihat semua order.ADMINdapat assign/delegasi teknisi dan menghapus order sesuai status yang diizinkan.ADMINdanTECHNICIANdapat mengubah status order sesuai action yang tersedia di detail order.- Detail matriks action per status ada di
docs/ticket-order-behavior.md.
Dashboard menampilkan ringkasan sesuai role login:
- Total order, order aktif, selesai/verified, dan resolved rate.
- Jumlah order per status.
- Order yang butuh perhatian: open belum didelegasikan, pending, running lebih dari 1 hari, done belum verified.
- Quick actions sesuai permission role.
- Order terbaru sesuai akses role.
Menu /tickets memiliki summary cards auto-refresh tiap 10 detik lewat GET /api/tickets/summary. Polling berhenti saat tab browser tidak aktif.
Halaman /settings memiliki tab:
Profil Akun: semua user aktif, untuk ganti nama, username, dan password.Telegram: admin only, untuk konfigurasi webhook bot.Manajemen Role: admin only, untuk custom akses role.
Admin selalu hardcoded full access agar tidak terkunci dari sistem.
Role TECHNICIAN dan USER bisa diatur akses menu dan CRUD:
- Lihat.
- Tambah.
- Ubah.
- Hapus.
Permission disimpan di tabel AppSetting key role_permissions.
Menu /setup memakai tab:
Kategori Order.Unit Kerja.
Unit kerja disimpan di tabel Unit, dipakai oleh form user web dan registrasi Telegram. Route lama /setup/categories dan /setup/units redirect ke tab yang sesuai.
Attachment image disimpan lokal ke:
public/uploads/<orderNumber>/
Validasi upload:
- Maksimal 5 foto pelapor per order.
- Maksimal 5 foto teknisi per order.
- Maksimal 5MB per file.
- Format JPG/PNG/WEBP/GIF.
Jenis attachment:
REQUESTER: foto pelapor saat create order web/Telegram.TECHNICIAN: foto teknisi saat action photo.
Catatan production:
- Cocok untuk VPS/PM2/
npm startdengan filesystem persistent. - Pastikan
public/uploadswritable dan tidak terhapus saat deploy. - Untuk serverless atau multi-instance, gunakan shared volume atau object storage seperti S3/MinIO/R2.
Behavior bot Telegram:
- User belum terdaftar melihat menu
Register MemberdanLogin. Register Membermenjalankan registrasi interaktif: nama lengkap, username, pilih unit kerja dari data setup, lalu nomor telepon lewat tombol share contact Telegram. User baru dibuat roleUSER, status belum aktif, password default12345; admin perlu aktivasi user.- Setelah login,
USERmendapat menu➕ Buat Order,📋 Order Saya, dan🚫 Signout. USERdapat membuat order dari bot: pilih kategori, isi nama pelapor, isi lokasi, isi ext/telp, isi detail order, lalu bot membuat order dengan requester user tersebut. Setelah order dibuat, user bisa mengirim maksimal 5 foto problem/kondisi atau mengetikskip.USERdapat membuka📋 Order Sayauntuk melihat 20 order terbaru miliknya dan membuka detail order.- Setelah login,
TECHNICIANmendapat menu📝 My Jobs,💬 Faq, dan🚫 Signout. TECHNICIANmemakaiMy Jobsuntuk melihat jobNEW/RUNNING, membuka detail, check order, upload foto, set done, dan forward teknisi sesuai status.- Setelah login,
ADMINmendapat menuTask List,Find Job,Create Order,Faq, danSignout. ADMINdapat melihat semua order per status, mencari order by nomor, membuat order, edit order, delegasi follow up, forward teknisi, hapus order, close order, dan melihat foto/history sesuai status.
Seed default membuat satu user admin untuk development lokal. Jangan gunakan credential seed untuk production. Ganti password setelah login pertama jika seed pernah dijalankan di environment selain lokal.
Lihat prisma/seed.ts untuk credential development default.