Line OA Centralizer คือระบบ Webhook Gateway และ API Gateway ส่วนกลางสำหรับบริหารจัดการ LINE Official Accounts (LINE OA) หลายบัญชีพร้อมกัน ทำหน้าที่เป็นจุดรับ Webhook หลักเพียงจุดเดียวขององค์กรหรือระบบงาน แล้วส่งต่อ (Forward) ข้อมูลอย่างปลอดภัยและมีประสิทธิภาพไปยังแอปพลิเคชันหรือ Chatbot ปลายทางได้หลายระบบพร้อมกันในลักษณะขนาน (Parallel Delivery) รวมถึงเปิดจุดบริการส่งข้อความออก (Messaging API Gateway) ให้กับแอปพลิเคชันย่อยอื่น ๆ ได้ผ่านระบบควบคุมสิทธิ์ API Key
- Single Endpoint: รับ Webhook จาก LINE OA ได้ไม่จำกัดด้วยเส้นทางเดียวแบบไดนามิก
/api/webhooks/line/[accountId] - Redis Queue buffering: มีระบบจัดคิวแบบ FIFO ด้วย Redis ช่วยรับ Payload ความเร็วสูง แล้วส่งตอบกลับสถานะ HTTP 200 OK ให้กับเซิร์ฟเวอร์ LINE ได้ภายใน 2 วินาที (ป้องกัน LINE Timeout)
- Parallel Delivery: มี Queue Worker (สเกลได้สูงสุด 4 Replicas) ดึง Event ไปส่งต่อให้กับ Chatbot ปลายทางทุกจุดตามที่ตั้งค่าไว้แบบขนานด้วย
Promise.allSettledหากปลายทางใดเสียหายจะไม่ส่งผลกระทบต่อปลายทางอื่น ๆ
- Auto Sync: เมื่อมีเหตุการณ์ใหม่ (เช่น Follow หรือ Message) เกิดขึ้น Worker จะทำการสืบค้นและอัปเดตข้อมูลโปรไฟล์ผู้ใช้ (
displayName,pictureUrl) หรือสรุปกลุ่มข้อมูลกลุ่ม (groupName) จาก LINE API โดยอัตโนมัติ - Cache Strategy: เก็บข้อมูลลงตารางแคชใน PostgreSQL และจำเกณฑ์ระยะเวลาอัปเดตแคช 7 วัน เพื่อช่วยป้องกันอัตราคำขอเกินขีดจำกัด (Rate Limit) ของฝั่ง LINE API
- แดชบอร์ดสรุปสถิติจำนวน LINE Accounts, API Keys ที่รันอยู่ในระบบ
- สถิติรายวัน (Traffic Volumes): กราฟแท่งบอกปริมาณ Webhook รายวัน 7 วันย้อนหลังพร้อมรายละเอียด Tooltip
- เปอร์เซ็นต์สัดส่วน (Analytics): แผนภูมิสัดส่วนประเภทอีเวนต์ (Event Types) และส่วนแบ่งปริมาณคำขอส่งออกของแต่ละ Sub-App แยกรายโปรเจกต์
- ตารางแสดงผลประวัติ Webhook ล่าสุด 5 รายการ แสดงผลแบบ Mono-font เพื่อความสะดวกรวดเร็วในการก๊อปปี้ User ID หรือ Group ID ไปใช้งานต่อ
- แบ่งสิทธิ์ออกเป็น 2 ระดับด้วยการล็อกอินผ่าน Google OAuth:
- Super Admin: กำหนดตายตัวใน Environment Variable เข้าถึงและจัดการแก้ไขตั้งค่าได้ทุกส่วนของระบบ (รวมถึงจัดการรายชื่อสิทธิ์ Whitelist)
- Whitelisted Admin: บัญชีอีเมลที่ Super Admin เพิ่มลงในตารางสิทธิ์ ซึ่งจะเห็นข้อมูลและจัดการได้เฉพาะ LINE Accounts ที่ได้รับอนุญาตเท่านั้น (Scope Isolation)
- บันทึกประวัติการเรียกใช้งาน (API Calls) และการรับ Webhook แบบละเอียด
- ระบบสืบค้นและตัวกรองที่ยืดหยุ่น: กรองตาม LINE OA, กรองตาม API Key, เลือกเฉพาะประวัติที่ทำงานล้มเหลว (Status Code >= 400 - Error Only), หรือค้นหาด้วย Keyword
- Core Framework: Next.js 14 (App Router สำหรับ Admin Panel & Dynamic API Routes)
- Language: TypeScript
- Database: PostgreSQL (เก็บการตั้งค่า, แคชโปรไฟล์ และประวัติการทำงาน)
- ORM: Drizzle ORM
- Queue Engine: Redis (คิวพักข้อมูล Webhook)
- CSS Framework: Tailwind CSS
- UI Components: Ant Design (Dark Mode theme)
- Reverse Proxy: Cloudflared Tunnel (Cloudflare Tunnel)
ระบบถูกแพ็คเกจโครงสร้างด้วย Docker Compose แยกออกเป็น 4 เซอร์วิสหลัก:
services:
db:
image: postgres:15-alpine
# เก็บข้อมูลการตั้งค่าและประวัติระบบ
redis:
image: redis:7-alpine
# บริหารคิวรับ Event (educ_line_events)
web:
build: .
# Next.js Application สำหรับ Webhook Gateway และ Admin UI
worker:
build: .
# Script Worker รันจำนวน 4 Replicas สำหรับกระจาย Webhook และ Sync Profilesคัดลอกไฟล์ .env.example ไปเป็น .env และกรอกข้อมูลการตั้งค่าระบบ:
cp .env.example .envฟิลด์สำคัญที่ต้องกำหนดค่า:
DATABASE_URL: Connection string ของ PostgreSQL (เช่นpostgresql://user:pass@db:5432/line_centralizer)REDIS_URL: URL ของ Redis (เช่นredis://redis:6379)SUPER_ADMIN_EMAILS: รายชื่อ Gmail ของแอดมินสูงสุด คั่นด้วยจุลภาค (เช่นadmin@example.com,super@example.com)NEXTAUTH_SECRET: คีย์สุ่มความปลอดภัยของ NextAuthGOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET: สำหรับระบบ Google OAuth Authentication
ในการเข้าใช้งานระบบ Admin Panel ผู้ใช้งานที่จะนำโปรเจกต์นี้ไปติดตั้งใหม่ จะต้องสร้าง OAuth Client Credentials จาก Google Cloud Console ตามขั้นตอนดังนี้:
- เข้าไปที่ Google Cloud Console -> สร้างโครงการใหม่ (New Project)
- ตั้งค่าหน้า OAuth consent screen เลือกประเภทผู้ใช้ตามต้องการ (เช่น Internal หากต้องการระบุเฉพาะอีเมลองค์กร หรือ External หากต้องการให้อีเมล Google ทั่วไปล็อกอินได้)
- ไปที่เมนู Credentials -> คลิกปุ่ม Create Credentials -> เลือก OAuth client ID
- เลือกประเภท Application Type เป็น Web application
- ในส่วน Authorized JavaScript origins ให้ระบุโดเมนหลักของระบบ:
- ทดสอบในเครื่อง (Local Dev):
http://localhost:3000 - ใช้งานจริง (Production):
https://line-api.yourdomain.com
- ทดสอบในเครื่อง (Local Dev):
- ในส่วน Authorized redirect URIs ให้ระบุลิงก์ Callback สำหรับ NextAuth (มีรูปแบบลงท้ายด้วย
/api/auth/callback/googleเสมอ):- ทดสอบในเครื่อง (Local Dev):
http://localhost:3000/api/auth/callback/google - ใช้งานจริง (Production):
https://line-api.yourdomain.com/api/auth/callback/google
- ทดสอบในเครื่อง (Local Dev):
- บันทึกและคัดลอกค่า
Client IDและClient Secretไปกรอกลงในไฟล์.envของท่าน - ข้อควรระวังสำหรับการรันจริง (Production):
- ต้องกำหนดตัวแปร
NEXTAUTH_URLในไฟล์.envให้ชี้ไปยัง Domain หลักที่ใช้งานจริง (เช่นhttps://line-api.yourdomain.com) - หากระบบทำงานอยู่หลัง Reverse Proxy (เช่น Cloudflare Tunnel, Nginx) ให้กำหนด
TRUST_HOST=trueเพื่อขจัดปัญหา Google OAuth Redirect URI Mismatch จาก Proxy Headers
- ต้องกำหนดตัวแปร
ใช้ Drizzle Kit เพื่อสร้างและรันสคีมาฐานข้อมูล:
# สร้างชุด Migration SQL
npm run db:generate
# ส่ง Migration ไปรันบนฐานข้อมูลจริง
npm run db:migrateสั่ง Build และเริ่มต้นคอนเทนเนอร์ทั้งหมด (รวมถึงสั่งขยาย replicas ของ worker):
docker compose up -d --build --scale worker=4- Endpoint:
POST /api/webhooks/line/[lineAccountId] - ลักษณะการใช้งาน: นำไปกรอกลงในช่อง Webhook URL ของ LINE Developers บัญชี LINE OA นั้น ๆ
- การส่งต่อ: Payload จะถูกยืนยันลายเซ็น (Signature Verification) แล้วส่งต่อแบบขนานไปยังปลายทางที่ตั้งค่าไว้ในตาราง
line_account_forward_urls
- Endpoint:
POST /api/internal/messages/send - Headers:
Content-Type: application/jsonX-EDUC-Hub-Token: <YOUR_API_KEY_TOKEN>
- Request Body:
{ "lineAccountId": "UUID-of-LINE-Account", "to": "LINE-USER-ID-OR-GROUP-ID", "messages": [ { "type": "text", "text": "ข้อความส่งจากระบบย่อย" } ] }
- Sumatha Panpring (@sumatha-code) - Project Owner & Lead Developer
- Antigravity (AI Coding Assistant by Google DeepMind) - Core Pair Programmer
โปรเจกต์นี้เปิดใช้งานเผยแพร่ภายใต้สัญญาอนุญาต MIT License สามารถนำไปดัดแปลง ใช้งาน และแจกจ่ายต่อได้ฟรีทั้งในรูปแบบส่วนตัวและเชิงพาณิชย์ (ดูรายละเอียดเพิ่มเติมในไฟล์ LICENSE)