Jual in-game currency server Minecraft bayar QRIS. Pembeli scan & bayar, bot mineflayer otomatis /pay ke akun mereka. Satu proses Node.js, SQLite, frontend tanpa build step, admin panel bawaan.
Support Pakasir atau Midtrans (pilih saat install), stock display via DonutSMP API, order manual gratis dari admin panel.
pembeli → username + jumlah → POST /api/order
→ gateway bikin QRIS → QR muncul
→ bayar → webhook + poller verify ke gateway
→ status paid → bot mineflayer /pay {user} {amt}m
→ delivered (retry 5x, re-queue saat restart)
Status selalu di-verify langsung ke gateway — webhook cuma hint, bukan kebenaran.
git clone https://github.com/Senzore/donutpay && cd donutpay
bash install.shScript nanya semuanya: OS/dependency check (Ubuntu, Debian, Fedora, Arch, Alpine), domain + DNS verify, payment gateway (pakasir/midtrans) + credentials, bot Minecraft, DonutSMP API key, admin user/pass, SSH key (opsional), login Microsoft (device code) langsung dari installer.
npm start # foreground
sudo bash install-service.sh # systemd auto-start- Landing:
http://ip:3000 - Admin panel:
http://ip:3000/admin.html
Login (user/pass dari install). Fitur:
- Overview: pending/paid/delivered counts, bot status, stok balance bot (DonutSMP API)
- Order Manual: kirim donut ke siapapun tanpa pembayaran (buat giveaway/support)
- Requeue order gagal, export CSV orders+logs, live logs feed
- Settings: ganti rate tanpa restart, toggle stock display di landing
- app.pakasir.com → bikin project → catat slug & API key
- Webhook URL:
https://domainmu/webhook/pakasir - Sandbox punya simulate API:
POST /api/dev/simulate?token=ADMIN_PASSWORD {"id":"DP..."}
- Dashboard Midtrans → Settings → Access Keys → Server Key
- Aktifkan QRIS channel di dashboard (error 402 = belum diaktifkan)
- Notification URL:
https://domainmu/webhook/midtrans
In-game ketik /api → dapat API key → masukkan saat install. Bot balance (/v1/stats/{MC_USERNAME} → money) tampil di admin panel dan landing page (bisa dimatikan di Settings).
npm run login— device code flow sekali jalan, token tersimpan diauth_cache/- Auto-reconnect dengan backoff kalau di-kick/disconnect
- Auto-respawn kalau mati dibunuh
- Kalau server minta konfirmasi IP baru (Discord DM), klik dulu lalu
npm run loginulang
| Endpoint | Fungsi |
|---|---|
POST /api/order |
{user, amt} → bikin order + QRIS |
GET /api/order/:id/status |
status (re-verify ke gateway kalau pending) |
GET /api/order/:id/qr.png |
gambar QR |
POST /api/order/:id/cancel |
batal (pending only) |
POST /webhook/:provider |
webhook receiver |
GET /api/config |
rate, provider, stock (public) |
GET /api/stats |
bot_online, queue, uptime |
Admin endpoints (/admin/*) pakai session token dari /admin/login.
src/server.js Express + order flow + webhook
src/payment.js provider loader (PAYMENT_PROVIDER env)
src/payments/ pakasir.js, midtrans.js
src/donutapi.js DonutSMP API (balance bot)
src/admin.js admin routes (session, manual order, settings)
src/bot.js mineflayer: queue, /pay, auto-reconnect/respawn
src/worker.js poller status + re-queue saat boot
src/db.js SQLite: orders, logs, cfg
src/login.js Microsoft device-code login
public/ index.html (landing) + admin.html (panel), zero build
install.sh interactive AIO installer
install-service.sh systemd unit
MIT