อัปเดตไปเซิร์ฟเวอร์เกม
ให้เซิร์ฟเวอร์ Minecraft มี mod ตรงกับ Instance ด้วยสคริปต์ตัวเล็กที่รันก่อนเปิดเซิร์ฟเวอร์ เลือกไฟล์แล้วกดยืนยัน
อัปเดตไปเซิร์ฟเวอร์คืออะไร
ผู้เล่นได้ไฟล์ของ Instance ผ่าน launcher อยู่แล้ว แต่เซิร์ฟเวอร์เกม Minecraft ของคุณต้องมี mod ชุดเดียวกัน (เฉพาะฝั่งเซิร์ฟเวอร์) ระบบนี้ช่วยให้เซิร์ฟเวอร์ มีไฟล์ตรงกับ Instance โดยไม่ต้องอัปโหลดซ้ำเอง มันทำงานแบบง่ายๆ ดังนี้
- ในหน้า ไฟล์ กดปุ่ม อัปเดตไปเซิร์ฟเวอร์ จะเห็นว่ามีไฟล์ใหม่ ไฟล์ที่อัปเดต และไฟล์ที่ถูกลบ แล้วคุณเลือกและกดยืนยัน
- เซิร์ฟเวอร์เกมมีสคริปต์ตัวเล็ก (
dms-sync.sh) ที่รันก่อนเปิดเซิร์ฟเวอร์ สคริปต์ถามระบบว่าต้องมีไฟล์อะไร แล้วดาวน์โหลดหรือลบให้ตรง - เซิร์ฟเวอร์เปลี่ยนก็ต่อเมื่อคุณกดยืนยันเท่านั้น การอัปโหลดหรือลบไฟล์ใน Instance จะไม่แตะเซิร์ฟเวอร์เอง
ถ้าไม่ได้ตั้งค่าสคริปต์ ไม่มีอะไรเปลี่ยน Instance และ launcher ใช้งานได้ตามปกติ
ตั้งค่าครั้งแรก
- 1
สร้าง key
ในหน้า ไฟล์ กดปุ่ม อัปเดตไปเซิร์ฟเวอร์ (รูปเซิร์ฟเวอร์ที่มีฟันเฟือง) แล้วกด ตั้งค่าสคริปต์ และ สร้าง key key แสดงครั้งเดียวเก็บไว้เป็นความลับ ใช้ได้เฉพาะอ่านรายการไฟล์ของ Instance นี้และรายงานกลับ ไม่มีสิทธิ์อื่น ถ้าหาย สร้างใหม่ได้ (key เดิมจะใช้ไม่ได้ทันที)
- 2
ติดตั้งสคริปต์บนเซิร์ฟเวอร์เกม
เปิดโฟลเดอร์ของเซิร์ฟเวอร์เกม (ต้องมี
bashและcurlซึ่งเครื่อง Linux ส่วนใหญ่มีอยู่แล้ว) แล้วรันคำสั่งที่หน้าต่างให้ไว้ ซึ่งจะดาวน์โหลดสคริปต์และเก็บ key ไว้ในไฟล์dms-sync.envข้างๆ - 3
เรียกสคริปต์ก่อนเปิดเซิร์ฟเวอร์
ใส่บรรทัดเรียกสคริปต์ไว้ในไฟล์ที่เปิดเซิร์ฟเวอร์ ก่อนคำสั่ง
java:bash./dms-sync.sh || echo "ซิงก์ไม่สำเร็จ เปิดด้วยไฟล์เดิม" java -jar server.jar noguiถ้าสคริปต์ล้มเหลว (เช่น ไม่มีอินเทอร์เน็ต) เซิร์ฟเวอร์ยังเปิดต่อด้วยไฟล์ที่มีอยู่ ไม่ถูกขวาง
อยากลองก่อนโดยไม่เปลี่ยนอะไร ให้รัน DMS_DRY_RUN=1 ./dms-sync.sh สคริปต์จะบอกว่าจะทำอะไรแต่ไม่ทำจริง
เลือกไฟล์และยืนยัน
เมื่อกด อัปเดตไปเซิร์ฟเวอร์ ไฟล์ทุกไฟล์ของ Instance จะถูกจัดเป็นกลุ่ม ปุ่มจะมีตัวเลขบอกจำนวนรายการที่ยังรอตัดสินใจ
| กลุ่ม | ความหมาย | ค่าเริ่มต้น |
|---|---|---|
| ไฟล์ใหม่ | ยังไม่เคยตัดสินใจ เซิร์ฟเวอร์เกมไม่ต้องการ mod ฝั่งผู้เล่นอย่าง shader หรือ minimap จึงต้องให้คุณเลือก | ไม่ติ๊ก |
| มีการอัปเดต | mod ที่อยู่บนเซิร์ฟเวอร์แล้ว แต่ไฟล์ใน Instance เปลี่ยน (เช่น อัปเวอร์ชัน) ของเก่าถูกแทนที่ด้วยของใหม่ | ติ๊ก |
| จะถูกลบออกจากเซิร์ฟเวอร์ | เคยอยู่บนเซิร์ฟเวอร์ แต่ถูกลบจาก Instance แล้ว | ติ๊ก |
| ตรงกันแล้ว | ไฟล์ที่อยู่บนเซิร์ฟเวอร์และเป็นเวอร์ชันล่าสุดแล้ว (พับไว้) ติ๊กออกถ้าไม่ต้องการแล้ว | ติ๊กไว้ |
| ไม่เอาไว้บนเซิร์ฟเวอร์ | ไฟล์ที่เคยเลือกว่าใช้ฝั่งผู้เล่นอย่างเดียว (พับไว้) ติ๊กถ้าเปลี่ยนใจ | ไม่ติ๊ก |
- สิ่งที่ตัดสินใจแล้วถูกจำไว้ ไฟล์ใหม่ที่คุณไม่ติ๊กถือว่าเป็นของฝั่งผู้เล่น และจะไม่ถามอีก ครั้งต่อไปจะถามเฉพาะสิ่งที่ใหม่หรือเปลี่ยนไป
- ไฟล์ที่ผูกสิทธิ์ให้ผู้เล่นบางกลุ่ม (ดู สิทธิ์) ไม่ถูกส่งไปเซิร์ฟเวอร์
- อัปเดตหรือลบที่ไม่ติ๊ก = รอไว้ก่อน ยังไม่เปลี่ยนอะไร และจะถามอีกครั้งหน้า
- ไฟล์ที่มาจาก Modrinth จะมีป้าย เซิร์ฟเวอร์: ต้องมี / ใส่หรือไม่ก็ได้ / ไม่รองรับ เป็นคำแนะนำจาก Modrinth ว่า mod นี้ใช้ฝั่งเซิร์ฟเวอร์ได้ไหม ระบบไม่ติ๊กให้ คุณเป็นคนตัดสินใจเสมอ (ไฟล์ที่เพิ่มก่อนมีฟีเจอร์นี้อาจไม่มีป้าย)
กด ยืนยัน แล้วรายการของเซิร์ฟเวอร์จะถูกบันทึก เซิร์ฟเวอร์จะเปลี่ยนตอนสคริปต์ทำงานครั้งถัดไป (ตอนเปิดเซิร์ฟเวอร์) หน้าต่างจะแสดงเวลาที่เซิร์ฟเวอร์ติดต่อมาล่าสุดและสถานะของแต่ละไฟล์ (อยู่บนเซิร์ฟเวอร์แล้ว / เป็นเวอร์ชันอื่น / ยังไม่มี)
เซิร์ฟเวอร์ที่มีไฟล์อยู่แล้ว (Initialize)
ถ้าเซิร์ฟเวอร์เกมมี mod อยู่ก่อนใช้ระบบนี้ ไม่ต้องติ๊กทีละไฟล์ ทุกครั้งที่สคริปต์ทำงาน มันจะอ่านอย่างเดียวว่าที่ path ของไฟล์ใน Instance (ที่ยังไม่เคยตัดสินใจ) มีไฟล์อะไรอยู่บนเซิร์ฟเวอร์ แล้วส่ง SHA-1 มาพร้อมรายงานปกติ ไม่ต้องขออะไรเพิ่ม ไม่ดาวน์โหลด ไม่แก้ ไม่ลบ ไฟล์ที่เคยอ่านแล้วและไม่เปลี่ยน (ขนาดและเวลาเท่าเดิม) ไม่ถูกคำนวณซ้ำ
- ไฟล์ใหม่ที่เซิร์ฟเวอร์มีอยู่แล้วและ hash ตรงกัน จะถูกติ๊กให้อัตโนมัติ (เอาไว้บนเซิร์ฟเวอร์) ตั้งแต่เปิดหน้าต่าง
- ไฟล์ที่ไม่มีบนเซิร์ฟเวอร์ หรือมีแต่เป็นอีกเวอร์ชัน จะไม่ถูกติ๊ก (ไม่เอาไว้บนเซิร์ฟเวอร์) แต่ละแถวบอกสถานะ: อยู่บนเซิร์ฟเวอร์แล้ว / เป็นเวอร์ชันอื่น / ยังไม่มี
- ปุ่ม Initialize ติ๊กใหม่ตามไฟล์ที่เซิร์ฟเวอร์ส่งมาล่าสุด (ไฟล์ใหม่ที่ตรงกันติ๊ก ที่เหลือไม่ติ๊ก) หลังจากนั้นปรับได้ แล้วกด ยืนยัน ตามปกติ
- ต้องใช้สคริปต์เวอร์ชัน 3 ขึ้นไป (ดาวน์โหลด
dms-sync.shใหม่จากคำสั่งติดตั้ง) และเปิดเซิร์ฟเวอร์อย่างน้อยหนึ่งครั้งหลังอัปสคริปต์ สคริปต์เก่าส่งข้อมูลนี้ไม่ได้ ปุ่มจะกดไม่ได้จนกว่าจะมีข้อมูล
ถ้าคุณกดยืนยันไปแล้ว แต่ก่อนเปิดเซิร์ฟเวอร์ไปเปลี่ยนหรือลบไฟล์นั้นใน Instance (ไฟล์เดิมใน Storage ถูกลบไปแล้ว) สคริปต์จะไม่มีไฟล์เวอร์ชันที่ยืนยันไว้ให้โหลด จึงบอกว่า waiting: ... is not confirmed again yet และไม่นับเป็นความล้มเหลว เซิร์ฟเวอร์เปิดต่อได้ตามปกติ ไฟล์ที่เซิร์ฟเวอร์มีอยู่แล้วยังอยู่ ไม่ถูกลบ แล้วเวอร์ชันใหม่จะเข้ามาหลังคุณกด ยืนยัน ใหม่ในหน้าต่าง "อัปเดตไปเซิร์ฟเวอร์" (ข้อความ "ซิงก์ไม่สำเร็จ เปิดด้วยไฟล์เดิม" จะขึ้นเฉพาะเมื่อสคริปต์จบด้วยรหัส 1 หรือ 2 จริงๆ เช่น key ผิด ไม่มีอินเทอร์เน็ต หรือไฟล์ที่โหลดมา SHA-1 ไม่ตรง)
สคริปต์ทำอะไรกับไฟล์ของเซิร์ฟเวอร์
- ดาวน์โหลดเป็นไฟล์ชั่วคราว ตรวจ SHA-1 ให้ตรงก่อนจึงย้ายเข้าที่ ถ้าไม่ตรง ไฟล์เดิมยังอยู่ และสคริปต์บอกว่าล้มเหลว
- ลบเฉพาะไฟล์ที่สคริปต์วางเอง (จดไว้ใน
.dms-sync/managed) ที่ตอนนี้ไม่อยู่ในรายการแล้ว ไฟล์อื่นของคุณ โฟลเดอร์worldและ config ของเซิร์ฟเวอร์ไม่ถูกแตะ - ถ้ารายการที่ได้รับว่างเปล่า สคริปต์จะไม่ลบอะไรเลย (กันกรณีผิดพลาด)
- path ที่พยายามออกนอกโฟลเดอร์ของเซิร์ฟเวอร์ถูกปฏิเสธ
- ไฟล์ที่มีอยู่แล้วและตรงกับรายการ ถือเป็นของที่ถูกต้อง ไม่ดาวน์โหลดซ้ำ
ตัวแปรของสคริปต์
| ตัวแปร | ความหมาย |
|---|---|
DMS_API | ที่อยู่ของระบบนี้ (ใส่ให้อัตโนมัติใน dms-sync.env) |
DMS_KEY | key ของเซิร์ฟเวอร์ (เก็บเป็นความลับ) |
DMS_DIR | โฟลเดอร์ของเซิร์ฟเวอร์เกม (ค่าเริ่มต้นคือโฟลเดอร์ปัจจุบัน) |
DMS_DRY_RUN | ตั้งเป็น 1 เพื่อดูว่าจะทำอะไรโดยไม่เปลี่ยนอะไร |
รหัสที่สคริปต์ส่งกลับ: 0 สำเร็จ, 2 บางไฟล์อัปเดตไม่ได้ (ไฟล์อื่นเรียบร้อย), 1 ทำอะไรไม่ได้เลย (เช่น key ผิดหรือไม่มีอินเทอร์เน็ต)
เปลี่ยนหรือลบ key
เปิด ตั้งค่าสคริปต์ ในหน้าต่างเดิม สร้าง key ใหม่ ทำให้ key เดิมใช้ไม่ได้ทันที (ต้องเอา key ใหม่ไปใส่ใน dms-sync.env) ลบ key ทำให้สคริปต์ดึงรายการไม่ได้อีก ไฟล์ที่อยู่บนเซิร์ฟเวอร์ไม่ถูกลบ ใครก็ตามที่จัดการ Instance ได้สร้างและลบ key ได้

