PaynEat POSคู่มือติดตั้ง
เปิดร้านบน PaynEat POS ใน 4 ทาง
เลือกทางที่ตรงกับคุณแล้วทำตามทีละขั้น ไม่ต้องสมัคร ไม่มีค่าใช้จ่าย และข้อมูลร้านอยู่บนเครื่องของคุณเอง
- ฟรี · Apache 2.0
- ไม่ต้องสมัครสมาชิก
- ใช้เครื่องที่ร้านมีอยู่
คุณอยากทำอะไร?
ยังไม่แน่ใจ เริ่มจากทางแรกก่อน — ลองกดดูจนพอใจแล้วค่อยติดตั้งจริงก็ได้
ลองในเบราว์เซอร์
เปิดเดโม- แนะนำ
Windows บรรทัดเดียว
ดูวิธีติดตั้ง Docker ให้หลายเครื่องใช้ร่วมกัน
ดูวิธีติดตั้งรันจากโค้ด
ดูวิธีรัน
ติดตั้งบน Windows ด้วยบรรทัดเดียว
ได้ระบบตัวจริงครบ ทั้งเซิร์ฟเวอร์ การอัปเดตสดข้ามหน้าต่าง ตาชั่งจำลอง และใบเสร็จ PDF โดยไม่ต้องดาวน์โหลดโค้ดหรือ build เอง เพราะตัวติดตั้งโหลดชุดที่ build ไว้แล้วมาให้
- ใช้เวลา
- 3–5 นาที (ดาวน์โหลดครั้งแรกราว 200 MB)
- ต้องมี
- Windows 64 บิต + Docker Desktop
- ได้อะไร
- ระบบเปิดที่ http://localhost:8080 บนเครื่องนี้
ติดตั้งและเปิด Docker Desktop
ยังไม่มี ดาวน์โหลดได้ที่ docker.com ติดตั้งแล้วเปิดโปรแกรม รอจนมุมซ้ายล่างขึ้นคำว่า Engine running
เปิด PowerShell
กดปุ่ม Windows พิมพ์ PowerShell แล้วกด Enter
วางบรรทัดนี้แล้วกด Enter
กดปุ่ม คัดลอก ที่มุมกล่อง แล้วคลิกขวาในหน้าต่าง PowerShell เพื่อวาง
PowerShell[Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object Net.WebClient).DownloadString('https://github.com/SuruchBoss/PaynEat/releases/download/demo/install-demo.ps1'))รอสักครู่ แล้วเข้าสู่ระบบ
เบราว์เซอร์จะเปิด http://localhost:8080 ให้เอง เข้าด้วย
admin/admin123หรือแตะปุ่มบัญชีทดลองบนหน้าเข้าสู่ระบบ
✅PowerShell ขึ้นข้อความสีเขียว PaynEat is ready: http://localhost:8080 และเบราว์เซอร์เปิดหน้าเข้าสู่ระบบ
ใช้งานวันต่อไป
- เปิด / ปิด / ล้างข้อมูล
- ในโฟลเดอร์ PaynEat-Demo ของผู้ใช้ มีไฟล์ดับเบิลคลิก Start, Stop และ Reset PaynEat data (Reset = ลบบิลที่ลองทำทั้งหมด กลับเป็นข้อมูลตัวอย่าง)
- เปิดเครื่องใหม่
- เปิด Docker Desktop แล้วระบบขึ้นเอง
- อัปเดตเป็นรุ่นล่าสุด
- วางบรรทัดเดิมซ้ำ ข้อมูลที่ทำไว้ยังอยู่
⚠️ ตั้งค่าไว้สำหรับทดลองเท่านั้น (บัญชีทดลอง ตาชั่งจำลอง อีเมลไม่ส่งออกจริง) และเปิดได้บนเครื่องนี้เครื่องเดียว — ถ้าจะให้มือถือหรือแท็บเล็ตในร้านต่อเข้ามาด้วย ใช้ทางที่ 3 · อยากอ่านสิ่งที่สคริปต์ทำก่อนวาง: install-demo.ps1
รันด้วย Docker ให้ทุกเครื่องในร้านต่อเข้ามา
เซิร์ฟเวอร์อยู่บนคอมพิวเตอร์เครื่องเดียวในร้าน แล้วมือถือพนักงาน แท็บเล็ตแคชเชียร์ และจอครัวเปิดผ่านเบราว์เซอร์ ออเดอร์ที่สั่งจากเครื่องหนึ่งจะขึ้นจอครัวอีกเครื่องทันที
- ใช้เวลา
- 10–15 นาทีครั้งแรก (ครั้งต่อไปไม่ถึงนาที)
- ต้องมี
- Docker Desktop บน Windows, Mac หรือ Linux
- ได้อะไร
- ระบบเปิดที่ http://<IP ของเครื่อง>:8080 จากทุกเครื่องใน Wi-Fi เดียวกัน
ดาวน์โหลดโค้ด
ง่ายสุด: ดาวน์โหลดไฟล์ ZIP แล้วแตกไฟล์ จะได้โฟลเดอร์
PaynEat-main· ถ้ามี git ใช้คำสั่งนี้แทนได้Terminalgit clone https://github.com/SuruchBoss/PaynEat.gitหา IP ของเครื่องนี้
Windows: เปิด PowerShell พิมพ์
ipconfigดูบรรทัด IPv4 Address · Mac/Linux:ifconfig | grep inet— จะได้เลขหน้าตาแบบ192.168.1.15ตั้งรหัสลับของเซิร์ฟเวอร์
สร้างไฟล์ชื่อ
.envไว้ในโฟลเดอร์โค้ด (ข้างไฟล์docker-compose.yml) ที่มีบรรทัดJWT_SECRET=ตามด้วยค่าสุ่มของร้าน — ถ้าไม่มีบรรทัดนี้ ระบบจะไม่เริ่มทำงานและบอกวิธีตั้ง · Mac/Linux ใช้คำสั่งด้านล่าง · Windows PowerShell ใช้("JWT_SECRET=" + [guid]::NewGuid().ToString("N") + [guid]::NewGuid().ToString("N")) | Out-File -Encoding ascii .envTerminal (Mac/Linux)echo "JWT_SECRET=$(openssl rand -hex 32)" > .envบอกแอปว่าเซิร์ฟเวอร์อยู่ที่ไหน
เพิ่มบรรทัดนี้ในไฟล์
.envเดิม โดยเปลี่ยนเลขเป็น IP ของคุณ — ข้ามขั้นนี้ได้ถ้าจะใช้แค่เครื่องนี้เครื่องเดียว.envAPI_BASE_URL=http://192.168.1.15:3000สั่งให้ระบบเริ่มทำงาน
เปิด Terminal (Windows: PowerShell) ในโฟลเดอร์โค้ด แล้วรันคำสั่งนี้ — ครั้งแรกรอ 5–10 นาทีเพราะต้อง build แอปให้
Terminaldocker compose up --buildเปิดจากทุกเครื่องในร้าน
ต่อ Wi-Fi เดียวกันแล้วเปิด http://192.168.1.15:8080 (ใช้ IP ของคุณ) บนมือถือ แท็บเล็ต หรือจอครัว บนเครื่องเซิร์ฟเวอร์เองเปิด http://localhost:8080 ได้เลย
✅Terminal ขึ้นชื่อ payneat-api และ payneat-web แล้วเปิด http://localhost:3000/health ได้ผลตอบกลับ
ใช้งานวันต่อไป
- ปิดระบบ
- กด Ctrl+C ในหน้าต่าง Terminal แล้วรัน
docker compose down - ล้างข้อมูลเริ่มใหม่
docker compose down -v(ลบบิลและข้อมูลทั้งหมด)- เปิดตาชั่งจำลองและอีเมลทดสอบ
- เพิ่ม
SCALE_DRIVER=simulatorและMAIL_TRANSPORT=jsonในไฟล์.envเดิม แล้วรันdocker compose up --buildใหม่ (อย่าใช้ simulator ในร้านจริง)
💡 เครื่องอื่นเปิดไม่ขึ้น: ตรวจว่าอยู่ Wi-Fi เดียวกัน และไฟร์วอลล์ของเครื่องเซิร์ฟเวอร์ยอมให้เข้าพอร์ต 8080 กับ 3000 · ก่อนเปิดให้พนักงานใช้จริง ทำเช็คลิสต์ก่อนใช้จริงให้ครบ
รันจากโค้ดบนเครื่องตัวเอง
เหมาะกับการแก้โค้ด ดู log ทีละคำขอ หรือรันบนมือถือจริงผ่าน Flutter
- ใช้เวลา
- ประมาณ 5 นาที
- ต้องมี
- Node.js 20 ขึ้นไป (แนะนำ 22) + Flutter 3.35 ขึ้นไป
- ได้อะไร
- API ที่ http://localhost:3000 และแอปใน Chrome
ดาวน์โหลดโค้ด
Terminalgit clone https://github.com/SuruchBoss/PaynEat.git cd PaynEatหน้าต่างที่ 1 — เซิร์ฟเวอร์
ไฟล์
.envมีJWT_SECRETสำหรับรันในเครื่อง ไม่มีไฟล์นี้เซิร์ฟเวอร์จะไม่ยอมเริ่ม (Windows ใช้copyแทนcp) ฐานข้อมูลและข้อมูลตัวอย่างถูกสร้างให้เองTerminal 1cd backend npm install cp .env.example .env npm run devหน้าต่างที่ 2 — แอป
เปิดหน้าต่างใหม่ อย่าปิดหน้าต่างแรก
Terminal 2cd app flutter pub get flutter run -d chrome
✅หน้าต่างที่ 1 ขึ้นบรรทัดที่มี PaynEat POS API listening on http://localhost:3000 และ Chrome เปิดหน้าเข้าสู่ระบบ
ทางลัดที่ใช้บ่อย
- ดูแอปอย่างเดียว ไม่ต้องมีเซิร์ฟเวอร์
flutter run -d chrome --dart-define=DEMO_MODE=true(ข้อมูลจำลองในเครื่อง รีเซ็ตเมื่อรีเฟรช)- รันบนมือถือจริงใน Wi-Fi เดียวกัน
flutter run --dart-define=API_BASE_URL=http://<IP ของคอม>:3000- Android emulator
- ชี้ไปที่
10.0.2.2:3000ให้เอง ไม่ต้องตั้งค่า - รันเทสต์
cd backend && npm test·cd app && flutter test
รายละเอียดสถาปัตยกรรม API และเทสต์ทั้งหมดอยู่ใน README
สำรองและกู้คืนข้อมูล
ข้อมูลทั้งร้านอยู่ในไฟล์เดียวบนเครื่องเซิร์ฟเวอร์ ระบบสำรองให้เองหลังปิดกะ ทุก 6 ชั่วโมงที่มีข้อมูลเปลี่ยน และก่อนอัปเดต ดูสถานะได้ที่หน้าตั้งค่าของผู้ดูแลระบบ ถ้าไม่ได้สำรองสำเร็จเกิน 26 ชั่วโมง เจ้าของร้านและผู้จัดการจะเห็นแถบเตือนบนหน้าหลัก
- เก็บที่ไหน
- data/backups ข้างฐานข้อมูล และที่เก็บชุดที่สองที่คุณตั้ง
- เก็บนานแค่ไหน
- ทุกไฟล์ใน 48 ชั่วโมง และวันละไฟล์ย้อนหลัง 30 วัน
- กู้คืนอย่างไร
- พิมพ์คำสั่งบนเครื่องเซิร์ฟเวอร์ ไม่มีปุ่มกู้คืนในแอป

ตั้งที่เก็บชุดที่สองบนอีกดิสก์
ชุดแรกอยู่ดิสก์เดียวกับฐานข้อมูล ถ้าดิสก์เสียจะเสียทั้งคู่ เสียบ USB drive หรือใช้โฟลเดอร์บน NAS ในร้าน แล้วเพิ่มบรรทัดนี้ในไฟล์
backend/.env(เปลี่ยนเป็นโฟลเดอร์ของคุณ) แล้วเปิดเซิร์ฟเวอร์ใหม่backend/.env (รันจากโค้ด)BACKUP_COPY_DIR=E:\PaynEat-backupDocker: ให้ชุดที่สองออกไปนอกคอนเทนเนอร์
เปิดบรรทัด
- /mnt/usb-backup/payneat:/backup-copyใต้volumes:ของapiในdocker-compose.yml(เปลี่ยนส่วนหน้าเครื่องหมาย:เป็นโฟลเดอร์ของคุณ บน Linux ให้ผู้ใช้ uid 1000 เขียนได้:sudo chown 1000:1000 /mnt/usb-backup/payneat) เพิ่มบรรทัดนี้ในไฟล์.envแล้วรันdocker compose up -d.env (Docker)BACKUP_COPY_DIR=/backup-copyลองสำรองหนึ่งครั้ง
เข้าสู่ระบบด้วยบัญชีผู้ดูแลระบบ ไปที่ ตั้งค่า → สำรองข้อมูล แล้วกด สำรองข้อมูลตอนนี้ ที่เก็บทั้งสองที่ต้องขึ้นเครื่องหมายถูกสีเขียว
กู้คืน: หยุดเซิร์ฟเวอร์ก่อน
คำสั่งกู้คืนไม่ยอมทำงานระหว่างเซิร์ฟเวอร์เปิดอยู่ · รันจากโค้ด: กด Ctrl+C ในหน้าต่างเซิร์ฟเวอร์ · Docker: ใช้คำสั่งด้านล่างในโฟลเดอร์โค้ด
Terminal (Docker)docker compose stop apiเลือกไฟล์ที่จะกู้
ชื่อไฟล์บอกเวลาและเหตุผล เช่น
payneat-2026-09-29T221530+0700-shift-close.sqliteคือไฟล์หลังปิดกะ 22:15 น. ของวันที่ 29 · รันจากโค้ด: ดูในโฟลเดอร์backend/data/backups· Docker: ดูรายชื่อด้วยคำสั่งนี้Terminal (Docker)docker compose run --rm api ls data/backupsสั่งกู้คืน
รันจากโค้ด:
cd backendแล้วnpm run db:restore -- data/backups/<ชื่อไฟล์>· Docker: คำสั่งด้านล่าง · ระบบตรวจว่าไฟล์ไม่เสียก่อน และสำรองข้อมูลปัจจุบันเป็นไฟล์pre-restoreไว้ให้เสมอ ถ้ากู้ผิดไฟล์จึงย้อนกลับได้Terminal (Docker)docker compose run --rm api npm run db:restore -- data/backups/payneat-2026-09-29T221530+0700-shift-close.sqliteเปิดเซิร์ฟเวอร์อีกครั้ง
รันจากโค้ด:
npm start(หรือnpm run dev) · Docker: คำสั่งด้านล่างTerminal (Docker)docker compose start api
✅คำสั่งกู้คืนพิมพ์ Restored … from … พร้อมชื่อไฟล์ pre-restore และหน้าประวัติการทำรายการมีรายการ กู้คืนข้อมูลจากไฟล์สำรอง
ถ้าคำสั่งไม่ยอมกู้คืน
- The PaynEat server is still running
- หยุดเซิร์ฟเวอร์ก่อน ถ้าเครื่องเพิ่งดับไปเอง (เช่น ไฟดับ) รอ 30 วินาทีแล้วลองใหม่
- The backup file is damaged
- ไฟล์นี้เสีย เลือกไฟล์ก่อนหน้า หรือไฟล์ชื่อเดียวกันจากที่เก็บชุดที่สอง
- made by a newer PaynEat
- ไฟล์มาจาก PaynEat รุ่นใหม่กว่า อัปเดต PaynEat ก่อนแล้วกู้อีกครั้ง
🔒 ไฟล์สำรองมีเบอร์โทรลูกค้าและรหัสผ่านพนักงานที่เข้ารหัสแล้ว เก็บ USB drive ไว้ในที่ล็อกได้ อย่าแชร์หรืออัปโหลดขึ้นคลาวด์ · ตัวติดตั้ง Windows บรรทัดเดียว (เดโม): ใช้คำสั่ง Docker ชุดเดียวกันใน PowerShell โดยเพิ่ม -f "$env:USERPROFILE\PaynEat-Demo\docker-compose.yml" ต่อจาก docker compose
เข้าสู่ระบบด้วยบทบาทไหนก็ได้
หน้าเข้าสู่ระบบมีปุ่มบัญชีทดลองทุกบทบาท แตะครั้งเดียวเข้าได้เลย ไม่ต้องพิมพ์
| บทบาท | ชื่อผู้ใช้ | รหัสผ่าน | เห็นอะไรบ้าง |
|---|---|---|---|
| ผู้ดูแลระบบ | admin | admin123 | ทุกอย่าง — แดชบอร์ด เมนู พนักงาน รายงาน ตั้งค่า |
| ผู้จัดการ | manager | manager123 | เหมือนผู้ดูแลระบบ แต่ลบบัญชีผู้ใช้ไม่ได้ |
| พนักงานเสิร์ฟ | waiter1 | waiter123 | ผังโต๊ะ ออเดอร์ จอครัว |
| ครัว | kitchen | kitchen123 | จอครัวอย่างเดียว |
| แคชเชียร์ | cashier | cashier123 | ผังโต๊ะ ออเดอร์ รายงาน |
| พนักงานเสิร์ฟ 2 สาขา | waiter2 | waiter123 | เหมือน waiter1 แต่เลือกสาขาได้ — ต้องพิมพ์เอง และใช้ได้เมื่อต่อเซิร์ฟเวอร์จริง (ทางที่ 2–4) |
เช็คลิสต์ก่อนเปิดให้พนักงานใช้งานจริง
บัญชีทดลองและรหัสผ่านข้างบนเผยแพร่อยู่บนอินเทอร์เน็ต ระบบจึงกันไว้ให้แล้ว: ถ้าตั้งเป็นโหมดใช้งานจริงแต่ยังใช้รหัสทดลอง เซิร์ฟเวอร์จะไม่ยอมเปิด
รายละเอียดทุกข้อและวิธีแจ้งช่องโหว่อยู่ใน SECURITY.md
- ตั้ง
JWT_SECRETเป็นค่าสุ่มของร้านเอง เช่นจากคำสั่งopenssl rand -hex 32— ถ้าตั้งNODE_ENV=productionแต่ใช้ค่าตัวอย่างหรือค่าที่สั้นกว่า 32 ตัวอักษร เซิร์ฟเวอร์จะไม่ยอมเปิด - ตั้งรหัสผ่านบัญชีเริ่มต้นเองครบทั้ง 6 ตัว (
SEED_ADMIN_PASSWORD…SEED_CASHIER_PASSWORD) หรือปิดAUTO_SEEDแล้วสร้างบัญชีพนักงานจริงเอง - ตั้ง
CORS_ORIGINเป็นที่อยู่จริงของร้านแทน* - เก็บไฟล์ฐานข้อมูลและไฟล์
.envไว้ในเครื่องร้าน อย่าอัปโหลดหรือแชร์ออกไป · ตั้งBACKUP_COPY_DIRไปที่อีกดิสก์ และลองกู้คืนหนึ่งครั้งก่อนเปิดร้าน ตามหัวข้อสำรองและกู้คืนข้อมูล - ไม่ใช้ตัวติดตั้งบรรทัดเดียวบน Windows กับร้านจริง เพราะตั้งค่าไว้สำหรับทดลอง
- ถ้าเชื่อมต่อ PaynEat ERP ใช้ที่อยู่
https://— ระบบไม่ส่ง credential ของเครื่องผ่านhttp://ยกเว้นไปเครื่องเดียวกัน และห้ามตั้งERP_ALLOW_INSECURE_HTTPนอกเครือข่ายปิด · ERP ใช้ใบรับรองจาก CA ภายในของเชน: ดูหัวข้อแก้ปัญหา "ใบรับรอง HTTPS ของ PaynEat ERP ไม่น่าเชื่อถือ"
ติดตรงไหน กดดูวิธีแก้
ขึ้นว่า "port is already allocated"
มีโปรแกรมอื่นใช้พอร์ต 3000 หรือ 8080 อยู่ ปิดโปรแกรมนั้น (หรือระบบ PaynEat ที่เปิดค้างไว้) แล้วลองใหม่
ขึ้นว่า "Docker Desktop is not running" หรือ "is not installed"
ยังไม่ได้ติดตั้งหรือยังไม่ได้เปิด Docker Desktop — ติดตั้งจาก docker.com เปิดโปรแกรม รอจนมุมซ้ายล่างขึ้น Engine running แล้ววางบรรทัดเดิมอีกครั้ง
ขึ้นว่า "PaynEat started but is not answering yet"
ระบบเปิดแล้วแต่ยังตอบไม่ทัน รออีกครู่แล้วเปิด http://localhost:8080 ถ้ายังไม่ขึ้น ดูสาเหตุที่ Docker Desktop → Containers → payneat
Docker ค้างนานที่ขั้น Flutter
ครั้งแรกต้องดาวน์โหลด Flutter SDK ประมาณ 2 GB รอให้จบ 5–10 นาที ครั้งต่อไปใช้ของที่โหลดไว้
เปิดหน้าเว็บได้ แต่เข้าสู่ระบบไม่ได้
เปิด http://localhost:3000/health ถ้าไม่ขึ้นแปลว่าเซิร์ฟเวอร์ยังไม่ทำงาน · ถ้าตั้ง API_BASE_URL ไว้ ตรวจว่า IP ถูกและรัน docker compose up --build ใหม่หลังแก้
มือถือหรือแท็บเล็ตต่อไม่ได้
ต้องอยู่ Wi-Fi เดียวกับเครื่องเซิร์ฟเวอร์ ใช้ IP ไม่ใช่ localhost และไฟร์วอลล์ต้องยอมพอร์ต 8080 กับ 3000
Docker ขึ้นว่า "required variable JWT_SECRET is missing a value"
ยังไม่ได้ตั้งรหัสลับของเซิร์ฟเวอร์ — สร้างไฟล์ .env ข้าง docker-compose.yml ตามขั้น "ตั้งรหัสลับของเซิร์ฟเวอร์" ในทางที่ 3 แล้วรันใหม่
ขึ้นว่า "ต้องตั้งค่า JWT_SECRET"
ยังไม่ได้สร้างไฟล์ .env — รัน cp .env.example .env ในโฟลเดอร์ backend (Windows: copy) แล้ว npm run dev ใหม่
หน้าตั้งค่าขึ้นว่า "ที่อยู่ของ PaynEat ERP ต้องขึ้นต้นด้วย https://"
credential ของเครื่องส่งผ่าน https:// เท่านั้น — ขอที่อยู่ https:// ของ ERP จากผู้ดูแล ERP · ที่อยู่ http:// ใช้ได้เฉพาะ ERP ที่รันในเครื่องเดียวกัน (localhost) · ร้านที่เชื่อมต่อด้วย http:// ไว้ก่อนอัปเดต ระบบหยุดส่ง credential แล้ว ให้บันทึกที่อยู่ https:// ใหม่พร้อม credential ที่หน้าตั้งค่า
หน้าตั้งค่าขึ้นว่า "ใบรับรอง HTTPS ของ PaynEat ERP ไม่น่าเชื่อถือ"
เครื่องเซิร์ฟเวอร์ POS ยังไม่เชื่อ CA ที่ออกใบรับรองให้ ERP ของเชน — ขอไฟล์ CA (PEM) จากผู้ดูแล ERP · ตรวจก่อนว่าต่อได้: curl --cacert chain-ca.pem https://ที่อยู่ของ-erp/health ต้องได้ "status":"ok" · จากนั้นเริ่มเซิร์ฟเวอร์ POS ใหม่โดยมี NODE_EXTRA_CA_CERTS=/ที่อยู่/chain-ca.pem ใน environment (ใส่ในไฟล์ backend/.env ไม่ได้ผล เพราะ Node อ่านค่านี้ตอนเริ่มก่อนโหลดไฟล์) · Docker: mount ไฟล์ CA เข้าคอนเทนเนอร์ api แล้วตั้งค่านี้ใน docker-compose.override.yml · ห้ามปิดการตรวจใบรับรอง
npm install ล้มที่ better-sqlite3
ขาดเครื่องมือ build · macOS: xcode-select --install · Linux: sudo apt install build-essential python3 · Windows: ติดตั้ง Visual Studio Build Tools
อยากล้างข้อมูลเริ่มใหม่
ทางที่ 2: ดับเบิลคลิก Reset PaynEat data · ทางที่ 3: docker compose down -v · ทางที่ 4: cd backend && npm run db:reset
ยังติดอยู่?ถามได้ที่ GitHub Issues หรือ LinkedIn — บอกทางที่ใช้ ระบบปฏิบัติการ และข้อความที่ขึ้นบนจอ