ข้ามไปที่เนื้อหา

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

A10-1

ในระบบผู้สอน เครื่องของเรา (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 · ตั้งครั้งแรก

A10-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 · ย้ายเครื่อง: ลำดับห้ามสลับ

A10-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

A10-4

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 เครื่องที่สอง

A10-L

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 เท่านั้น

ทวนท้ายบท

A10-Q

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