โดเมน .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 น้อยที่สุด เลยเอาวิธีที่ใช้จริงมาเล่าไว้ เผื่อใครเจอเคสเดียวกัน
ชื่อโดเมน 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.netmailbox ตามมาครบ - vhost nginx/apache rewrite ให้
- ฐานข้อมูลไม่กระทบ เพราะชื่อ DB ผูกกับ user ไม่ใช่โดเมน
mailbox เปลี่ยนจาก [email protected] เป็น [email protected] — เมลเก่าอยู่ครบ แต่ทุกเครื่องต้องแก้ mail client ให้ login ด้วยชื่อใหม่
สิ่งที่ "ไม่" ตามมาอัตโนมัติ — งานต่ออีก 4 ขั้น
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
สรุป
- โดเมนโดนยึด ไม่ต้องย้าย account ใหม่ —
CMD_CHANGE_DOMAINrename ทั้งก้อน ไฟล์ เมล DNS ครบ - คำสั่งรันทันที ไม่มี undo — คิดก่อนยิง
- งานหลังบ้าน 4 อย่างที่ไม่ตามมาเอง: rewrite httpd, cert ใหม่, sed ลิงก์, แก้ billing
- verify ผ่าน public IP เท่านั้น อย่าเชื่อผล 127.0.0.1
ไม่ใช่เรื่องเทคนิคเลยครับ — ตั้ง auto-renew โดเมนเถอะครับ ค่าต่อโดเมนปีละไม่กี่ร้อย ค่าประมูลคืนจาก squatter เริ่มที่หลักหมื่น
ส่วนตัวผมหลังจบเคสนี้ ไล่เปิด auto-renew ให้โดเมนทุกตัวที่ดูแลอยู่เลย ใครยังไม่ได้เปิดก็จัดการซะ ตามสะดวกครับ ตรงไหนผมอธิบายตกหล่นหรือพิมพ์ผิด เดี๋ยวกลับมาแก้เพิ่มให้ภายหลังครับ
อยากให้เราทำให้ไหม?
ให้เราช่วยติดตั้ง ตั้งค่า ย้ายระบบ หรือแก้ปัญหาเซิร์ฟเวอร์ เพื่อให้คุณมีเวลาไปทำงานที่สำคัญกว่า
เคยเจองานแบบนี้ไหม? ติดตรงไหน?
มาแลกวิธีกันต่อในบอร์ด LinuxThai



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