เลือกหัวข้ออ่าน
Toggleเก็บแชตลูกค้า วัดเวลาตอบกลับ ดูงานค้างแบบ real-time และให้ AI สรุปปัญหาลูกค้ารายวัน — สำหรับธุรกิจไทยที่ดูแลลูกค้าผ่าน LINE OA และ LINE กลุ่ม
ระบบ open source สำหรับธุรกิจที่ดูแลลูกค้าผ่าน LINE OA หรือ LINE กลุ่ม โดยเปลี่ยนการทำงานจาก "เฝ้าแชต" มาเป็น "บริหารด้วยตัวเลข"
ฟีเจอร์ทั้งหมดออกแบบมาสำหรับธุรกิจที่ใช้ LINE เป็นช่องทางหลักในการดูแลลูกค้า
รับข้อความจาก LINE OA และกลุ่ม LINE แบบ real-time รองรับหลาย OA พร้อมกัน ตรวจ HMAC-SHA256 Signature ป้องกัน request ปลอม ตอบกลับ LINE ภายใน 200ms
บันทึกทุกข้อความ: text, image, sticker, file, audio, video, location พร้อม LINE user ID, group ID, timestamp และ raw event ย้อนหลังได้ตลอด
ตรวจ LINE user ID อัตโนมัติ — ถ้าเป็นพนักงานที่ลงทะเบียนไว้ = ข้อความพนักงาน, ถ้าไม่ใช่ = ข้อความลูกค้า ระบบรู้ทันทีว่ามีคนตอบหรือยัง
รวมข้อความต่อเนื่องเป็นเคสเดียวอัตโนมัติ ถ้าเงียบเกิน 4 ชั่วโมงแล้วมีข้อความใหม่ = ขึ้นเคสใหม่ ปรับเวลาได้ตาม business ของคุณ
First response time / Average response time / Max response time ต่อทุกเคส รู้ว่าช้าหรือเร็วเป็นตัวเลขจริง ไม่ใช่ความรู้สึก
Refresh ทุก 30 วินาที แสดงสถานะทุกกลุ่ม: 🔴 ช้า (slow) / 🟡 รอตอบ (waiting) / 🟢 ปกติ (normal) และสถานะพนักงาน: Active / Idle / Away
ทุกคืน 23:00 AI ดึงแชตทั้งวัน วิเคราะห์ และจัดหมวดปัญหา ดูรายงานในเช้าวันถัดไปผ่านเมนู "สรุปรายวัน" ไม่ต้องอ่านแชตเองทุกกลุ่ม
OpenAI, Claude, Gemini, Mistral, Groq, DeepSeek, OpenRouter ฯลฯ ถ้า provider หลักพัง/quota หมด → ลอง provider ถัดไปอัตโนมัติ ไม่สะดุด
10 หมวดเริ่มต้น เปิด/ปิด หรือตั้งชื่อใหม่ให้ตรงธุรกิจ AI ใช้หมวดนี้จัดกลุ่มปัญหาลูกค้าในรายงานรายวัน
สร้างกลุ่มสิทธิ์ได้เอง กำหนดว่าใครดูเมนูไหนได้บ้าง เจ้าของดูทุกอย่าง / หัวหน้าดู monitor+report / พนักงานดูเฉพาะที่กำหนด
ลูกค้าส่งรูปสินค้า / สลิป / หน้าจอ error ระบบดาวน์โหลดและเก็บใน Cloudflare R2 หรือ AWS S3 พร้อม URL ดูย้อนหลัง
เพิ่ม LINE OA ได้หลายตัว แต่ละ OA มี Channel ID, Secret, Token แยกกัน กลุ่มลูกค้า auto-register ทันทีที่มีข้อความเข้า
ทำงานบน Docker Compose 2 services ผ่าน Traefik เป็น reverse proxy พร้อม SSL อัตโนมัติ
linecrm-api.domain.com → Backend (port 3001)linecrm.domain.com → Admin UI (port 3000)root_default เพื่อให้ service อื่นต่อเข้าได้ตรวจสอบให้ครบก่อนเริ่ม Step แรก
openssl rand -base64 32ทำตามลำดับ Step 1–7 ไม่ข้ามขั้นตอนครับ
# SSH เข้า VPS แล้วรันคำสั่งนี้ mkdir -p ~/apps && cd ~/apps git clone https://github.com/smlsoft/SMLLineCRM.git cd SMLLineCRM # ตรวจสอบว่า folder ครบ ls -la
~/apps/ เพื่อให้จัดการง่าย ถ้ามีโปรเจ็คหลายตัวในอนาคต# สร้าง JWT Secret (32 bytes base64) openssl rand -base64 32 # ตัวอย่างผลลัพธ์ (ของคุณจะต่างกัน): YQuVr7jCtAPxu0dbeZC91mOYScMdXQ57wdlZTsGXrTg= # สร้าง API Key (32 bytes hex) openssl rand -hex 32
0.0.0.0/0 (allow all)mongodb+srv://smluser:YOUR_PASSWORD@cluster.mongodb.net/smllinecrm?retryWrites=true&w=majority # หมายเหตุ: ถ้า password มีอักขระพิเศษ เช่น @ ต้อง URL-encode ก่อน # @ → %40 | # → %23 | $ → %24 | ! → %21
@ ต้องเปลี่ยนเป็น %40 ใน connection string ไม่งั้น URI parser จะงงและ connect ไม่ได้cd ~/apps/SMLLineCRM nano docker-compose.yml
services: backend: image: ghcr.io/smlsoft/smllinecrm-backend:latest environment: - PORT=3001 - NODE_ENV=production - MONGODB_URI=mongodb+srv://user:pass@cluster.mongodb.net/smllinecrm - API_KEY=your-api-key-here - JWT_SECRET=your-jwt-secret-here - CONVERSATION_GAP_HOURS=4 - TZ=Asia/Bangkok - AI_PROVIDER=openrouter - OPENROUTER_API_KEY=sk-or-xxxxxxxxxxxx - OPENROUTER_MODEL=mistralai/mistral-7b-instruct:free - OPENROUTER_BASE_URL=https://openrouter.ai/api/v1 - CRON_CLOSE_CONVERSATIONS=0 22 * * * - CRON_DAILY_EVALUATION=0 23 * * * - EVALUATE_PREVIOUS_DAY=true labels: - traefik.enable=true - traefik.http.routers.smllinecrm-api.rule=Host(`linecrm-api.domain.com`) - traefik.http.routers.smllinecrm-api.entrypoints=websecure - traefik.http.routers.smllinecrm-api.tls.certresolver=mytlschallenge - traefik.http.services.smllinecrm-api.loadbalancer.server.port=3001 restart: unless-stopped networks: - root_default admin: image: ghcr.io/smlsoft/smllinecrm-admin:latest environment: - NODE_ENV=production - BACKEND_URL=http://backend:3001 - API_KEY=your-api-key-here # ต้องตรงกับ backend - JWT_SECRET=your-jwt-secret-here # ต้องตรงกับ backend labels: - traefik.enable=true - traefik.http.routers.smllinecrm.rule=Host(`linecrm.domain.com`) - traefik.http.routers.smllinecrm.entrypoints=websecure - traefik.http.routers.smllinecrm.tls.certresolver=mytlschallenge - traefik.http.services.smllinecrm.loadbalancer.server.port=3000 depends_on: - backend restart: unless-stopped networks: - root_default networks: root_default: external: true # ใช้ network เดียวกับ Traefik
Ctrl+O → Enter → Ctrl+X| ตัวแปร | ค่าตัวอย่าง | หมายเหตุ | สถานะ |
|---|---|---|---|
MONGODB_URI | mongodb+srv://... | Connection string จาก Atlas | จำเป็น |
API_KEY | random-hex-32 | Key สำหรับทุก API request | จำเป็น |
JWT_SECRET | base64-32-bytes | สำหรับ sign JWT token | จำเป็น |
CONVERSATION_GAP_HOURS | 4 | ชั่วโมงที่ถือว่าเป็นเคสใหม่ | ปรับได้ |
AI_PROVIDER | openrouter | ตั้ง provider หลัก | ปรับได้ |
OPENROUTER_API_KEY | sk-or-... | API key จาก openrouter.ai | จำเป็น (ถ้าใช้ AI) |
CRON_DAILY_EVALUATION | 0 23 * * * | เวลารัน AI สรุปรายวัน | ปรับได้ |
TZ | Asia/Bangkok | Timezone สำหรับ cron และ log | ปรับได้ |
| Type | Name | Value | TTL |
|---|---|---|---|
| A | linecrm | IP ของ VPS เช่น 72.60.195.159 | Auto |
| A | linecrm-api | IP ของ VPS เช่น 72.60.195.159 | Auto |
# อยู่ใน folder ~/apps/SMLLineCRM cd ~/apps/SMLLineCRM # ดาวน์โหลด images ล่าสุด docker compose pull # รัน services ในโหมด background docker compose up -d # ตรวจสอบสถานะ docker compose ps
NAME STATUS PORTS smllinecrm-backend-1 Up (ไม่มี port เพราะใช้ network ของ Traefik) smllinecrm-admin-1 Up
# ดู logs backend — ต้องเห็นบรรทัดเหล่านี้
docker compose logs backend --tail=20
[DB] MongoDB connected
[AdminUser] Seeded default superadmin user
[MasterIdCache] Loaded 0 employees
[OaRegistry] Loaded 0 LINE OAs
[Scheduler] Cron jobs scheduled
[App] LINE KPI System running on port 3001
[DB] MongoDB disconnected ให้ตรวจ MONGODB_URI — ดูว่า URL-encode อักขระพิเศษใน password ครบไหม และ IP ของ VPS อยู่ใน Atlas Network Access list หรือยังhttps://linecrm-api.domain.com/webhook/YOUR_CHANNEL_ID # ตัวอย่าง: Channel ID คือ 2010553888 https://linecrm-api.sara-n8n.work/webhook/2010553888
curl https://linecrm-api.domain.com/health ก่อน ถ้าได้ JSON กลับมา = backend ทำงานปกติ แล้วตรวจ Channel ID อีกครั้ง# ทดสอบ Backend health curl https://linecrm-api.domain.com/health # ทดสอบ Admin UI # เปิด browser: https://linecrm.domain.com # ควรเห็นหน้า Login # ดู logs real-time docker compose logs -f
docker compose logs backend -f → ควรเห็น log การรับข้อความเข้ามาหลัง deploy สำเร็จ ทำตามลำดับนี้ใน https://linecrm.domain.com
https://linecrm.domain.com → Login ด้วย superadmin / superadminsuperadmin เป็น default ที่ทุกคนรู้| ช่อง | ค่าที่ต้องกรอก | หาได้จาก |
|---|---|---|
| ชื่อ OA | ตั้งเองได้ เช่น "OA หลัก" | ตั้งเอง |
| Channel ID | ตัวเลข เช่น 2010553888 | LINE Developers → Basic Settings |
| Channel Secret | string 32 ตัว | LINE Developers → Basic Settings |
| Channel Access Token | token ยาว ๆ | LINE Developers → Messaging API → Issue |
U ตามด้วย 32 ตัวอักษรdocker compose logs backend -fเมนูทั้งหมด 11 หน้า แต่ละหน้าใช้ทำอะไร และควรดูบ่อยแค่ไหน
| เมนู | หน้าที่ | ใช้บ่อย | ใครควรดู |
|---|---|---|---|
| 📊 แดชบอร์ด | ภาพรวม KPI วันนี้ — จำนวนเคส, ข้อความ, response time รวม | ทุกวัน | เจ้าของ, หัวหน้าทีม |
| 🖥️ จอ Monitor | ดูสถานะทุกกลุ่มแบบ real-time, สถานะพนักงาน — refresh ทุก 30 วินาที | ตลอดเวลา | หัวหน้าทีม, แอดมิน |
| 💬 บทสนทนา | ประวัติเคสทั้งหมด ค้นหาย้อนหลัง ดูว่าใครตอบอะไรเมื่อไหร่ | ทุกวัน | ทุกคน |
| 📋 สรุปรายวัน | รายงาน AI ที่วิเคราะห์แชตคืนก่อน — หมวดปัญหา, สถิติทีม | ทุกเช้า | เจ้าของ, หัวหน้าทีม |
| 👥 กลุ่มลูกค้า | กลุ่ม LINE ที่ OA อยู่ด้วย auto-register ทันทีที่มีข้อความเข้า | รายสัปดาห์ | แอดมิน |
| 🤖 LINE OA | จัดการ LINE OA ที่เชื่อมกับระบบ เพิ่ม/แก้ไข/เปิดปิด | ตั้งค่า | แอดมิน |
| 👤 พนักงาน | ลงทะเบียน LINE User ID พนักงาน แก้ไข เปิด/ปิดสถานะ | เมื่อมีการเปลี่ยนแปลง | HR, แอดมิน |
| 🏷️ ประเภทปัญหา | หมวดหมู่ที่ AI ใช้จัดกลุ่มปัญหาลูกค้า เปิด/ปิด แก้ชื่อได้ | ตั้งค่า | เจ้าของ |
| ⚙️ ตั้งค่าระบบ | จัดการ AI Provider Groups, Task Routing, Cron Jobs, Media Storage | ตั้งค่า | IT, แอดมิน |
| 👨💼 ผู้ใช้งาน | จัดการ Admin users ของระบบ เพิ่ม/แก้ไข/เปิดปิด กำหนดกลุ่มสิทธิ์ | ตั้งค่า | superadmin |
| 🔐 กลุ่มสิทธิ์ | สร้าง permission groups กำหนดว่าแต่ละกลุ่มดูเมนูไหนได้บ้าง | ตั้งค่า | superadmin |
| สถานะ | เกณฑ์ | ความหมาย |
|---|---|---|
| 🟢 Active | ตอบภายใน 30 นาที | ทำงานอยู่ |
| 🟡 Idle | 30–120 นาที | เริ่มเงียบ |
| ⚫ Away | มากกว่า 120 นาที | ออกไปแล้ว |
| เวลา | งาน |
|---|---|
22:00 ทุกคืน | ปิดเคสค้างที่ไม่มีกิจกรรม |
23:00 ทุกคืน | AI วิเคราะห์แชตทั้งวัน สรุปปัญหา |
คำสั่ง Docker Compose สำหรับดูแลระบบประจำวัน
# ดูสถานะ containers ทั้งหมด docker compose ps # ดู resource (CPU/RAM) real-time docker stats # ตรวจ health endpoint curl http://localhost:3102/health
# ดู logs backend แบบ real-time docker compose logs backend -f # ดู logs 50 บรรทัดล่าสุด docker compose logs backend --tail=50 # ดู logs ทุก service docker compose logs -f
# Restart ทุก service docker compose restart # Restart เฉพาะ backend docker compose restart backend # อัปเดตเป็น version ใหม่ docker compose pull docker compose up -d
# หยุดระบบ (ข้อมูลไม่หาย) docker compose down # เริ่มใหม่ docker compose up -d # หยุดพร้อมลบ volumes (ระวัง!) docker compose down -v
# เข้าไปใน backend container docker compose exec backend sh # ดู environment variables docker compose exec backend env # ดู network ที่ container ใช้ docker network ls
# ลบ images เก่าที่ไม่ใช้ docker image prune -f # Auto-update ทุกอาทิตย์ (crontab) crontab -e 0 3 * * 0 cd ~/apps/SMLLineCRM && \ docker compose pull && \ docker compose up -d
curl https://linecrm-api.domain.com/health — ถ้าไม่ได้ JSON แปลว่า backend ยังไม่ขึ้นroot_default network มีอยู่จริง (docker network ls)docker compose logs backend --tail=30
@ ต้องเป็น %40, # ต้องเป็น %23/smllinecrm หรือไม่
docker compose logs backend -f แล้วส่งข้อความดู
/webhook/OA_ID_1 และ /webhook/OA_ID_2
letsencrypt ให้แก้ทุก label ที่มี mytlschallenge ให้ตรงกัน ตรวจสอบจาก Traefik config ของคุณ
docker compose logs backend -f → ดูบรรทัดที่มี lineUserId → ค่านั้นขึ้นต้นด้วย U ตามด้วย 32 ตัวอักษร
| # | งาน | ทำที่ไหน | สถานะ |
|---|---|---|---|
| 1 | Clone repository | VPS terminal | ☐ ทำแล้ว |
| 2 | สร้าง JWT Secret + API Key | VPS terminal | ☐ ทำแล้ว |
| 3 | ตั้งค่า MongoDB Atlas + รับ connection string | atlas.mongodb.com | ☐ ทำแล้ว |
| 4 | สร้าง docker-compose.yml ใส่ค่าครบ | VPS terminal | ☐ ทำแล้ว |
| 5 | เพิ่ม DNS A record 2 subdomains | DNS provider | ☐ ทำแล้ว |
| 6 | docker compose pull && up -d | VPS terminal | ☐ ทำแล้ว |
| 7 | logs backend → MongoDB connected | VPS terminal | ☐ ทำแล้ว |
| 8 | ตั้ง LINE Webhook URL + Verify | LINE Developers Console | ☐ ทำแล้ว |
| 9 | Login Admin + เปลี่ยนรหัส superadmin | Admin Dashboard | ☐ ทำแล้ว |
| 10 | ตั้งค่า AI Provider + Task Routing + ทดสอบ | Admin → ตั้งค่าระบบ | ☐ ทำแล้ว |
| 11 | เพิ่ม LINE OA + ใส่ credentials ครบ | Admin → LINE OA | ☐ ทำแล้ว |
| 12 | เพิ่มพนักงานทุกคน + LINE User ID | Admin → พนักงาน | ☐ ทำแล้ว |
| 13 | ปรับหมวดปัญหาให้ตรงธุรกิจ | Admin → ประเภทปัญหา | ☐ ทำแล้ว |
| 14 | ทดสอบส่งข้อความจริง → เห็นใน Monitor | LINE + Admin | ☐ ทำแล้ว |
| 15 | เปิด Cron Job AI รายวัน | Admin → ตั้งค่าระบบ | ☐ ทำแล้ว |
เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า
คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น
ยอมรับทั้งหมดประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้
คุกกี้ประเภทนี้จะทำการเก็บข้อมูลการใช้งานเว็บไซต์ของคุณ เพื่อเป็นประโยชน์ในการวัดผล ปรับปรุง และพัฒนาประสบการณ์ที่ดีในการใช้งานเว็บไซต์ ถ้าหากท่านไม่ยินยอมให้เราใช้คุกกี้นี้ เราจะไม่สามารถวัดผล ปรับปรุงและพัฒนาเว็บไซต์ได้
รายละเอียดคุกกี้
คุกกี้ประเภทนี้จะเก็บข้อมูลต่าง ๆ รวมทั้งข้อมูลส่วนบุคคลเกี่ยวกับตัวคุณเพื่อเราสามารถนำมาวิเคราะห์ และนำเสนอเนื้อหา ให้ตรงกับความเหมาะสมกับความสนใจของคุณ ถ้าหากคุณไม่ยินยอมเราจะไม่สามารถนำเสนอเนื้อหาและโฆษณาได้ไม่ตรงกับความสนใจของคุณ
รายละเอียดคุกกี้