自建 Midtrans Core API 支付页,支持 QRIS、GoPay、ShopeePay、Virtual Account、Mandiri Bill 与带 3DS 的卡支付
account-center-starter — Next.js 启动器模板
作者 maubisa-id
基于 Next.js 的账户中心模板,集成登录、订阅管理、权限控制与自建 Midtrans 支付页,README 说明其用于 akun.maubisa.id 生产环境。
看看你的网站会是什么样
浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。
全部页面与视图 2
截图用于了解视觉与布局,交互效果请以实际项目为准。
值得关注的模板亮点
从已有项目资料中,快速了解它的特点。
账户安全功能包含邮箱 OTP 验证、2FA、设备登录管理、密码修改与 Cloudflare Turnstile 反机器人
订阅管理支持查看状态与期限、期末停止、更换套餐、自动(卡)或手动(QRIS/VA)续费
服务端定价:其他产品只发送商品代码,价格在服务端计算,访问权限在 webhook 校验付款结清后开放
管理面板基于 ADMIN_EMAILS 白名单,含收入概览、用户查询、Payment Link、活动报名 CSV 导出与审计日志
提供免注册先购买流程,付款后自动建号并发送设置密码链接,另含数据下载与账户删除等隐私功能
模板详细介绍
这是一个账户中心起始模板,README 说明其代码实际用于 akun.maubisa.id,并开放供他人复用。核心用途是构建面向多产品的统一账户页面:用户注册登录、邮箱 OTP 验证、忘记密码、两步验证(2FA)、查看并登出已登录设备、修改密码,同时包含订阅状态与期限管理、停止续订、更换套餐、自动或手动续费,以及基于单一登录(SSO)的权限访问明细。
支付部分采用自建页面而非 Midtrans 标准 Snap 页面,基于 Midtrans Core API 实现,README 列出支持 QRIS、GoPay、ShopeePay、Virtual Account(BCA、BNI、BRI、Permata、CIMB)、Mandiri Bill 以及带 3D Secure OTP 验证的信用卡/借记卡,并提供支付链接与自动订阅。README 强调价格始终在服务端计算,其他产品只需发送商品代码而非价格,访问权限仅在 Midtrans webhook 确认付款已结清并校验真实性后开放。
模板还包含自动邮件(OTP、欢迎、付款后访问信息、待付款提醒、收据、付款失败通知)、免注册先购买(付款后自动建号并发送设置密码链接)、隐私功能(按 UU PDP 下载 JSON 数据与删除账户)、供其他系统安全创建账户的 provisioning 通道,以及基于邮箱白名单(ADMIN_EMAILS)的管理面板,含收入与欠款概览、用户与订阅/账单/权限查询、创建 Payment Link、活动报名管理与 CSV 导出、发票打印、全局搜索、按服务线过滤、手动授予/撤销权限及审计日志。
技术栈方面 README 列出 Next.js 16(App Router、Server Components、Turbopack)、React 19、Tailwind CSS v4、TypeScript(strict)、Prisma 6(开发用 SQLite,生产用 MySQL 或 PostgreSQL)、Better Auth 1.6、Midtrans Core API、Nodemailer、可选的 Directus 活动内容源以及 Sentry(仅错误)。README 未提供性能、并发或生产就绪程度的说明,也未给出除 CI 徽章之外的测试覆盖信息。
适合你的项目吗?
适用场景
- 为多个产品搭建统一登录与账户中心,实现 SSO 与权限访问明细管理
- 在自有品牌页面中集成 Midtrans 支付,覆盖 QRIS、VA、电子钱包与 3DS 卡支付
- 管理订阅生命周期,包括查看期限、停止续订、更换套餐与续费
- 运营方通过管理面板查看收入与欠款、创建 Payment Link、管理活动报名并导出 CSV
- 其他网站或应用通过 provisioning 通道在购买后安全创建账户
适合人群
- 需要为多产品提供统一账户与登录入口的团队
- 希望自建品牌化 Midtrans 支付页而非使用标准 Snap 页面的开发者
- 需要订阅、权限与账单管理能力的 SaaS 或在线服务
- 需要带审计日志与 2FA 的管理后台的运营团队
上手与定制指南
结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。
- 1
需要 Node 22(见 .nvmrc),执行 npm install、复制 .env.example 为 .env 并至少填写 BETTER_AUTH_SECRET(openssl rand -base64 32)
- 2
运行 npx prisma db push 创建 dev.db 与表结构,再执行 npm run seed 生成示例数据与演示账号,最后 npm run dev 启动
- 3
演示账号:用户 [email protected] 或管理员 [email protected],密码均为 password123;未配置 Midtrans 密钥时支付功能显示为“尚未提供”而非报错
- 4
部署到 Vercel 时构建会执行 prisma db push,需提前准备数据库;README 提示 file:./dev.db 加 sqlite 在 serverless 中数据是临时的,仅适合预览
- 5
生产环境需配置 TURNSTILE_SECRET_KEY(否则应用无法启动),并按需填写 MIDTRANS_*、MAIL_*、PROVISION_SECRET、DIRECTUS_* 等变量
授权与来源资料
使用条件与限制
免费使用 · 保留许可声明本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。
使用时需要遵守
- 允许免费使用、修改、商用和分发该版本代码。
- 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
- 代码按现状提供;担保与责任限制以原许可证及适用法律为准。
额外费用与待核对事项
- 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
- 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
- 使用支付功能需自行申请并配置 Midtrans 服务端密钥(MIDTRANS_SERVER_KEY),属于外部服务凭据要求。
- 信用卡与 3DS 支付需要配置 Midtrans 客户端密钥(NEXT_PUBLIC_MIDTRANS_CLIENT_KEY)。
- 生产环境必须配置 Cloudflare Turnstile 反机器人密钥,否则应用无法启动。
- 发送邮件需配置 SMTP(MAIL_*)外部邮件服务;未配置时仅在开发环境将邮件打印到控制台。
- 活动内容功能依赖可选的 Directus 外部 CMS 服务,需提供 DIRECTUS_URL 与 DIRECTUS_TOKEN。
- 部署到 Vercel 需使用托管数据库(Neon、Supabase、PlanetScale、Railway 等)以保证数据持久化。
- 在 serverless 环境使用 SQLite 时数据是临时的,仅适合预览,不能用于生产。
- 需从 Midtrans 控制台获取密钥,测试用 Sandbox、上线用 Production,属于外部账户与凭据要求。
- Maubisa 的 Logo 与名称仍归 PT Litera Edu Solusi 所有,使用时需替换为自己的品牌。
查看原文依据
Permission is hereby granted, free of charge
许可证原文
| `MIDTRANS_SERVER_KEY` | untuk bayar | server key (rahasia) |
README 原文
| `NEXT_PUBLIC_MIDTRANS_CLIENT_KEY` | untuk kartu | client key (wajib untuk kartu dan 3DS) |
README 原文
| `TURNSTILE_SECRET_KEY` | di produksi | anti-bot; wajib di produksi (app tidak boot tanpa kunci) |
README 原文
| `MAIL_*` | untuk email | SMTP; kalau kosong, email dicetak ke konsol saat dev |
README 原文
| `DIRECTUS_URL` / `DIRECTUS_TOKEN` | untuk acara | sumber data acara (opsional) |
README 原文
- `DATABASE_URL` dan `DB_PROVIDER` — pakai database terkelola (Neon, Supabase, PlanetScale,
README 原文
serverless datanya sementara (tiap invocation terisolasi) — cukup untuk pratinjau, bukan produksi.
README 原文
5. **Isi kunci Midtrans Anda.** Dari [dashboard Midtrans](https://dashboard.midtrans.com/), pakai
README 原文
https://github.com/maubisa-id/account-center-starter/blob/main/LICENSEhttps://github.com/maubisa-id/account-center-starter/blob/main/README.mdnama "Maubisa" tetap milik PT Litera Edu Solusi; ganti dengan merek Anda sendiri saat memakai.
README 原文
DeepSeek 根据仓库许可证和 README 整理 ·2026-10-14。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。
项目核对记录与介绍依据
模板资料
- 来源平台
- GitHub
- 资料与维护参考分
- 资料较完整 · 83 / 100
- 技术栈
- Next.js · React
- 网站类型
- 启动器
这个分数如何计算
本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。
这个项目需要核对什么
- 记录的仓库更新时间
- 2026-10-09
- 截图检查日期
- 2026-10-14
已收录演示链接。请用你的内容与屏幕尺寸检查;有演示不代表表单、认证或支付已经可用。
目录记录的主要技术栈是 Next.js。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。
查看具体选型方法 →介绍的制作与核对状态
介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。
审核声明: codex-user-requested-batch-review-20261015 · 2026-10-15
查看当时使用的来源资料
SHA-256: f812824a00f240c2316c0090aad4e5c70a2263815b1b70cfed0717815ff6b28b
2026-10-14T17:09:18.002Z
来源文件 / 仓库<div align="center"> <picture> <source media="(prefers-color-scheme: dark)" srcset="./.github/assets/maubisa-logo-white.png"> <img alt="Maubisa" src="./.github/assets/maubisa-logo.png" height="52"> </picture> # Account Center Starter **Satu halaman akun untuk semua produk Anda, lengkap dengan halaman pembayarannya sendiri.** Bangun pusat akun sekali, pakai di semua layanan: satu login untuk semua produk, kelola langganan dan hak akses, plus halaman bayar (Midtrans) yang tampilannya mengikuti merek Anda. Kode ini kami pakai sungguhan di `akun.maubisa.id`, lalu kami buka agar Anda tidak perlu mulai dari nol. <p> <a href="https://demo-akun.maubisa.id"><img alt="Demo langsung" src="https://img.shields.io/badge/Demo%20langsung-demo--akun.maubisa.id-0a48b7?logo=vercel&logoColor=white"></a> <a href="https://github.com/maubisa-id/account-center-starter/generate"><img alt="Gunakan template ini" src="https://img.shields.io/badge/Gunakan%20template%20ini-2ea44f?logo=github&logoColor=white"></a> </p> [](https://vercel.com/new/clone?repository-url=https://github.com/maubisa-id/account-center-starter&env=DATABASE_URL,DB_PROVIDER,BETTER_AUTH_SECRET,BETTER_AUTH_URL,NEXT_PUBLIC_DEMO_MODE&envDescription=Database%20terkelola%20%2B%20rahasia%20auth%20(build%20menjalankan%20prisma%20db%20push)&envLink=https://github.com/maubisa-id/account-center-starter/blob/main/.env.example) <p> <a href="https://github.com/maubisa-id/account-center-starter/actions/workflows/ci.yml"><img alt="Status CI" src="https://github.com/maubisa-id/account-center-starter/actions/workflows/ci.yml/badge.svg"></a> <a href="https://github.com/maubisa-id/account-center-starter/releases/latest"><img alt="Rilis terbaru" src="https://img.shields.io/github/v/release/maubisa-id/account-center-starter?color=3FB950&label=rilis"></a> <a href="./LICENSE"><img alt="Lisensi" src="https://img.shields.io/github/license/maubisa-id/account-center-starter?color=3FB950"></a> <a href="https://github.com/maubisa-id/account-center-starter/commits/main"><img alt="Commit terakhir" src="https://img.shields.io/github/last-commit/maubisa-id/account-center-starter"></a> </p> <p> <a href="https://nextjs.org/"><img alt="Next.js" src="https://img.shields.io/badge/Next.js-16-000000?logo=nextdotjs&logoColor=white"></a> <a href="https://react.dev/"><img alt="React" src="https://img.shields.io/badge/React-19-149ECA?logo=react&logoColor=white"></a> <a href="https://www.typescriptlang.org/"><img alt="TypeScript" src="https://img.shields.io/badge/TypeScript-5-3178C6?logo=typescript&logoColor=white"></a> <a href="https://tailwindcss.com/"><img alt="Tailwind CSS" src="https://img.shields.io/badge/Tailwind-v4-38BDF8?logo=tailwindcss&logoColor=white"></a> <a href="https://www.prisma.io/"><img alt="Prisma" src="https://img.shields.io/badge/Prisma-6-2D3748?logo=prisma&logoColor=white"></a> <a href="https://www.better-auth.com/"><img alt="Better Auth" src="https://img.shields.io/badge/Better%20Auth-1.6-000000"></a> <a href="https://docs.midtrans.com/"><img alt="Midtrans" src="https://img.shields.io/badge/Midtrans-Core%20API-0B7BE9"></a> </p> <br/> <img src="./.github/assets/og.png" alt="Account Center Starter" width="840"> </div> --- > [!TIP] > **Coba dulu sebelum dipakai: [demo-akun.maubisa.id](https://demo-akun.maubisa.id).** > Masuk sebagai user `[email protected]` atau admin `[email protected]` (sandi `password123` untuk > keduanya), atau daftar akun baru lalu buka [kotak email demo](https://demo-akun.maubisa.id/demo/kotak) > untuk melihat email yang masuk (kode OTP, ucapan selamat datang). Semua pembayaran memakai mode > sandbox, jadi aman dicoba tanpa uang asli. ## Untuk siapa ini Pakai starter ini kalau Anda butuh salah satu dari berikut: - Halaman akun untuk pelanggan: login, profil, keamanan. - Dashboard langganan dan hak akses. - Halaman pembayaran sendiri (kartu, QRIS, Virtual Account, e-wallet) yang tampilannya sama di semua produk. Anda tidak perlu jadi ahli pembayaran. Bagian yang paling rawan, yaitu checkout dan pengecekan bayar, sudah kami tangani. Anda tinggal ganti merek, isi produk, dan pasang kunci Midtrans. ## Kenapa ada Membuat halaman akun yang utuh itu makan waktu: login, keamanan dua langkah, kelola langganan, tagihan, dan yang paling sulit, sistem pembayaran yang tidak gampang diakali. Semua itu sudah jadi di sini, siap Anda pakai ulang. > [!NOTE] > Halaman bayar dibuat sendiri memakai **Midtrans Core API**, bukan halaman standar "Snap" bawaan > Midtrans, jadi tampilannya benar-benar menyatu dengan merek Anda. Metode yang didukung: QRIS, > GoPay, ShopeePay, Virtual Account (BCA, BNI, BRI, Permata, CIMB), Mandiri Bill, dan kartu > kredit/debit dengan verifikasi OTP (3D Secure). Tersedia juga link pembayaran dan langganan > otomatis. ## Fitur - **Login dan keamanan akun.** Daftar dan masuk, verifikasi email lewat OTP, lupa kata sandi, keamanan dua langkah (2FA), lihat dan keluarkan perangkat yang sedang login, dan ganti kata sandi. Sudah termasuk pelindung anti-bot (Cloudflare Turnstile). - **Halaman bayar sendiri.** Tampilan bayar yang menyatu dengan merek Anda, untuk pengguna yang sudah login maupun tamu. QR atau nomor Virtual Account tampil langsung di halaman, status dicek otomatis, verifikasi kartu (3D Secure) tanpa pindah halaman, simpan kartu untuk sekali klik, dan deteksi bank dari nomor kartu. - **Langganan.** Lihat status dan masa aktif, berhenti di akhir periode, ganti paket, dan perpanjang otomatis (kartu) atau manual (QRIS dan VA). - **Hak akses.** Satu login untuk semua layanan (SSO), plus rincian apa saja yang bisa diakses. - **Email otomatis.** Kode OTP, ucapan selamat datang, info akses setelah bayar, pengingat menunggu bayar, struk, dan pemberitahuan saat bayar gagal. Tidak ada email dobel. - **Beli tanpa daftar dulu.** Orang bisa langsung bayar. Akunnya dibuat otomatis setelah lunas, lalu dikirim tautan untuk mengatur kata sandi sendiri. - **Privasi (UU PDP).** Pengguna bisa mengunduh datanya (JSON) dan menghapus akun. - **Buat akun dari sistem lain.** Jalur aman agar website atau aplikasi lain bisa membuatkan akun setelah pembelian. - **Panel admin.** Dibuka lewat allowlist email (`ADMIN_EMAILS`): ringkasan pendapatan dan tunggakan, telusuri pengguna beserta langganan/tagihan/akses, buat Payment Link, pendaftar acara (gabungan gratis dari CMS dan berbayar) dengan ekspor CSV, cetak invoice pelanggan, pencarian global, dan filter per lini layanan. Bisa beri/cabut hak akses manual, semua tercatat di **jejak audit**. - **Keamanan operator.** Verifikasi dua langkah (2FA) untuk akses admin bersifat fail-closed di produksi (`ADMIN_REQUIRE_MFA`), dan jejak audit mencatat aksi sensitif (beri/cabut akses, buat Payment Link, ekspor data, hapus akun) selaras dengan PCI DSS, ISO 27001, SOC 2, dan UU PDP. ## Cara kerjanya ``` Web / App / Kelas --"Beli"--> Account Center --charge--> Midtrans Core API (kirim kode barang, (hitung harga, (QRIS / VA / e-wallet / bukan harga) proses checkout) kartu 3DS) ^ | | webhook (dicek | +---- keaslian + anti -----+ dobel) akses dibuka setelah bayar benar-benar lunas ``` Aturan intinya: produk lain cukup mengirim kode barang, bukan harga. Harga selalu dihitung di server ini, pembayaran diproses, lalu akses dibuka hanya setelah Midtrans memastikan bayarnya lunas. ## Tech stack | Bagian | Teknologi | |--------|-----------| | Framework | [Next.js 16](https://nextjs.org/) (App Router, Server Components, Turbopack) | | UI | [React 19](https://react.dev/) + [Tailwind CSS v4](https://tailwindcss.com/) | | Bahasa | [TypeScript](https://www.typescriptlang.org/) (strict) | | ORM | [Prisma 6](https://www.prisma.io/) (SQLite untuk dev, MySQL atau PostgreSQL untuk produksi) | | Auth | [Better Auth 1.6](https://www.better-auth.com/) (email + password, 2FA, OTP) | | Pembayaran | [Midtrans Core API](https://docs.midtrans.com/) plus Payment Link dan Subscription | | Email | [Nodemailer](https://nodemailer.com/) (transaksional) | | Konten acara | [Directus](https://directus.io/) (opsional, ada fallback contoh) | | Monitoring | [Sentry](https://sentry.io/) (errors-only, hemat kuota) | ## Mulai cepat Pilih salah satu cara memakai kode ini: - **Tombol "Use this template"** (paling gampang): bikin repo baru milik Anda dengan riwayat bersih, [buka di sini](https://github.com/maubisa-id/account-center-starter/generate). - **Salin langsung jadi folder baru** (tanpa membawa riwayat git): ```bash npx degit maubisa-id/account-center-starter nama-proyek-anda cd nama-proyek-anda ``` - **Fork lewat tombol di GitHub** kalau ingin tetap terhubung ke sumbernya, supaya gampang menarik pembaruan nanti. Lalu jalankan: ```bash npm install cp .env.example .env # minimal isi BETTER_AUTH_SECRET (openssl rand -base64 32) npx prisma db push # buat dev.db + tabel dari prisma/schema.prisma npm run seed # data contoh + akun demo npm run dev # http://localhost:3000 ``` **Akun demo:** user `[email protected]` (punya langganan, tagihan, dan hak akses contoh) atau admin `[email protected]` (login lalu mendarat di `/admin`). Sandi keduanya `password123`. Butuh Node 22 (lihat [`.nvmrc`](./.nvmrc)). Tanpa kunci Midtrans pun aplikasi tetap jalan: fitur pembayaran menampilkan status "belum tersedia", bukan error. ## Environment Semua variabel dijelaskan di [`.env.example`](./.env.example). Yang paling penting: | Variabel | Wajib | Keterangan | |----------|:-----:|------------| | `DATABASE_URL` + `DB_PROVIDER` | ya | `file:./dev.db` (dev) atau `mysql://` / `postgresql://` (produksi) | | `BETTER_AUTH_SECRET` / `BETTER_AUTH_URL` | ya | rahasia acak plus origin app | | `MIDTRANS_SERVER_KEY` | untuk bayar | server key (rahasia) | | `NEXT_PUBLIC_MIDTRANS_CLIENT_KEY` | untuk kartu | client key (wajib untuk kartu dan 3DS) | | `TURNSTILE_SECRET_KEY` | di produksi | anti-bot; wajib di produksi (app tidak boot tanpa kunci) | | `MAIL_*` | untuk email | SMTP; kalau kosong, email dicetak ke konsol saat dev | | `PROVISION_SECRET` | untuk provisioning | shared secret dari sistem yang memanggil | | `DIRECTUS_URL` / `DIRECTUS_TOKEN` | untuk acara | sumber data acara (opsional) | > [!IMPORTANT] > **Harga selalu ditentukan di server, bukan dari halaman atau browser.** Nilai bayar tidak pernah > diambil dari sisi pengguna, jadi tidak bisa diakali. Akses baru terbuka setelah Midtrans mengabari > bahwa pembayaran benar-benar lunas, dan pesan itu dicek keasliannya lebih dulu. ## Deploy ke Vercel Klik tombol **Deploy with Vercel** di atas. Saat impor, Vercel otomatis meminta env **wajib** berikut (build menjalankan `prisma db push`, jadi database harus siap sejak build pertama): - `DATABASE_URL` dan `DB_PROVIDER` — pakai database terkelola (Neon, Supabase, PlanetScale, Railway) untuk deploy yang persisten. `file:./dev.db` + `sqlite` bisa untuk demo cepat, tapi di serverless datanya sementara (tiap invocation terisolasi) — cukup untuk pratinjau, bukan produksi. - `BETTER_AUTH_SECRET` (rahasia acak) dan `BETTER_AUTH_URL` (isi domain Vercel final setelah rilis pertama, lalu deploy ulang). - `NEXT_PUBLIC_DEMO_MODE` — isi `1` untuk demo publik (checkout sandbox, mailbox demo), kosongkan untuk produksi. Env opsional lain (isi dari `.env.example` sesuai kebutuhan) bisa ditambahkan di Settings → Environment Variables kapan saja: - `MIDTRANS_IS_PRODUCTION`, `MIDTRANS_SERVER_KEY`, `NEXT_PUBLIC_MIDTRANS_CLIENT_KEY` untuk pembayaran - `TURNSTILE_SECRET_KEY` dan `NEXT_PUBLIC_TURNSTILE_SITE_KEY` untuk proteksi form di produksi - `MAIL_HOST`, `MAIL_PORT`, `MAIL_USERNAME`, `MAIL_PASSWORD`, `MAIL_FROM_*`, `MAIL_REPLYTO_*` untuk email - `DIRECTUS_URL`, `DIRECTUS_TOKEN`, `DIRECTUS_EVENTS_COLLECTION` bila memakai CMS acara - `PROVISION_SECRET`, `ADMIN_EMAILS`, `NEXT_PUBLIC_*_URL`, dan `NEXT_PUBLIC_*_ENABLED` sesuai layanan `vercel.json` sudah menjalankan `node scripts/db-provider.mjs && prisma generate && prisma db push && next build`. Setelah rilis pertama, set `BETTER_AUTH_URL` ke domain Vercel final lalu deploy ulang. > [!WARNING] > **Tidak bisa login / error 500 di Vercel?** Dua penyebab paling umum: > > 1. **SQLite tidak jalan di serverless.** `DATABASE_URL=file:./dev.db` hanya untuk lokal — > filesystem Vercel bersifat sementara & read-only, jadi Better Auth gagal menulis sesi > (endpoint `/api/auth/*` balas 500). Pakai database terkelola (mis. [Neon](https://neon.tech) > gratis), lalu set `DATABASE_URL=postgresql://...` + `DB_PROVIDER=postgresql` + > `BETTER_AUTH_SECRET` (acak) + `BETTER_AUTH_URL=https://<domain-vercel-anda>`, dan deploy ulang. > 2. **Belum ada akun.** `prisma db push` hanya membuat tabel, bukan data. Untuk akun demo > (`[email protected]` / `[email protected]`, sandi `password123`), jalankan seed **sekali** > menunjuk ke DB terkelola Anda: > ```bash > DATABASE_URL="postgresql://...anda..." DB_PROVIDER=postgresql npm run seed > ``` > Atau lewati seed dan daftar akun baru di `/daftar` (pakai sandi kuat — `password123` ditolak > saat daftar karena masuk daftar sandi lemah; ia hanya dipakai akun demo hasil seed). Untuk > akses admin, isi `ADMIN_EMAILS` dengan email yang Anda daftarkan. ## Buat jadi milik Anda Repo tetap membawa identitas Maubisa sebagai asal template, sementara isi produk demo sudah netral. Untuk menjadikannya milik sendiri: 1. **Ganti merek aplikasi.** Logo lewat `NEXT_PUBLIC_LOGO_URL` (atau aset di [`.github/assets/`](./.github/assets) untuk repo), warna `brand-*` di `src/app/globals.css`, serta nama pengirim email di `MAIL_FROM_*`. Untuk kartu social preview, ubah `CARDS` di [`scripts/make-og.mjs`](./scripts/make-og.mjs) lalu jalankan `npm run og`. 2. **Sesuaikan sinyal kepercayaan.** Badan hukum, nomor WhatsApp, dan testimoni di `src/components/pay/checkout-trust.tsx` serta `src/lib/testimonials.ts`. 3. **Ganti lini layanan.** Label scope internal ada di `src/lib/service-lines.ts`; kunci `thesis|app|kelas|book` sengaja tetap agar seed, DB, dan katalog tidak pecah. 4. **Atur katalog dan harga.** Produk contoh ada di `prisma/seed.ts` (`membership-pro`, `webinar-sample`, `consult-basic`, `consult-plus`, `course-sample`), metadata kartu di `src/lib/catalog.ts`, dan harga produksi di database. Harga tetap dihitung di server. 5. **Isi kunci Midtrans Anda.** Dari [dashboard Midtrans](https://dashboard.midtrans.com/), pakai Sandbox untuk uji dan Production saat rilis, lalu masukkan ke `.env`. 6. **Deploy.** Cara tercepat: tombol **Deploy with Vercel** di atas. Bawa database terkelola sendiri (misalnya [Neon](https://neon.tech) atau [Supabase](https://supabase.com)); `vercel.json` sudah mengatur `prisma db push` dan `next build` otomatis. Setelah rilis pertama, set `BETTER_AUTH_URL` ke domain final Anda lalu deploy ulang. Untuk MySQL/PostgreSQL manual atau Docker, lihat [docs/produksi-mysql.md](./docs/produksi-mysql.md); `Dockerfile` tersedia di root. > [!TIP] > [`PRODUCT.md`](./PRODUCT.md) dan [`DESIGN.md`](./DESIGN.md) berisi konteks produk dan sistem desain > Maubisa sebagai contoh. Ganti dengan milik Anda supaya keputusan tampilan tetap konsisten. Panduan kontribusi dan standar kode ada di [CONTRIBUTING.md](./CONTRIBUTING.md). ## Struktur proyek ``` src/ app/ (app)/ # area login: ringkasan, profil, keamanan, langganan, # metode-pembayaran, pembayaran, acara, akses, notifikasi, privasi beli, checkout, bayar/[orderId], terima-kasih # alur checkout (tamu dan login) masuk, daftar, lupa-password, reset-password, 2fa api/ auth/[...all] # Better Auth pay/ # charge, charge/guest, status, cancel, bin, link, resend webhook/midtrans # aktivasi akses (signature + idempotent; sekali bayar dan berulang) provision # dipanggil sistem lain setelah pembelian payment-methods # kartu tersimpan (One Click) components/ # shell, ui, dashboard/*, pay/*, shared-assets/credit-card/* lib/ # auth, prisma, midtrans/* (Core API + subscription + link + bin), # midtrans-card (3DS), order-id, payment-methods, recurring, email, format prisma/ # schema.prisma, seed.ts test/ # Vitest (unit): signature, order-id, safe-redirect, status, guest-order ``` ## Skrip | Skrip | Fungsi | |-------|--------| | `npm run dev` | server pengembangan (Turbopack) | | `npm run build` / `npm start` | build dan jalankan produksi | | `npm run lint` | ESLint | | `npm run test` | Vitest (unit) | | `npm run seed` | isi data contoh dan akun demo | | `npm run test:webhook` | uji webhook Midtrans lokal (end-to-end, tanpa tunnel) | ## Keamanan Bagian pembayaran dibuat ekstra hati-hati: setiap pemberitahuan dari Midtrans dicek keasliannya dulu, proses yang sama tidak dihitung dua kali, status pembayaran tidak bisa mundur, dan nominalnya selalu dicocokkan dengan tagihan. Nomor kartu dan CVV tidak pernah kami simpan, karena pemrosesan kartu sepenuhnya ditangani Midtrans. Detail teknis dan cara melapor ada di [SECURITY.md](./SECURITY.md). ## Dokumentasi | Dokumen | Isi | |---------|-----| | [PANDUAN-DEMO.md](./PANDUAN-DEMO.md) | Cara memasang demo online (database, Sandbox, reset) | | [PRODUCT.md](./PRODUCT.md) | Konteks produk dan audiens | | [DESIGN.md](./DESIGN.md) | Sistem desain dan keputusan visual | | [SECURITY.md](./SECURITY.md) | Kebijakan keamanan dan checklist produksi | | [SUPPORT.md](./SUPPORT.md) | Cara mendapat bantuan dan melapor masalah | | [SENTRY-RUNBOOK.md](./SENTRY-RUNBOOK.md) | Runbook monitoring error | | [docs/produksi-mysql.md](./docs/produksi-mysql.md) | Deploy ke MySQL atau PostgreSQL | | [CONTRIBUTING.md](./CONTRIBUTING.md) | Cara berkontribusi dan standar kode | | [CHANGELOG.md](./CHANGELOG.md) | Riwayat perubahan | ## Kredit & Atribusi Template ini berasal dari [`maubisa-id/account-center-starter`](https://github.com/maubisa-id/account-center-starter) oleh Maubisa / PT Litera Edu Solusi. Kalau Anda memakai atau memodifikasi starter ini, kami akan senang kalau atribusi dan tautan asalnya tetap dicantumkan agar pengguna lain bisa menemukan sumbernya. ## Lisensi [MIT](./LICENSE), hak cipta 2026 PT Litera Edu Solusi (Maubisa). Singkatnya: bebas dipakai, diubah, dan disebarkan, termasuk untuk usaha komersial. Cukup sertakan salinan teks lisensinya. Logo dan nama "Maubisa" tetap milik PT Litera Edu Solusi; ganti dengan merek Anda sendiri saat memakai. --- <div align="center"> <sub>Dibuat oleh <a href="https://maubisa.id">Maubisa</a>. Menggerakkan <a href="https://akun.maubisa.id">akun.maubisa.id</a>.</sub> </div>
看看同类模板
对比同技术栈与用途的模板,找到更适合的视觉与内容结构。

ai-website-cloner-template
Clone any website with one command using AI coding agents
Next.js · 启动器

Next.js SaaS Starter
Next.js SaaS Starter 是 Next.js 官方维护的 SaaS 起点模板,定位介于学习资源和可直接部署的脚手架之间。
Next.js · SaaS

Next.js Commerce
Next.js Commerce 是 Vercel 团队维护的电商启动模板,基于 Next.js App Router 构建,采用服务端渲染、React Server Components、Server Actions …
Next.js · 电商

Next-js-Boilerplate
Next-js-Boilerplate 是一个面向 Next.js 16、Tailwind CSS 4 和 TypeScript 的启动器,核心定位是开发者体验优先。
Next.js · 启动器

tailwind-nextjs-starter-blog
tailwind-nextjs-starter-blog 是一个面向个人技术博客的 Next.js 与 Tailwind CSS 启动模板,其 v2 版本基于 App Router 与 React Server Comp…
Next.js · 博客

next-forge
Production-grade Turborepo template for Next.js apps.
Next.js · 启动器
