EST. 2026 — บันทึกงานเซิร์ฟเวอร์จริง SYSADMIN · SECURITY · AI · DIRECTADMIN เล่มที่ 01
THE SYSADMIN ALMANAC
หน้าหลัก / DirectAdmin / โดเมน .com โดนยึด — ย้ายทั้งเว็บไป .net บน DirectAdmin แบบข้อมูลไม่หาย
DirectAdmin

โดเมน .com โดนยึด — ย้ายทั้งเว็บไป .net บน DirectAdmin แบบข้อมูลไม่หาย

โดย Ton-Or ·6 ก.ค. 2026·อ่าน 9 นาที
โดเมน .com โดนยึด — ย้ายทั้งเว็บไป .net บน DirectAdmin แบบข้อมูลไม่หาย

โดเมนหลุดมือไปอยู่กับ squatter เอาคืนไม่คุ้ม — แต่ข้อมูลบนเซิร์ฟเวอร์ยังอยู่ครบ DirectAdmin มีคำสั่ง rename โดเมนทั้งก้อนที่หลายคนไม่รู้ว่ามี ย้ายไฟล์ เมล DNS ให้เสร็จในคำสั่งเดียว

สรุปใน 1 นาที

อาการ/ปัญหา
โดเมน .com หมดอายุไปอยู่กับ squatter แต่ข้อมูลเว็บบนเซิร์ฟเวอร์ยังอยู่ครบ
ใครควรอ่าน
คนดูแลเว็บบน DirectAdmin ที่ต้องย้ายไปโดเมนใหม่
ทางแก้แบบสั้น
ใช้ CMD_CHANGE_DOMAIN ย้ายไฟล์ เมล DNS ทั้งก้อนในคำสั่งเดียว แล้วทำงานหลังบ้าน 4 อย่างที่ไม่ตามมาเอง และอย่าเชื่อผลตรวจจาก 127.0.0.1
ข้ามไปขั้นตอน

พอดีมีเคสลูกค้ารายหนึ่งปล่อยโดเมน .com หมดอายุเกิน grace period ครับ พอรู้ตัวอีกทีโดเมนหลุดไปอยู่กับพวก domain squatter เรียบร้อย เข้าไปดู DNS ชี้ไปหน้า parking ของคนอื่นแล้ว จะเอาคืนต้องประมูลราคาแพงกว่าค่าโฮสหลายปีรวมกัน ลูกค้าเลยตัดใจ จดชื่อเดิมแต่เป็น .net มาแทน

โจทย์ที่ตกมาถึงผมคือ เว็บทั้งเว็บ — ไฟล์ เมล ฐานข้อมูล — อยู่บน DirectAdmin ภายใต้โดเมน .com เดิม จะย้ายไป .net ยังไงโดยข้อมูลไม่หายแม้แต่ไฟล์เดียว และ downtime น้อยที่สุด เลยเอาวิธีที่ใช้จริงมาเล่าไว้ เผื่อใครเจอเคสเดียวกัน

โดเมน/IP ในบทความ

ชื่อโดเมน user และ IP ในบทความเป็นค่าสมมติทั้งหมด (oldcafe.com / cafeuser / 203.0.113.10) — โครงสร้างคำสั่งคือของที่รันจริง

ทางที่คิดไว้ตอนแรก (แล้วไปไม่ได้)

แผนแรกผมกะจะ add โดเมน .net เข้า account เดิมแล้วค่อยๆ ย้ายของ — ปรากฏว่า account นี้ package จำกัดไว้ 1 โดเมน DA ตอบกลับมาสั้นๆ

Cannot Create Another Domain

จะไปแก้ package ก็ได้แหละครับ แต่พอไปค้น API ของ DA จริงๆ เจอของดีกว่า — DA มีคำสั่ง rename โดเมน ที่ย้ายทุกอย่างให้ในคำสั่งเดียว ชื่อ CMD_CHANGE_DOMAIN

CMD_CHANGE_DOMAIN — rename โดเมนทั้งก้อน

วิธีเรียก API ในนามของ user (ทำจาก root บนเซิร์ฟเวอร์):

# สร้าง login URL ชั่วคราวของ user นั้น
directadmin api-url --user=cafeuser
# ได้ URL แบบ https://cafeuser:<loginkey>@server.example.com:2222

แล้วยิง rename:

URL='https://cafeuser:[email protected]:2222'
curl -sk "$URL/CMD_CHANGE_DOMAIN" \
  --data 'old_domain=oldcafe.com&new_domain=oldcafe.net'
# ตอบ: successfully changed
คำเตือนจากคนโดนมาแล้ว

คำสั่งนี้รันทันที ไม่มี dry-run ไม่มี confirm — ผมตั้งใจจะ "ลองยิงดูว่า endpoint นี้รับ parameter หน้าตาแบบไหน" มันเปลี่ยนให้เลยครับ โชคดีว่าเป็นสิ่งที่ต้องทำอยู่แล้ว ใครจะลองกับโดเมนอื่น คิดให้ดีก่อนกด enter

สิ่งที่ CMD_CHANGE_DOMAIN ย้ายให้ — ผมไล่ verify ทีละอย่างหลังรัน:

  • docroot /home/cafeuser/domains/oldcafe.com ถูกย้ายเป็น oldcafe.net ไฟล์ครบทุกไฟล์
  • DNS zone สร้าง /etc/bind/oldcafe.net.db ให้ record ตามเดิม
  • เมล /etc/virtual/oldcafe.com ย้ายเป็น oldcafe.net mailbox ตามมาครบ
  • vhost nginx/apache rewrite ให้
  • ฐานข้อมูลไม่กระทบ เพราะชื่อ DB ผูกกับ user ไม่ใช่โดเมน
ต้องบอกลูกค้าก่อน

mailbox เปลี่ยนจาก [email protected] เป็น [email protected] — เมลเก่าอยู่ครบ แต่ทุกเครื่องต้องแก้ mail client ให้ login ด้วยชื่อใหม่

สิ่งที่ "ไม่" ตามมาอัตโนมัติ — งานต่ออีก 4 ขั้น

ลำดับงานหลัง renamerewrite httpdtask.queue→DNS ชี้มารอ propagate→SSL ใหม่letsencrypt.sh→sed ลิงก์ใน HTML→แก้ billing

1. rewrite httpd config + reload — หลัง rename บางทีเว็บ serve หน้า default ของเซิร์ฟเวอร์แทน สั่ง rewrite ให้ชัวร์:

cd /usr/local/directadmin
echo 'action=rewrite&value=httpd&user=cafeuser' >> data/task.queue
./dataskq d
nginx -s reload

2. ขอ SSL cert ใหม่ — cert เก่าเป็นของ .com มันไม่เปลี่ยนชื่อตามโดเมน browser จะฟ้อง cert ผิดทันที ต้องรอ .net ชี้ DNS มาที่เซิร์ฟเวอร์เราก่อน (HTTP-01 validation ต้องยิงเข้าถึง) แล้วค่อยขอ:

/usr/local/directadmin/scripts/letsencrypt.sh request 'oldcafe.net,www.oldcafe.net' 4096

สคริปต์นี้อัปเดต cert.combined แล้ว reload ให้เสร็จในตัว

3. แก้ลิงก์ hardcode ในไฟล์เว็บ — เว็บ static เก่าๆ ชอบฝัง absolute URL แบบ http://oldcafe.com/... เต็มไปหมด backup ก่อนแล้วค่อย sed:

cd /home/cafeuser/domains/oldcafe.net
tar czf /root/oldcafe-pre-sed-$(date +%F).tgz public_html
grep -rl 'oldcafe\.com' public_html --include='*.html' | \
  xargs sed -i 's/oldcafe\.com/oldcafe.net/g'

4. แก้ระบบ billing — ถ้ามีระบบ billing ผูกชื่อโดเมนไว้ ตามไปแก้ด้วย ไม่งั้นรอบบิลหน้า invoice ออกเป็นชื่อโดเมนที่ตายแล้ว

กับดักตอน verify — อย่าเชื่อผลจาก 127.0.0.1

อันนี้ผมเสียเวลาไปพักใหญ่ครับ ผม verify cert ด้วยการ curl จากตัวเซิร์ฟเวอร์เองแบบชี้ 127.0.0.1 — ได้ cert ผิดตลอด นึกว่าพัง จริงๆ คือมันเข้า default vhost เพราะ SNI ไม่ match ต้องเทสผ่าน public IP เสมอ:

# แบบนี้ถึงจะเห็นของจริง (203.0.113.10 = IP เซิร์ฟเวอร์)
curl -s --resolve oldcafe.net:443:203.0.113.10 \
  -o /dev/null -w '%{http_code} ssl_verify=%{ssl_verify_result}\n' \
  https://oldcafe.net/
# ต้องได้ 200 ssl_verify=0

openssl s_client -connect 203.0.113.10:443 -servername oldcafe.net </dev/null 2>/dev/null \
  | openssl x509 -noout -subject

สรุป

  1. โดเมนโดนยึด ไม่ต้องย้าย account ใหม่ — CMD_CHANGE_DOMAIN rename ทั้งก้อน ไฟล์ เมล DNS ครบ
  2. คำสั่งรันทันที ไม่มี undo — คิดก่อนยิง
  3. งานหลังบ้าน 4 อย่างที่ไม่ตามมาเอง: rewrite httpd, cert ใหม่, sed ลิงก์, แก้ billing
  4. verify ผ่าน public IP เท่านั้น อย่าเชื่อผล 127.0.0.1
บทเรียนที่แพงที่สุด

ไม่ใช่เรื่องเทคนิคเลยครับ — ตั้ง auto-renew โดเมนเถอะครับ ค่าต่อโดเมนปีละไม่กี่ร้อย ค่าประมูลคืนจาก squatter เริ่มที่หลักหมื่น

ส่วนตัวผมหลังจบเคสนี้ ไล่เปิด auto-renew ให้โดเมนทุกตัวที่ดูแลอยู่เลย ใครยังไม่ได้เปิดก็จัดการซะ ตามสะดวกครับ ตรงไหนผมอธิบายตกหล่นหรือพิมพ์ผิด เดี๋ยวกลับมาแก้เพิ่มให้ภายหลังครับ

อยากให้เราทำให้ไหม?

ให้เราช่วยติดตั้ง ตั้งค่า ย้ายระบบ หรือแก้ปัญหาเซิร์ฟเวอร์ เพื่อให้คุณมีเวลาไปทำงานที่สำคัญกว่า

คุยเรื่องงานกับเรา

เคยเจองานแบบนี้ไหม? ติดตรงไหน?

มาแลกวิธีกันต่อในบอร์ด LinuxThai

→ คุยต่อในบอร์ด

ความคิดเห็น 0

ยังไม่มีความคิดเห็น — เป็นคนแรกเลย