A10 · VPS: ตั้ง · สำรอง · ย้าย · ขึ้นบัญชีใหม่
▶ clip: https://youtu.be/ongq5eu4F8A
จบบทนี้แล้วทำได้:
- อธิบายได้ว่าทำไมระบบสำรองที่ดีให้เครื่องเราเป็นฝ่ายดึงจาก VPS และต้องเก็บ folder ไหนของ terminal
- เรียงขั้นตอนย้ายเครื่องได้ถูก และบอกได้ว่าสลับขั้นไหนแล้วพัง
- บอกได้ว่าอะไรในระบบ VPS ที่ยังไม่พิสูจน์ และต้องซ้อมก่อนใช้จริง
- สำรอง terminal บนเครื่อง demo เครื่องหนึ่ง แล้วกางคืนบนอีกเครื่องด้วยมือ และตรวจผลจาก log ของ OnInit
ต้องมีก่อน: จบ A9 · VPS (หรือเครื่อง Windows) สองเครื่องที่เข้าผ่าน RDP ได้ · บัญชี demo หนึ่งบัญชี
อ่านก่อน: เครื่องมือ VPS ของผู้สอน (
bt/vps.py·bt/vps_deploy.py) ไม่อยู่ใน starter kit หัวข้อ 1–4 จึงเป็นกรณีศึกษาของระบบผู้สอน คำสั่งpython bt/...ในหัวข้อเหล่านี้ run บนเครื่องของคุณไม่ได้ ให้อ่านเพื่อเข้าใจหลักการและกับดัก ส่วน lab ทำด้วยมือผ่าน RDP ทั้งหมด
1 · สถาปัตยกรรม: เครื่องเรา pull จาก VPS

ในระบบผู้สอน เครื่องของเรา (PC) เป็นฝ่ายเข้าไปหา VPS แต่ละเครื่องผ่าน SSH สั่งให้บีบ file แล้วดึง zip กลับมาเก็บใน folder สำรอง (mt5-backup/ หนึ่ง zip ต่อเครื่องต่อรอบ) ไม่ใช่ให้ VPS ส่งออกมาเอง
ทำไมทิศนี้: ถ้าให้ VPS เป็นฝ่ายส่ง VPS ต้องถือ credential ของที่เก็บสำรองไว้ คนที่เจาะ VPS ได้เครื่องเดียวจะใช้ credential นั้นเปิดสำรองของทุกเครื่องได้ และในสำรองมี accounts.dat ของทุกบัญชี เครื่องเดียวแตกจะกลายเป็นแตกทุกเครื่อง ทิศดึงตัดปัญหานี้ทิ้ง เพราะบน VPS ไม่มี credential ของที่เก็บสำรองเลย
เก็บอะไร ไม่เก็บอะไร:
| เก็บ | ไม่เก็บ |
|---|---|
Config\ (มี accounts.dat · servers.dat · terminal.ini) |
Bases (ข้อมูลราคา ใหญ่ถึง 11 GB) |
Profiles (chart และ EA ที่ติดพร้อม input) |
Tester |
MQL5\Presets · MQL5\Files · MQL5\Experts |
logs |
ของฝั่งขวา MT5 โหลดคืนเองตอนเปิด chart หรือสร้างใหม่ได้ ส่วนฝั่งซ้ายคือสถานะที่สร้างใหม่ไม่ได้ เช่น EA ที่ซื้อมา หรือ input ที่ตั้งไว้บน chart
ราคาที่ต้องจ่าย: สำรองเกิดได้เฉพาะตอนที่เครื่องเราเปิดอยู่ ปิดเครื่องไปหนึ่งสัปดาห์ ก็ไม่มีสำรองหนึ่งสัปดาห์
2 · ตั้งครั้งแรก

สี่ขั้นตามลำดับในระบบผู้สอน:
| ขั้น | ทำอะไร | ทำที่ไหน |
|---|---|---|
| 1 | เปิด OpenSSH Server และตั้ง firewall ทั้งใน Windows และ firewall ของผู้ให้บริการ VPS | VPS |
| 2 | สร้าง key ed25519 เฉพาะงานนี้ แล้วเขียน public key ลง administrators_authorized_keys เป็น ascii |
เครื่องเรา → VPS |
| 3 | SSH เข้าด้วยมือหนึ่งครั้งต่อเครื่อง | เครื่องเรา |
| 4 | ใส่รายชื่อเครื่องใน fleet.yaml แล้วลอง python bt/vps.py pull --shell และ list |
เครื่องเรา |
กับดักขั้น 2: ถ้าเขียน key ลง file เป็น utf8 ที่มี BOM (byte EF BB BF นำหน้า) บรรทัดแรกของ file จะไม่ขึ้นต้นด้วย ssh-ed25519 อีกต่อไป sshd อ่านไม่ออกแล้วเมิน key นั้นเงียบ ๆ ไม่มี error ให้เห็น อาการที่เห็นคือ SSH ยังถามรหัสผ่านอยู่ทั้งที่วาง key แล้ว key ของ SSH เป็นตัวอักษร ascii ล้วน การเขียนเป็น ascii จึงไม่มี BOM
อ่านผล pull:
| ข้อความ | ความหมาย |
|---|---|
| "X file สำคัญไม่อยู่ใน zip" | พังจริง — file หลักอย่าง accounts.dat ไม่ได้เข้า zip |
| "unreadable N files" | ปกติ — MT5 ที่ run อยู่เปิด file บางตัวค้างไว้ อ่านไม่ได้ตอนบีบ |
3 · ย้ายเครื่อง: ลำดับห้ามสลับ

| ขั้น | ทำอะไร | ทำไม |
|---|---|---|
| 1 | ปิดทุก terminal ด้วย File → Exit และหยุด agent | ยังไม่รู้แน่ว่า MT5 เขียนสถานะบางส่วนลง disk ตอนไหน ปิดก่อนจึงปลอดภัยไว้ก่อน · และกันไม่ให้ agent เปิด terminal กลับมาเอง |
| 2 | pull --only <vps> เฉพาะเครื่องนั้น · ทุก terminal ต้องขึ้นสถานะ closed |
ถ้ายังมีตัวไหน run อยู่ แปลว่าปิดไม่ครบ ให้ไปปิดแล้ว pull ใหม่ |
| 3 | restore --to <ใหม่> --from <เก่า> ดูผลก่อน แล้วค่อยสั่งจริงด้วย --yes |
ดูก่อนว่าจะเขียนอะไรลงไปที่ไหน |
| 4 | ค่อยเปิด agent | agent เปิด terminal ให้อัตโนมัติ |
| 5 | ตรวจ login · smiley · magic | ยืนยันว่าทุก terminal กลับมาทำงานจริง |
ห้ามสลับขั้น 3 กับ 4: agent เปิด terminal ให้เอง ถ้าเปิด agent ก่อน restore มันจะเปิด terminal เปล่าค้างไว้ แล้วตอน restore จะเขียนทับ file ที่ terminal เปิดค้างอยู่ไม่ได้
หยุด agent อย่างเดียว: ใช้ Stop-Process กับ process ของ agent ✓ · ห้ามใช้ schtasks /end ✗ เพราะมันฆ่าทั้ง job ของ task รวมทุก terminal ที่ agent เปิดไว้ด้วย เกิดจริงเมื่อ 19 ก.ย.
⚠ ยังไม่พิสูจน์: รหัสผ่านใน
accounts.datย้ายข้ามเครื่องได้ไหม MT5 อาจผูกการเข้ารหัส file นี้กับตัวเครื่อง ต้องซ้อม restore ก่อนวันที่ต้องย้ายจริง ไม่ใช่ไปรู้ตอนนั้น
4 · ขึ้นบัญชีใหม่ด้วย vps_deploy.py

vps_deploy.py เป็นเครื่องมือของผู้สอนสำหรับขึ้นบัญชีใหม่บน VPS กติกาการใช้:
| เมื่อไร | กติกา |
|---|---|
| ก่อน run | --dry-run ทุกครั้ง · รหัส master พิมพ์เองตอน run ผ่าน getpass ไม่เก็บใน file |
| เครื่องมือปฏิเสธเอง | login ซ้ำ · preset ไม่ตรง version · folder ปลายทางมีอยู่แล้ว |
| จบแล้ว | check ด้วยตาว่า start.ini (มีรหัส) ถูกลบแล้ว |
| ขอบเขต | ใช้กับ demo เท่านั้น |
ทำไมจำกัดแค่ demo: ยังมีสี่ข้อที่ไม่พิสูจน์บนเครื่องจริง
| # | ยังไม่รู้ว่า |
|---|---|
| 1 | KeepPrivate=1 เก็บรหัสข้าม restart ได้ไหม |
| 2 | ส่วน [StartUp] ติด EA พร้อม parameter ได้ไหม |
| 3 | AllowDllImport=1 พอไหม |
| 4 | schtasks /IT ผ่าน SSH เปิดหน้าต่างใน RDP ได้ไหม |
ข้อใดข้อหนึ่งผิด ผลคือบัญชีที่ "ขึ้นแล้ว" อาจไม่ได้ login ค้าง หรือ EA ไม่ได้ติด chart ด้วยค่าที่ตั้งใจ ซึ่งบนบัญชีจริงคือเงินจริง
Lab · สำรองแล้วกางคืนบน VPS demo เครื่องที่สอง

lab นี้คือการซ้อม restore ไปเครื่องที่สอง ซึ่ง repo ของผู้สอนเองก็ยังไม่เคยทำ ใช้บัญชี demo เท่านั้น และทำด้วยมือผ่าน RDP ทั้งหมด
ขั้นที่ 1 · เครื่อง 1 ปิดทุก terminal ด้วย File → Exit ก่อน zip (ไม่ใช่ kill process)
ขั้นที่ 2 · zip เฉพาะ folder เหล่านี้ของ terminal
Config\
Profiles\
MQL5\Presets\
MQL5\Files\
MQL5\Experts\
ไม่เอา Bases · Tester · logs
ขั้นที่ 3 · เครื่อง 2 copy zip ไปเครื่องที่ติดตั้ง MT5 แบบ portable ไว้แล้ว กางทับ แล้วเปิดด้วย
terminal64.exe /portable
ขั้นที่ 4 · ตรวจ login · EA ติด chart · smiley · magic · preset จาก log ของ OnInit (MQL5\Logs\)
ขั้นที่ 5 · จดผล ว่ารหัสผ่านใน accounts.dat ตามมาด้วยไหม — terminal ต่อบัญชีเอง หรือขึ้นหน้าต่างขอรหัส
ผลที่ต้องเห็น: เครื่อง 2 login บัญชี demo เดิมได้ · EA อยู่บน chart เดิมพร้อม preset เดิม · log ของ OnInit แสดงค่าที่ตรงกับเครื่อง 1
ด่าน: login ได้ · smiley · magic ตรงเครื่อง 1 · preset ตรงจาก log OnInit · มีบันทึกผล accounts.dat
เฉลย — ทำเองก่อนแล้วค่อยเปิด
ไม่มีเฉลยเป็นค่าตายตัว เพราะผลข้อ 5 คือสิ่งที่ยังไม่มีใครพิสูจน์ ทั้งสองคำตอบผ่านได้ถ้าจดตามจริง:
- terminal ต่อบัญชีเองได้ = รหัสใน
accounts.datย้ายเครื่องได้ (บนเครื่องคู่นี้ · MT5 build นี้) - ขึ้นหน้าต่างขอรหัส = ย้ายไม่ได้ วันย้ายจริงต้องเตรียมรหัสทุกบัญชีไว้กรอกใหม่
สิ่งที่ทำให้ lab ไม่ผ่าน:
- ตรวจ preset จากชื่อ file
.setบน chart แทนบรรทัดใน log ของ OnInit - zip ตอน terminal ยังเปิด (ผลที่ได้อาจขาดสถานะบางส่วนโดยไม่รู้)
- ไม่ได้จดผล
accounts.datหรือจดว่า "น่าจะได้" โดยไม่ได้เปิดดูจริง - ทำบนบัญชีจริง
จุดที่มักพลาด
| พลาด | ผลที่ตามมา | ทางกัน |
|---|---|---|
| zip ตอน terminal ยังเปิด | สำรองได้สถานะไม่ครบ | File → Exit ทุก terminal ก่อน · ระบบผู้สอนต้องเห็น closed ทุกตัว |
เขียน administrators_authorized_keys เป็น utf8 มี BOM |
sshd เมิน key เงียบ ๆ |
เขียนเป็น ascii |
| เปิด agent ก่อน restore | agent เปิด terminal เปล่าค้าง restore เขียนทับไม่ได้ | ทำขั้น 3 ก่อนขั้น 4 เสมอ |
หยุด agent ด้วย schtasks /end |
ทุก terminal ที่ agent เปิดไว้ตายตาม | Stop-Process เฉพาะ agent |
| เชื่อว่ารหัสย้ายเครื่องได้โดยไม่ทดสอบ | วันย้ายจริง terminal login ไม่ติด | ซ้อม restore แล้วจดผล |
| ตรวจ preset จากชื่อ file | ค่าที่ load จริงอาจไม่ใช่ค่าใน file | อ่านจาก log ของ OnInit |
| ใช้เครื่องมือ deploy กับบัญชีจริง | สี่ข้อที่ยังไม่พิสูจน์อาจพังบนเงินจริง | demo เท่านั้น |
ทวนท้ายบท

- restore เสร็จแล้ว ตรวจว่า preset บนเครื่อง 2 ถูกด้วยอะไร
- ย้ายเครื่องแล้ว รหัสผ่านตามมาด้วยแน่ไหม
- ตอน update agent ทำไมห้ามใช้
schtasks /end
เฉลย
- ดูจาก log ของ OnInit ไม่ใช่ชื่อ file
- ไม่แน่ ยังไม่พิสูจน์ว่ารหัสใน
accounts.datย้ายเครื่องได้ ต้องซ้อม restore แล้วจดผล - เพราะมันฆ่าทุก terminal ที่ agent เปิดไว้ ให้หยุดเฉพาะ agent ด้วย
Stop-Process