diff --git a/serverinfo/192.168.1.24/admin.foxxio.ddcsprocket.com.conf b/serverinfo/192.168.1.24/admin.foxxio.ddcsprocket.com.conf new file mode 100644 index 0000000..566fd8b --- /dev/null +++ b/serverinfo/192.168.1.24/admin.foxxio.ddcsprocket.com.conf @@ -0,0 +1,34 @@ +server { + server_name admin.foxxio.ddcsprocket.com; + + location / { + proxy_pass http://192.168.1.26; + proxy_set_header Host $host; + proxy_http_version 1.1; + proxy_set_header Connection 'upgrade'; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # เพื่อรองรับการยืนยัน ssl จาก certbot + location ~ /.well-known/acme-challenge { + allow all; + root /var/www/html; + } + + listen 443 ssl; # managed by Certbot + ssl_certificate /etc/letsencrypt/live/admin.foxxio.ddcsprocket.com/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/admin.foxxio.ddcsprocket.com/privkey.pem; # managed by Certbot +} + +server { + if ($host = admin.foxxio.ddcsprocket.com) { + return 301 https://$host$request_uri; + } # managed by Certbot + + listen 80; + server_name admin.foxxio.ddcsprocket.com; + return 404; # managed by Certbot +} diff --git a/serverinfo/192.168.1.24/api.foxxio.ddcsprocket.com.conf b/serverinfo/192.168.1.24/api.foxxio.ddcsprocket.com.conf new file mode 100644 index 0000000..99a0c43 --- /dev/null +++ b/serverinfo/192.168.1.24/api.foxxio.ddcsprocket.com.conf @@ -0,0 +1,52 @@ +# 1. HTTP: Redirect ทุก Request ไปยัง HTTPS (พร้อมเปิดช่องทางสำหรับ Certbot ต่ออายุ) +server { + listen 80; + server_name api.foxxio.ddcsprocket.com; + + # สำหรับ Certbot ACME Challenge (ต่ออายุใบรับรองอัตโนมัติ) + location /.well-known/acme-challenge/ { + root /usr/share/nginx/html; + try_files $uri =404; + } + + # Redirect ทั้งหมดไปยัง HTTPS + location / { + return 301 https://$host$request_uri; + } +} + +# 2. HTTPS: Proxy ไปยัง Elysia Backend API (Port 3006) บน 192.168.1.26 +server { + listen 443 ssl; + server_name api.foxxio.ddcsprocket.com; + + # ตำแหน่ง SSL Certificate ของ Let's Encrypt + ssl_certificate /etc/letsencrypt/live/api.foxxio.ddcsprocket.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/api.foxxio.ddcsprocket.com/privkey.pem; + + # Certbot ACME Challenge + location /.well-known/acme-challenge/ { + root /usr/share/nginx/html; + try_files $uri =404; + } + + # Backend API: ส่งต่อไปยัง Elysia API บน 192.168.1.26:3006 + location / { + proxy_pass http://192.168.1.26:3006; + proxy_set_header Host $host; + proxy_http_version 1.1; + proxy_set_header Connection 'upgrade'; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # รองรับการอัปโหลดไฟล์ / รูปภาพ + client_max_body_size 50M; + + # Buffer settings + proxy_buffer_size 128k; + proxy_buffers 4 256k; + proxy_busy_buffers_size 256k; + } +} diff --git a/serverinfo/192.168.1.24/foxxio.ddcsprocket.com.conf b/serverinfo/192.168.1.24/foxxio.ddcsprocket.com.conf new file mode 100644 index 0000000..8cd6791 --- /dev/null +++ b/serverinfo/192.168.1.24/foxxio.ddcsprocket.com.conf @@ -0,0 +1,61 @@ +# 1. HTTP: Redirect ทุก Request ไปยัง HTTPS (พร้อมเปิดช่องทางสำหรับ Certbot ต่ออายุ) +server { + listen 80; + server_name foxxio.ddcsprocket.com; + + # สำหรับ Certbot ACME Challenge (ต่ออายุใบรับรองอัตโนมัติ) + location /.well-known/acme-challenge/ { + root /usr/share/nginx/html; + try_files $uri =404; + } + + # Redirect ทั้งหมดไปยัง HTTPS + location / { + return 301 https://$host$request_uri; + } +} + +# 2. HTTPS: Proxy ไปยัง Next.js SSR (Port 3003) และ Backend API (Port 3006) บน 192.168.1.26 +server { + listen 443 ssl; + server_name foxxio.ddcsprocket.com; + + # ตำแหน่ง SSL Certificate ของ Let's Encrypt + ssl_certificate /etc/letsencrypt/live/foxxio.ddcsprocket.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/foxxio.ddcsprocket.com/privkey.pem; + + # Certbot ACME Challenge + location /.well-known/acme-challenge/ { + root /usr/share/nginx/html; + try_files $uri =404; + } + + # Backend API: ส่งต่อไปยัง Elysia API บน 192.168.1.26:3006 + location /api/ { + proxy_pass http://192.168.1.26:3006; + proxy_set_header Host $host; + proxy_http_version 1.1; + proxy_set_header Connection 'upgrade'; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Website SSR: ส่งต่อไปยัง Next.js SSR บน 192.168.1.26:3003 + location / { + proxy_pass http://192.168.1.26:3003; + proxy_set_header Host $host; + proxy_http_version 1.1; + proxy_set_header Connection 'upgrade'; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # Buffer settings สำหรับ Next.js SSR + proxy_buffer_size 128k; + proxy_buffers 4 256k; + proxy_busy_buffers_size 256k; + } +} diff --git a/serverinfo/192.168.1.26/foxxio.ddcsprocket.com/docs/README.md b/serverinfo/192.168.1.26/foxxio.ddcsprocket.com/docs/README.md new file mode 100644 index 0000000..821b7a2 --- /dev/null +++ b/serverinfo/192.168.1.26/foxxio.ddcsprocket.com/docs/README.md @@ -0,0 +1,151 @@ +# Foxxio Platform Deployment Guide & System Architecture +### Target Domain: `foxxio.ddcsprocket.com` +### Target Server: `sql@192.168.1.26` +### Gateway Server: `adminweb@192.168.1.24` + +--- + +## 1. บทบาทของเซิร์ฟเวอร์ (System Architecture & Role) + +* **Application Server:** `192.168.1.26` (Hostname: `sql`, User: `sql`) + * **บทบาท:** Application Runner (PM2 / Bun / Node) + Static Nginx Host สำหรับ Admin Panel + * **ขอบเขต:** + * รัน API Service (Elysia / Bun) บน Port **`3006`** + * รัน Website SSR (Next.js / Node.js) บน Port **`3003`** + * รัน Admin Panel (React Vite SPA) ผ่าน Nginx Port **`80`** ชี้ไปยัง `/var/www/html/foxxio_admin` +* **Gateway / Reverse Proxy:** `192.168.1.24` (Docker Nginx) + * จัดการ SSL Termination (Let's Encrypt Certbot) + * Proxy Traffic ตาม Domain เข้ามายัง `192.168.1.26` + +``` +[ User Request ] + │ + ▼ +[ Gateway: 192.168.1.24 (Docker Nginx + SSL) ] + │ + ├── https://foxxio.ddcsprocket.com ──────► http://192.168.1.26:3003 (Next.js SSR) + ├── https://foxxio.ddcsprocket.com/api/ ──► http://192.168.1.26:3006 (Elysia API) + ├── https://api.foxxio.ddcsprocket.com ───► http://192.168.1.26:3006 (Elysia API) + └── https://admin.foxxio.ddcsprocket.com ─► http://192.168.1.26:80 (Admin Static SPA) +``` + +--- + +## 2. โครงสร้าง Git Repository & การเชื่อมต่อ (Git Info) + +### ฝั่ง Server (`192.168.1.26`) +| รายการ | ตำแหน่ง Path บน Server | รายละเอียด | +| :--- | :--- | :--- | +| **Bare Repository** | `/home/sql/git/foxxio.git` | จุดรับ Git Push จากเครื่อง Local | +| **Symlink Alias** | `/home/sql/git/foxxio.ddcsprocket.com.git` | ชี้ไปยัง `foxxio.git` | +| **Working Directory** | `/home/sql/code/foxxio` | โฟลเดอร์แตกไฟล์ Source Code และรันโปรเจกต์ | +| **Hook Script** | `/home/sql/git/foxxio.git/hooks/post-receive` | สคริปต์สั่ง Build และ Restart PM2 อัตโนมัติ (`chmod +x`) | + +### ฝั่ง Local (`d:\cms`) +* **Git Remote Name:** `foxxio` +* **Remote URL:** `sql@192.168.1.26:/home/sql/git/foxxio.git` +* **คำสั่ง Deploy:** + ```powershell + git remote add foxxio sql@192.168.1.26:/home/sql/git/foxxio.git + git push foxxio master + ``` + +--- + +## 3. แผนผังพอร์ต & การจัดการ PM2 (Process Management) + +### พอร์ตและ Process ของ Foxxio +| Service | PM2 Process Name | Port | Runtime / Command | CWD | +| :--- | :--- | :---: | :--- | :--- | +| **Backend API** | `foxxio-backend` | **`3006`** | `bun run src/index.ts` | `/home/sql/code/foxxio/apps/backend` | +| **Website (SSR)** | `foxxio-website` | **`3003`** | `node server.js` หรือ `bun run start` | `/home/sql/code/foxxio/apps/website` | +| **Admin Panel** | *N/A (Nginx Static)* | **`80`** | Nginx Static Build | `/var/www/html/foxxio_admin` | + +### ตารางพอร์ตบน Server 192.168.1.26 +| Port | Service ที่ใช้งาน | สถานะ | +| :---: | :--- | :---: | +| **3001** | `shop-ddcth` (Next.js) | ใช้งานอยู่ | +| **3002** | `bigbike-website` (Next.js SSR) | ใช้งานอยู่ | +| **3003** | `foxxio-website` (Next.js SSR) | **Foxxio** | +| **3005** | `bigbike-backend` (Elysia API) | ใช้งานอยู่ | +| **3006** | `foxxio-backend` (Elysia API) | **Foxxio** | +| **4000** | `aroka-backend` | ใช้งานอยู่ | +| **5000** | `ddc hr backend` | ใช้งานอยู่ | + +--- + +## 4. การตั้งค่าฐานข้อมูล & ไฟล์ .env + +### 1) ฐานข้อมูล PostgreSQL บน `192.168.1.26` +* **Database Name:** `foxxio_db` +* **Connection String:** + ```text + DATABASE_URL="postgresql://postgres:password@localhost:5432/foxxio_db?schema=public" + ``` + +### 2) Environment Variables +* **Backend (`/home/sql/code/foxxio/apps/backend/.env`):** + ```env + PORT=3006 + DATABASE_URL="postgresql://postgres:password@localhost:5432/foxxio_db?schema=public" + NODE_ENV=production + APP_URL="https://api.foxxio.ddcsprocket.com" + BACKEND_PUBLIC_URL="https://api.foxxio.ddcsprocket.com" + CORS_ORIGIN="https://admin.foxxio.ddcsprocket.com,https://spa.foxxio.ddcsprocket.com,https://foxxio.ddcsprocket.com,http://localhost:3000,http://localhost:3003" + JWT_SECRET="foxxio-secret-key-prod-2026-ddc" + OMISE_SECRET_KEY="" + ``` + +* **Website SSR (`/home/sql/code/foxxio/apps/website/.env`):** + ```env + PORT=3003 + NODE_ENV=production + NEXT_PUBLIC_API_URL="https://api.foxxio.ddcsprocket.com/api" + ``` + +--- + +## 5. คำสั่ง Sudo One-Liner สำหรับ Server 192.168.1.26 + +รันคำสั่งด้านล่างนี้บน `sql@192.168.1.26` เพียงครั้งเดียว: + +```bash +# 1. ปลดบล็อก UFW พอร์ต 3003 และ 3006 +sudo ufw allow 3003/tcp comment "Foxxio Website SSR" +sudo ufw allow 3006/tcp comment "Foxxio Backend API" +sudo ufw reload + +# 2. สร้างโฟลเดอร์ Web Root สำหรับ Admin Panel +sudo mkdir -p /var/www/html/foxxio_admin +sudo chown -R sql:sql /var/www/html/foxxio_admin + +# 3. ติดตั้ง Nginx Virtual Host สำหรับ Admin Panel +sudo tee /etc/nginx/sites-available/admin.foxxio.ddcsprocket.com.conf > /dev/null << 'EOF' +server { + listen 80; + server_name admin.foxxio.ddcsprocket.com; + root /var/www/html/foxxio_admin; + index index.html; + location / { + try_files $uri $uri/ /index.html; + } + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + expires 30d; + add_header Cache-Control "public, no-transform"; + } + error_log /var/log/nginx/foxxio_admin_error.log; + access_log /var/log/nginx/foxxio_admin_access.log; +} +EOF + +sudo ln -sf /etc/nginx/sites-available/admin.foxxio.ddcsprocket.com.conf /etc/nginx/sites-enabled/ +sudo nginx -t && sudo systemctl reload nginx +``` + +--- + +## 6. การตั้งค่าบน Gateway 192.168.1.24 (`adminweb@192.168.1.24`) + +1. **`foxxio.ddcsprocket.com.conf`**: Proxy `/` ไปยัง `192.168.1.26:3003` และ `/api/` ไปยัง `192.168.1.26:3006` +2. **`admin.foxxio.ddcsprocket.com.conf`**: Proxy ไปยัง `192.168.1.26:80` (พร้อม SSL เดิม) +3. **`api.foxxio.ddcsprocket.com.conf`**: Proxy ไปยัง `192.168.1.26:3006` diff --git a/serverinfo/192.168.1.26/foxxio.ddcsprocket.com/git-info/README.md b/serverinfo/192.168.1.26/foxxio.ddcsprocket.com/git-info/README.md new file mode 100644 index 0000000..dd56c19 --- /dev/null +++ b/serverinfo/192.168.1.26/foxxio.ddcsprocket.com/git-info/README.md @@ -0,0 +1,21 @@ +# Foxxio Git Repository & Deployment Info + +### Server: `sql@192.168.1.26` + +| Parameter | Value | +| :--- | :--- | +| **Bare Repository** | `/home/sql/git/foxxio.git` | +| **Symlink Alias** | `/home/sql/git/foxxio.ddcsprocket.com.git` | +| **Working Directory** | `/home/sql/code/foxxio` | +| **Hook Script** | `/home/sql/git/foxxio.git/hooks/post-receive` | +| **Branch** | `master` | + +### Local Remote Configuration (`d:\cms`) + +```powershell +# Add remote +git remote add foxxio sql@192.168.1.26:/home/sql/git/foxxio.git + +# Deploy +git push foxxio master +``` diff --git a/serverinfo/192.168.1.26/foxxio.ddcsprocket.com/hook/post-receive b/serverinfo/192.168.1.26/foxxio.ddcsprocket.com/hook/post-receive new file mode 100644 index 0000000..6281b25 --- /dev/null +++ b/serverinfo/192.168.1.26/foxxio.ddcsprocket.com/hook/post-receive @@ -0,0 +1,128 @@ +#!/bin/bash + +# ============================================================================== +# Foxxio Project (foxxio.ddcsprocket.com) +# Deployment Script (post-receive hook) on sql@192.168.1.26 +# Role: Application Runner (PM2 / Bun / Node) - No local Nginx +# ============================================================================== + +set -e +export PATH="/home/sql/.bun/bin:/usr/local/bin:/usr/bin:/bin:$PATH" + +# 1. PATH CONFIG +GIT_DIR="/home/sql/git/foxxio.git" +WORK_DIR="/home/sql/code/foxxio" +TARGET_ADMIN="/var/www/html/foxxio_admin" +BRANCH="master" +TEMP_DIR="/tmp/foxxio_build_$(date +%s)" + +# 2. RUNTIMES & EXECUTABLES +BUN="/home/sql/.bun/bin/bun" +NODE="/usr/bin/node" +PM2="/usr/bin/pm2" + +# 3. PM2 PROCESS NAMES +PM2_NAME_BACKEND="foxxio-backend" +PM2_NAME_WEBSITE="foxxio-website" + +# 4. ASSIGNED PORTS +BACKEND_PORT=3006 +SSR_PORT=3003 + +# 5. ENVIRONMENT VARIABLES +export BACKEND_PORT="$BACKEND_PORT" +export SSR_PORT="$SSR_PORT" +export VITE_API_URL="https://api.foxxio.ddcsprocket.com/api" +export NEXT_PUBLIC_API_URL="https://api.foxxio.ddcsprocket.com/api" + +echo "========================================================" +echo "🚀 [Foxxio] Starting Deployment on 192.168.1.26..." +echo "========================================================" + +# A. Checkout code to Work Directory +mkdir -p "$WORK_DIR" +echo ">>> Checking out branch $BRANCH to $WORK_DIR..." +git --work-tree="$WORK_DIR" --git-dir="$GIT_DIR" checkout -f "$BRANCH" + +cd "$WORK_DIR" + +# B. Install dependencies +if [ -f "package.json" ]; then + echo ">>> Installing dependencies with Bun..." + $BUN install +fi + +# C. Setup Backend (if apps/backend exists) +if [ -d "apps/backend" ]; then + echo ">>> Setting up Backend..." + cd "$WORK_DIR/apps/backend" + + if [ -f "prisma/schema.prisma" ]; then + echo ">>> Generating Prisma Client..." + $BUN x prisma generate + + echo ">>> Auto-updating Database Schema..." + if [ -d "prisma/migrations" ]; then + echo ">>> Running Prisma migrate deploy..." + $BUN x prisma migrate deploy || echo "⚠️ migrate deploy had notices, falling back to db push..." + fi + echo ">>> Syncing schema with db push..." + $BUN x prisma db push --accept-data-loss + fi + + echo ">>> Restarting PM2 process: $PM2_NAME_BACKEND..." + if $PM2 describe "$PM2_NAME_BACKEND" > /dev/null 2>&1; then + PORT=$BACKEND_PORT $PM2 restart "$PM2_NAME_BACKEND" --update-env + else + echo ">>> Starting $PM2_NAME_BACKEND for the first time on port $BACKEND_PORT..." + PORT=$BACKEND_PORT $PM2 start "$BUN" --name "$PM2_NAME_BACKEND" --cwd "$WORK_DIR/apps/backend" -- run src/index.ts + fi + cd "$WORK_DIR" +fi + +# D. Build & Deploy Admin Panel (React Vite SPA) +if [ -d "apps/admin" ]; then + echo ">>> Building Admin Panel (React Vite SPA)..." + cd "$WORK_DIR/apps/admin" + export VITE_API_URL="https://api.foxxio.ddcsprocket.com/api" + export VITE_FRONTEND_URL="https://foxxio.ddcsprocket.com" + $BUN run build + + if [ -d "$TARGET_ADMIN" ]; then + echo "Deploying Admin Panel to $TARGET_ADMIN..." + rsync -av --delete dist/ "$TARGET_ADMIN"/ + else + echo "⚠️ Target directory $TARGET_ADMIN not found. Please create it once with:" + echo " sudo mkdir -p $TARGET_ADMIN && sudo chown -R sql:sql $TARGET_ADMIN" + fi + cd "$WORK_DIR" +fi + +# E. Setup Website SSR (if apps/website exists) +if [ -d "apps/website" ]; then + echo ">>> Building Next.js Website..." + cd "$WORK_DIR/apps/website" + NODE_ENV=production $BUN run build + + echo ">>> Restarting PM2 process: $PM2_NAME_WEBSITE..." + if $PM2 describe "$PM2_NAME_WEBSITE" > /dev/null 2>&1; then + PORT=$SSR_PORT $PM2 restart "$PM2_NAME_WEBSITE" --update-env + else + echo ">>> Starting $PM2_NAME_WEBSITE for the first time on port $SSR_PORT..." + # Check standalone server or standard next start + if [ -f ".next/standalone/server.js" ]; then + PORT=$SSR_PORT $PM2 start "$NODE" --name "$PM2_NAME_WEBSITE" --cwd "$WORK_DIR/apps/website/.next/standalone" -- server.js + else + PORT=$SSR_PORT $PM2 start "$BUN" --name "$PM2_NAME_WEBSITE" --cwd "$WORK_DIR/apps/website" -- run start + fi + fi + cd "$WORK_DIR" +fi + +# F. Save PM2 state +$PM2 save + +echo "========================================================" +echo "✅ [Foxxio] Deployment Finished Successfully!" +echo "========================================================" +$PM2 status diff --git a/serverinfo/192.168.1.26/foxxio.ddcsprocket.com/nginx/admin.foxxio.ddcsprocket.com.conf b/serverinfo/192.168.1.26/foxxio.ddcsprocket.com/nginx/admin.foxxio.ddcsprocket.com.conf new file mode 100644 index 0000000..3b46dd8 --- /dev/null +++ b/serverinfo/192.168.1.26/foxxio.ddcsprocket.com/nginx/admin.foxxio.ddcsprocket.com.conf @@ -0,0 +1,24 @@ +server { + listen 80; + server_name admin.foxxio.ddcsprocket.com; + + # ตำแหน่งโฟลเดอร์ Build ของ React Admin Panel + root /var/www/html/foxxio_admin; + index index.html; + + # สำคัญมากสำหรับ React Router SPA: + # ถ้าไม่พบไฟล์ ($uri) ให้ส่งกลับไปที่ index.html เสมอ + location / { + try_files $uri $uri/ /index.html; + } + + # ตั้งค่า Cache สำหรับ Static Assets เพื่อความเร็ว + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + expires 30d; + add_header Cache-Control "public, no-transform"; + } + + # Logging + error_log /var/log/nginx/foxxio_admin_error.log; + access_log /var/log/nginx/foxxio_admin_access.log; +}