197 lines
11 KiB
Markdown
197 lines
11 KiB
Markdown
# 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)
|
|
└── Forward Traffic (Domain: admin.bigbike.ddcsprocket.com) ─► 192.168.1.26:80 (Nginx Static: /var/www/html/bigbike_admin)
|
|
```
|
|
|
|
---
|
|
|
|
## 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` |
|
|
| **Admin Panel** | *N/A (Nginx Static)* | **`80`** | `Nginx Static Build` | `/var/www/html/bigbike_admin` |
|
|
|
|
### ตารางตรวจสอบพอร์ตเดิมบน 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. **Admin Panel (React Vite SPA):**
|
|
* รัน `$BUN run build` ใน `apps/admin` (พร้อม Inject `VITE_API_URL`)
|
|
* ซิงก์ไฟล์ build จาก `apps/admin/dist/` ไปยัง `/var/www/html/bigbike_admin/` อัตโนมัติ
|
|
5. **Website Service (Next.js SSR):**
|
|
* บิลด์ Next.js ด้วย `NODE_ENV=production $BUN run build`
|
|
* สั่ง `pm2 restart bigbike-website --update-env` (หากยังไม่เคยรัน จะสั่งรัน standalone `server.js` บนพอร์ต `3002`)
|
|
6. **Persist State:** สั่ง `pm2 save` เพื่อบันทึกรายชื่อโปรเซส ให้ฟื้นตัวอัตโนมัติเมื่อเซิร์ฟเวอร์รีบูต
|
|
|
|
---
|
|
|
|
## 7. ขั้นตอนการตั้งค่า Nginx สำหรับ Admin Panel (One-Time Setup)
|
|
|
|
ทำเพียงครั้งเดียวบนเซิร์ฟเวอร์ `sql@192.168.1.26` ผ่าน SSH:
|
|
|
|
### ขั้นที่ 1: สร้างโฟลเดอร์ Web Root และมอบสิทธิ์ให้ user `sql`
|
|
```bash
|
|
sudo mkdir -p /var/www/html/bigbike_admin
|
|
sudo chown -R sql:sql /var/www/html/bigbike_admin
|
|
```
|
|
|
|
### ขั้นที่ 2: นำไฟล์ Nginx Config ไปเปิดใช้งาน
|
|
```bash
|
|
# คัดลอกคอนฟิกไปยัง sites-available
|
|
sudo cp /home/sql/code/bigbike/serverinfo/192.168.1.26/bigbike.ddcsprocket.com/nginx/admin.bigbike.ddcsprocket.com.conf /etc/nginx/sites-available/admin.bigbike.ddcsprocket.com.conf
|
|
|
|
# ทำ Symlink เปิดใช้งานเว็บใน sites-enabled
|
|
sudo ln -sf /etc/nginx/sites-available/admin.bigbike.ddcsprocket.com.conf /etc/nginx/sites-enabled/
|
|
|
|
# ตรวจสอบความถูกต้องและสั่ง Reload
|
|
sudo nginx -t
|
|
sudo systemctl reload nginx
|
|
```
|
|
|
|
### ขั้นที่ 3: ซิงก์ไฟล์ Build ล่าสุดเข้าโฟลเดอร์ทันที (ไม่ต้องรอ Push รอบถัดไป)
|
|
```bash
|
|
rsync -av --delete /home/sql/code/bigbike/apps/admin/dist/ /var/www/html/bigbike_admin/
|
|
```
|
|
|
|
---
|
|
|
|
## 8. คำสั่งที่ใช้ในการตรวจสอบและแก้ไขปัญหา (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"
|
|
|
|
# ดู Nginx Error Log สำหรับ Admin Panel
|
|
ssh sql@192.168.1.26 "tail -n 50 /var/log/nginx/bigbike_admin_error.log"
|
|
|
|
# ทดสอบ Curl พอร์ตภายในเครื่อง
|
|
ssh sql@192.168.1.26 "curl -I http://localhost:3005"
|
|
ssh sql@192.168.1.26 "curl -I http://localhost:3002"
|
|
ssh sql@192.168.1.26 "curl -I -H 'Host: admin.bigbike.ddcsprocket.com' http://localhost"
|
|
```
|