Mark steps 1-6 as ordered with mandatory mechanical checks (reference check before delete, session chain, zod messages, import order), add the CRLF caveat for prettier on Windows, and spell out the report format with a concrete example. |
21 hours ago | |
|---|---|---|
| .claude/skills/cleo-code-review | 21 hours ago | |
| app | 21 hours ago | |
| components | 21 hours ago | |
| data | 21 hours ago | |
| db | 2 weeks ago | |
| drizzle | 2 weeks ago | |
| hooks | 2 weeks ago | |
| lib | 21 hours ago | |
| old-source | 2 weeks ago | |
| public | 2 weeks ago | |
| scripts | 2 weeks ago | |
| .env.example | 2 weeks ago | |
| .gitignore | 2 days ago | |
| .prettierignore | 2 days ago | |
| AGENTS.md | 2 weeks ago | |
| CLAUDE.md | 21 hours ago | |
| README.md | 2 weeks ago | |
| components.json | 2 weeks ago | |
| docker-compose.yml | 2 days ago | |
| drizzle-amigo.config.ts | 2 weeks ago | |
| drizzle.config.ts | 2 weeks ago | |
| eslint.config.mjs | 2 weeks ago | |
| next.config.ts | 2 weeks ago | |
| package.json | 2 days ago | |
| pnpm-lock.yaml | 2 days ago | |
| pnpm-workspace.yaml | 2 weeks ago | |
| proxy.ts | 2 days ago | |
| tsconfig.json | 2 weeks ago | |
README.md
Cleo Minimarket
Back-office minimarket berbasis Next.js 16, pengganti aplikasi PHP lama di old-source/.
Stack: Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS 4, shadcn/ui, Drizzle ORM,
Better Auth, Postgres (data aplikasi dan login), MariaDB cleo (data bisnis lama).
Setup di laptop baru
Yang perlu terpasang
- Node.js 24 atau lebih baru
- pnpm 11 (
npm install -g pnpm) - Docker Desktop, dalam keadaan menyala
- Git
Langkah
-
Clone repo dan install dependency
git clone https://git.amigogroup.id/deardo/nextjs-cleo-minimarket.git cd nextjs-cleo-minimarket pnpm install -
Buat
.envdari contohcp .env.example .envLalu isi nilainya:
Variabel Isi POSTGRES_PASSWORDPassword bebas untuk Postgres lokal. DATABASE_URLGanti <POSTGRES_PASSWORD>dengan password yang sama seperti di atas.MARIADB_ROOT_PASSWORDPassword bebas untuk rootMariaDB lokal. Jangan pakai password server asli.AMIGO_DATABASE_URLGanti <password-cleo-next>dengan password bebas; user ini dibuat di langkah 6.BETTER_AUTH_SECRETString acak, buat dengan perintah di bawah. SEED_ADMIN_PASSWORDPassword akun admin pertama (minimal 8 karakter). node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"Buat
BETTER_AUTH_SECRETbaru di setiap laptop dan server, jangan disalin dari tempat lain.Password di
AMIGO_DATABASE_URLjangan mengandung@ : / # ? %, atau tulis dalam bentuk URL-encoded (mis.@menjadi%40). -
Nyalakan Postgres dan MariaDB
docker compose up -dContainer
cleo-postgresdancleo-mariadbakan muncul di Docker Desktop. Data tersimpan di volumecleo-pgdatadancleo-mariadb-data, jadi tidak hilang walaupun container dimatikan atau dibuat ulang. -
Buat tabel
pnpm db:migrate -
Buat akun admin pertama
pnpm db:seedUsername dan password diambil dari
SEED_ADMIN_*di.env. Aman dijalankan berulang kali: kalau akun sudah ada, seed dilewati. -
Isi MariaDB lokal dengan salinan data
cleoAplikasi tidak pernah terhubung ke server asli (
192.168.3.3) saat development. Data bisnis disalin sekali ke MariaDB di Docker, lalu semua CRUD dicoba di salinan itu. Langkah ini butuh jaringan kantor dan passwordrootserver192.168.3.3(minta ke admin), hanya untuk membaca.Perintah di bawah untuk PowerShell. Jalankan blok per blok. Kalau menyalin dari file mentah (bukan tampilan README di Git), buang spasi di awal baris: penutup
'@di blok c dan d harus berada di kolom pertama.a. Dump dari server kantor ke file di dalam container (diminta password
rootserver kantor; ~260 MB, beberapa menit, jangan biarkan laptop sleep):docker exec -it cleo-mariadb sh -c 'mysqldump -h 192.168.3.3 -u root -p --single-transaction --triggers cleo > /tmp/cleo.sql' docker exec cleo-mariadb sh -c 'tail -n 1 /tmp/cleo.sql'Baris terakhir harus
-- Dump completed on .... Jangan tambahkan--routines: tabel sistemmysql.procdi server kantor rusak sejak upgrade dari 10.1 dan membuat dump berhenti di akhir, padahal databasecleotidak punya stored procedure.b. Import ke MariaDB lokal (tanpa output kalau berhasil):
docker exec cleo-mariadb sh -c 'mysql -uroot -p$MARIADB_ROOT_PASSWORD cleo < /tmp/cleo.sql'c. Buat user aplikasi
cleo_next. Ganti<password-cleo-next>dengan password yang sama seperti diAMIGO_DATABASE_URL:$sql = @' CREATE USER IF NOT EXISTS 'cleo_next'@'%' IDENTIFIED BY '<password-cleo-next>'; GRANT LOCK TABLES ON cleo.* TO 'cleo_next'@'%'; '@ $sql | docker exec -i cleo-mariadb sh -c 'mysql -uroot -p$MARIADB_ROOT_PASSWORD'd. Beri
cleo_nexthak baca/tulis data (tanpa hak mengubah struktur tabel) hanya di tabel bisnis. Tabel milik aplikasi lain di database yang sama (Laravel, Prisma, Better Auth lama) sengaja tidak diberi akses:$gen = @' SELECT CONCAT('GRANT SELECT, INSERT, UPDATE, DELETE ON cleo.`', table_name, '` TO ''cleo_next''@''%'';') FROM information_schema.tables WHERE table_schema = 'cleo' AND table_name NOT IN ( 'users', 'sessions', 'jobs', 'failed_jobs', 'job_batches', 'migrations', 'cache', 'cache_locks', 'password_reset_tokens', 'akuns', 'user', 'account', 'session', 'verification', '_prisma_migrations' ); '@ $gen | docker exec -i cleo-mariadb sh -c 'mysql -uroot -p$MARIADB_ROOT_PASSWORD -N' | docker exec -i cleo-mariadb sh -c 'mysql -uroot -p$MARIADB_ROOT_PASSWORD'e. Cek. Login sebagai
cleo_next:docker exec -it cleo-mariadb mysql -ucleo_next -p cleoLalu jalankan
SELECT COUNT(*) FROM pelanggan;(harus ada angkanya) danSELECT COUNT(*) FROM users;(harusSELECT command denied). Keluar denganexit.Langkah c sampai e aman diulang.
db/amigo/schema.tssudah ada di repo, jadipnpm db:amigo:pulltidak perlu dijalankan di laptop baru. -
Jalankan aplikasi
pnpm devBuka http://localhost:3000. Untuk mengecek koneksi auth, buka http://localhost:3000/api/auth/get-session, hasilnya
nullkalau belum login.
Catatan
- Server MariaDB kantor (
192.168.3.3) masih dipakai aplikasi PHP di toko. Saat development hanya dibaca sekali untuk dump (langkah 6a);AMIGO_DATABASE_URLselalu menunjuk kelocalhost:3307. Fitur login tidak membutuhkan MariaDB. - Mengembalikan salinan lokal ke kondisi awal (mis. setelah data uji berantakan): ulangi langkah
6a dan 6b. Untuk mulai dari nol, hapus dulu container dan volume-nya
(
docker compose rm -sf mariadb, laludocker volume rm cleo-minimarket_cleo-mariadb-data, laludocker compose up -d mariadb), kemudian ulangi langkah 6a sampai 6e. Jangan pakaidocker compose down -v: perintah itu juga menghapus data Postgres. MARIADB_ROOT_PASSWORDhanya dibaca saat volume MariaDB masih kosong. Mengubahnya di.envsetelah itu tidak berpengaruh, kecuali volume dihapus seperti di atas.- Di PowerShell 5.1 jangan kirim query lewat
mysql -e "...": tanda kutip ganda dibuang oleh PowerShell. Kirim lewat pipe:'SELECT 1' | docker exec -i cleo-mariadb sh -c 'mysql -uroot -p$MARIADB_ROOT_PASSWORD -N cleo'. - Pendaftaran akun lewat web sengaja ditutup (
disableSignUpdilib/auth.ts). Akun pertama dibuat lewatpnpm db:seed. - Kalau port 5432 sudah dipakai Postgres lain di laptop itu, matikan dulu Postgres tersebut, atau
ganti port kiri di
docker-compose.yml(mis."5433:5432") beserta port diDATABASE_URL. MariaDB lokal sengaja di port 3307 supaya tidak bentrok dengan XAMPP/MySQL di 3306.
Perintah
| Perintah | Fungsi |
|---|---|
pnpm dev |
Dev server di http://localhost:3000 |
pnpm build |
Build production |
pnpm lint |
ESLint |
pnpm exec tsc --noEmit |
Type-check |
docker compose up -d |
Nyalakan Postgres dan MariaDB lokal |
pnpm db:generate |
Buat file migrasi dari db/schema.ts |
pnpm db:migrate |
Jalankan migrasi ke Postgres |
pnpm db:seed |
Buat akun admin pertama |
pnpm db:studio |
Lihat isi Postgres di https://local.drizzle.studio |
pnpm db:amigo:pull |
Baca ulang struktur MariaDB ke db/amigo/schema.ts (hanya kalau struktur tabel berubah) |