# Bigbike Platform Deployment Guide & System Architecture ### Target Domain: `bigbike.ddcsprocket.com` ### Target Server: `sql@192.168.1.26` --- ## 1. บทบาทของเซิร์ฟเวอร์ (System Architecture & Role) * **Server IP:** `192.168.1.26` (Hostname: `sql`, User: `sql`) * **บทบาท (Role):** **Application Runner เท่านั้น (Node.js / Bun / PM2)** * **ขอบเขตการทำงาน:** * รัน API Service (Elysia / Bun) และ Website SSR (Next.js Standalone / Node.js) ภายใต้การควบคุมของ PM2 * **ไม่ต้องตั้งค่า Nginx บนเครื่องนี้** เนื่องจากระบบมี Gateway / Reverse Proxy ภายนอกทำการ Port-Forward หรือ Proxy ส่ง Traffic เข้ามายังพอร์ตของแต่ละ Service โดยตรง ``` [ User Request ] │ ▼ [ External Gateway / Firewall / Nginx Proxy ] │ ├── Forward Traffic (Domain: bigbike.ddcsprocket.com) ──► 192.168.1.26:3002 (Next.js SSR) └── Forward Traffic (Domain: api.bigbike.ddcsprocket.com) ─► 192.168.1.26:3005 (Elysia API) ``` --- ## 2. โครงสร้าง Git Repository & การเชื่อมต่อ (Git Info) ### ฝั่ง Server (`192.168.1.26`) | รายการ | ตำแหน่ง Path บน Server | รายละเอียด | | :--- | :--- | :--- | | **Bare Repository** | `/home/sql/git/bigbike.git` | จุดรับ Git Push จากเครื่อง Local | | **Symlink Alias** | `/home/sql/git/bigbike.ddcsprocket.com.git` | ชี้ไปยัง `bigbike.git` | | **Working Directory** | `/home/sql/code/bigbike` | โฟลเดอร์แตกไฟล์ Source Code และรันโปรเจกต์ | | **Hook Script** | `/home/sql/git/bigbike.git/hooks/post-receive` | สคริปต์สั่ง Build และ Restart PM2 อัตโนมัติ (`chmod +x`) | ### ฝั่ง Local (`d:\cms`) * **Git Remote Name:** `bigbike` * **Remote URL:** `sql@192.168.1.26:/home/sql/git/bigbike.git` * **คำสั่ง Deploy:** ```powershell git push bigbike master ``` --- ## 3. Runtimes & สภาพแวดล้อมที่ใช้ในการประมวลผล | เครื่องมือ | Version | Path บนเครื่อง 192.168.1.26 | หน้าที่ในไปป์ไลน์ | | :--- | :--- | :--- | :--- | | **Bun** | `1.3.8` | `/home/sql/.bun/bin/bun` | รัน `bun install`, `bun run build`, รัน Elysia Backend | | **Node.js** | `v25.2.0` | `/usr/bin/node` | รัน Next.js Standalone SSR Server | | **PM2** | `6.0.14` | `/usr/bin/pm2` | Process Manager ควบคุม Service ให้รันตลอดเวลา | | **PostgreSQL** | `14.24` | `localhost:5432` | ฐานข้อมูล Local | > ⚠️ **ข้อควรระวังเรื่อง PATH ใน Post-Receive Hook:** > SSH non-interactive session จะไม่โหลด `~/.bashrc` อัตโนมัติ ในหัวสคริปต์ `post-receive` ต้อง export PATH เสมอ: > ```bash > export PATH="/home/sql/.bun/bin:/usr/local/bin:/usr/bin:/bin:$PATH" > ``` --- ## 4. แผนผังพอร์ต & การจัดการ PM2 (Process Management) ### พอร์ตและ Process ของ Bigbike (เปิดใหม่) | Service | PM2 Process Name | Port | Runtime / Command | CWD | | :--- | :--- | :---: | :--- | :--- | | **Backend API** | `bigbike-backend` | **`3005`** | `bun run src/index.ts` | `/home/sql/code/bigbike/apps/backend` | | **Website (SSR)** | `bigbike-website` | **`3002`** | `node server.js` (.next/standalone) | `/home/sql/code/bigbike/apps/website` | ### ตารางตรวจสอบพอร์ตเดิมบน Server (เพื่อป้องกันพอร์ตชน) | Port | Service เดิมที่ใช้งานอยู่ | สถานะ | | :---: | :--- | :---: | | **3001** | `shop-ddcth` (Next.js) | ใช้งานอยู่ | | **3002** | *ว่าง* ➔ **กำหนดให้ `bigbike-website`** | ✅ ใช้งานได้ | | **3005** | *ว่าง* ➔ **กำหนดให้ `bigbike-backend`** | ✅ ใช้งานได้ | | **3306** | MariaDB Server | ใช้งานอยู่ | | **4000** | `aroka-backend` | ใช้งานอยู่ | | **4545** | `rebrand-dev` (Vite) | ใช้งานอยู่ | | **5000** | `ddc hr backend` (Bun) | ใช้งานอยู่ | | **5432** | PostgreSQL 14 Local | ใช้งานอยู่ | | **6333 / 6334** | Qdrant Vector DB | ใช้งานอยู่ | | **8000** | `check-order-production` (Python FastAPI) | ใช้งานอยู่ | --- ## 5. การตั้งค่าฐานข้อมูล & ไฟล์ .env (Database & Environment Config) ### 1) สถานะฐานข้อมูล PostgreSQL * **สถานะปัจจุบัน:** ✅ **สร้าง Database `bigbike_db` บน `192.168.1.26` เรียบร้อยแล้ว** * **Host:** `localhost:5432` * **User:** `postgres` * **Password:** `password` * **Connection String:** ```text DATABASE_URL="postgresql://postgres:password@localhost:5432/bigbike_db?schema=public" ``` ### 2) ตำแหน่งไฟล์ .env ที่ติดตั้งไว้บน Server (`192.168.1.26`) * **Backend API:** `/home/sql/code/bigbike/apps/backend/.env` ```env PORT=3005 DATABASE_URL="postgresql://postgres:password@localhost:5432/bigbike_db?schema=public" NODE_ENV=production APP_URL="https://api.bigbike.ddcsprocket.com" BACKEND_PUBLIC_URL="https://api.bigbike.ddcsprocket.com" CORS_ORIGIN="https://admin.bigbike.ddcsprocket.com,https://spa.bigbike.ddcsprocket.com,https://bigbike.ddcsprocket.com,http://localhost:3000,http://localhost:3002" JWT_SECRET="bigbike-secret-key-prod-2026-ddc" OMISE_SECRET_KEY="" ``` * **Website (Next.js SSR):** `/home/sql/code/bigbike/apps/website/.env` ```env PORT=3002 NODE_ENV=production NEXT_PUBLIC_API_URL="https://api.bigbike.ddcsprocket.com/api" ``` *(ไฟล์ template ถูกสำรองไว้ใน [backend.env](file:///d:/cms/serverinfo/192.168.1.26/bigbike.ddcsprocket.com/backend.env) และ [website.env](file:///d:/cms/serverinfo/192.168.1.26/bigbike.ddcsprocket.com/website.env))* --- ## 6. วงจรการทำงานของ Post-Receive Hook (Deployment Pipeline) เมื่อมีการ `git push bigbike master` สคริปต์ `/home/sql/git/bigbike.git/hooks/post-receive` จะทำงานตามลำดับดังนี้: 1. **Checkout Source Code:** แตกไฟล์ล่าสุดจาก Git ลงที่ `/home/sql/code/bigbike` 2. **Install Dependencies:** สั่งรัน `$BUN install` ใน root monorepo 3. **Backend Service & Auto Database Migration:** * รัน `$BUN x prisma generate` (อัปเดต Prisma Client Types) * รัน `$BUN x prisma migrate deploy` (นำ migration files ใหม่ไป Apply ลง DB อัตโนมัติ) * รัน `$BUN x prisma db push --accept-data-loss` (ซิงก์ schema เข้า DB ทันที ป้องกันกรณีแก้ schema.prisma โดยไม่ได้รัน migrate dev) * สั่ง `pm2 restart bigbike-backend --update-env` (หากยังไม่เคยรัน จะสั่ง `pm2 start` บนพอร์ต `3005`) 4. **Website Service (Next.js SSR):** * บิลด์ Next.js ด้วย `NODE_ENV=production $BUN run build` * สั่ง `pm2 restart bigbike-website --update-env` (หากยังไม่เคยรัน จะสั่งรัน standalone `server.js` บนพอร์ต `3002`) 5. **Persist State:** สั่ง `pm2 save` เพื่อบันทึกรายชื่อโปรเซส ให้ฟื้นตัวอัตโนมัติเมื่อเซิร์ฟเวอร์รีบูต --- ## 7. คำสั่งที่ใช้ในการตรวจสอบและแก้ไขปัญหา (Runbook & Troubleshooting) ### ตรวจสอบสถานะและ Logs บน Server: ```bash # ดูสถานะ PM2 ทั้งหมด ssh sql@192.168.1.26 "pm2 status" # ดู Logs สดของ Backend ssh sql@192.168.1.26 "pm2 logs bigbike-backend --lines 100" # ดู Logs สดของ Website SSR ssh sql@192.168.1.26 "pm2 logs bigbike-website --lines 100" # ทดสอบ Curl พอร์ตภายในเครื่อง ssh sql@192.168.1.26 "curl -I http://localhost:3005" ssh sql@192.168.1.26 "curl -I http://localhost:3002" ```