ข้ามไปยังเนื้อหา

เตรียมเซิร์ฟเวอร์ใหม่

VPS ที่เพิ่งสร้างยังไม่มีสิ่งที่หน้าสิ่งที่เซิร์ฟเวอร์ต้องมีระบุไว้เลย scripts/prepare-vps.sh ตั้งให้ครบบน Ubuntu 24.04 ได้แก่ Docker Engine พร้อมปลั๊กอิน Compose, Node.js 22, GitHub CLI, swap, ไฟร์วอลล์ และ Caddy ที่ทำหน้าที่ reverse proxy ซึ่งขอใบรับรองของทั้งสอง origin ให้เอง

ใช้งานได้สองแบบ

  • รันเองบนเซิร์ฟเวอร์ที่มีอยู่แล้ว จากนั้นติดตั้ง TomeCMS ตามหน้าติดตั้งบน VPS
  • วาง deploy/cloud-init.yaml ลงในช่อง user data ตอนสร้างเซิร์ฟเวอร์ เซิร์ฟเวอร์จะเตรียมตัวเองและติดตั้ง TomeCMS ตอนบูตครั้งแรก คุณแค่เปิด /install
  • เซิร์ฟเวอร์ Ubuntu 24.04 LTS แบบ amd64 หรือ arm64 ขนาดตามหน้าสิ่งที่เซิร์ฟเวอร์ต้องมี
  • ชื่อโฮสต์สองชื่อ เช่น cms.example.com และ media.example.com ที่ชี้ DNS มาที่เซิร์ฟเวอร์แล้ว Caddy จะขอใบรับรองของแต่ละชื่อทันทีที่เริ่มทำงาน และลองใหม่ไปเรื่อย ๆ จนกว่า DNS จะชี้มาที่เครื่อง
  • สิทธิ์ root บนเซิร์ฟเวอร์ หรือบัญชีผู้ใช้ที่ใช้ sudo ได้

ทำงานในฐานะ root ถ้าเซิร์ฟเวอร์ให้ล็อกอินด้วยบัญชีอื่น ให้รัน sudo -i ก่อน ดึง release ลงมาครั้งเดียว ไว้ในโฟลเดอร์ที่การติดตั้งใช้ด้วย แล้วรันสคริปต์จากโฟลเดอร์นั้น

Terminal window
git clone --depth 1 --branch v1.4.0 https://github.com/Dhanabhon/tome-cms.git /opt/tome-cms-src
cd /opt/tome-cms-src
./scripts/prepare-vps.sh --cms-url https://cms.example.com --media-url https://media.example.com

ใช้เวอร์ชันล่าสุดจากหน้า Releases ครั้งแรกให้เติม --dry-run เพื่อดูว่าสคริปต์จะทำอะไรบ้าง แบบ dry run จะตรวจเซิร์ฟเวอร์และพิมพ์ทุกขั้นตอนออกมา โดยไม่เปลี่ยนอะไรเลย เมื่อเสร็จแล้ว ให้ทำตามหน้าติดตั้งบน VPS ต่อในโฟลเดอร์เดียวกัน ไม่ต้อง clone ใหม่

บัญชีสำหรับ SSH หรือการติดตั้งแบบ build จากซอร์สโค้ด

หัวข้อที่มีชื่อว่า “บัญชีสำหรับ SSH หรือการติดตั้งแบบ build จากซอร์สโค้ด”

การติดตั้งแบบ managed รันด้วยสิทธิ์ root และไม่ต้องใช้บัญชีอื่น มีสองกรณีที่ต้องมีบัญชีเพิ่ม

  • เมื่อไม่อยากล็อกอินเป็น root อีก --create-user --user tomecms จะสร้างบัญชีที่ไม่มีรหัสผ่านและได้ SSH key ชุดเดียวกับ root จึง ssh tomecms@เซิร์ฟเวอร์ของคุณ ได้
  • สำหรับการติดตั้งแบบ build จากซอร์สโค้ด สคริปต์ deploy รันด้วยบัญชีที่อยู่ในกลุ่ม docker ใส่ --user <name> เพื่อเพิ่มบัญชีนั้นเข้ากลุ่ม หรือรันสคริปต์ผ่าน sudo ซึ่งจะเพิ่มบัญชีที่สั่ง sudo ให้เอง จากนั้นสลับไปเป็นบัญชีนั้นด้วย sudo -iu <name> ซึ่งเริ่ม login ใหม่ บัญชีจึงได้สิทธิ์ของกลุ่ม

สคริปต์ทำงานตามลำดับนี้

  1. ตรวจเซิร์ฟเวอร์ก่อนเปลี่ยนอะไร ได้แก่ สิทธิ์ root, Ubuntu 24.04, amd64 หรือ arm64, systemd 235 ขึ้นไป, บัญชีผู้ใช้ถ้าคุณระบุไว้, ที่อยู่ทั้งสอง และดูว่าพอร์ต 80 กับ 443 ไม่มีโปรแกรมอื่นนอกจาก Caddy ใช้อยู่ ถ้าเจอปัญหาจะแสดงทุกข้อแล้วหยุด
  2. ติดตั้ง ca-certificates, curl, git และ gnupg
  3. ถ้าใส่ --create-user จะสร้างบัญชีผู้ใช้แบบไม่มีรหัสผ่าน แล้วให้ใช้ SSH key ชุดเดียวกับของ root โดย key แต่ละตัวยังมี option เดิม เช่น from= ยกเว้นคำสั่ง “log in as ubuntu” ที่ cloud image ใส่ไว้หน้า key ของ root ซึ่งจะถูกตัดออก
  4. ติดตั้ง Docker Engine และปลั๊กอิน Compose จาก apt repository ของ Docker เอง เปิด Docker และเพิ่มบัญชีผู้ใช้เข้ากลุ่ม docker ถ้ามีบัญชีนั้น ถ้าเครื่องมี Docker ที่ใช้ Compose ได้อยู่แล้ว สคริปต์จะใช้ตัวเดิม
  5. ติดตั้ง Node.js 22 จาก apt repository ของ NodeSource ไว้ที่ /usr/bin/node เว้นแต่ตัวที่อยู่ตรงนั้นเป็น 22.12 ขึ้นไปแล้ว
  6. ติดตั้ง GitHub CLI จาก apt repository ของ GitHub การติดตั้งแบบ managed ตั้งแต่ 1.0.0 ใช้มันตรวจสิ่งที่ดาวน์โหลดมา
  7. ถ้าหน่วยความจำน้อยกว่า 4 GB และยังไม่มี swap จะสร้างไฟล์ swap ขนาด 2 GB หรือตามที่ระบุใน --swap-size
  8. อนุญาต SSH ก่อน ตามด้วยพอร์ต 80 และ 443 ใน ufw แล้วเปิด ufw สคริปต์อ่านพอร์ต SSH จากการตั้งค่าของ SSH server เอง และไม่แก้การตั้งค่านั้น
  9. ติดตั้ง Caddy และเขียน /etc/caddy/Caddyfile สำหรับทั้งสอง origin
  10. ค้นชื่อโฮสต์ทั้งสองแล้วพิมพ์ที่อยู่ที่ชี้ไป ให้คุณเทียบกับที่อยู่ของเซิร์ฟเวอร์
  11. พิมพ์คำสั่งสำหรับติดตั้ง TomeCMS โดยให้รันจากโฟลเดอร์เดียวกัน เมื่อสคริปต์รันจากโค้ดที่ clone มาจาก tag ของ release

ทุกขั้นตอนจะบอกว่าเปลี่ยนอะไรไป หรือพบว่าทำไว้แล้ว จึงรันสคริปต์ซ้ำได้อย่างปลอดภัย ถ้า apt repository ของ Docker, NodeSource, GitHub หรือ Caddy ตั้งไว้ด้วยวิธีอื่นอยู่แล้ว สคริปต์จะใช้แหล่งเดิม ไม่เพิ่มซ้ำอีกแหล่ง ก่อนเพิ่มแหล่งใหม่ สคริปต์จะเทียบ key ที่ใช้เซ็นของแต่ละเจ้ากับ fingerprint ที่เจ้านั้นประกาศไว้ ถ้า key ที่ดาวน์โหลดมาไม่ตรงจะหยุดทันที

ตัวเลือก ทำอะไร
--cms-url <url> origin ของ CMS เช่น https://cms.example.com ถ้าไม่ใส่ สคริปต์จะอ่านจาก TOME_CMS_PUBLIC_URL
--media-url <url> origin ของมีเดีย เช่น https://media.example.com ถ้าไม่ใส่ สคริปต์จะอ่านจาก S3_ENDPOINT
--user <name> บัญชีผู้ใช้ที่จะเพิ่มเข้ากลุ่ม docker สำหรับการติดตั้งแบบ build จากซอร์สโค้ด ถ้าไม่ใส่ จะใช้บัญชีที่สั่ง sudo และถ้า root เป็นคนรัน จะไม่เพิ่มบัญชีไหนเลย
--create-user สร้างบัญชีผู้ใช้นั้นถ้ายังไม่มี
--no-firewall ไม่แตะไฟร์วอลล์
--no-proxy ไม่ติดตั้ง proxy สำหรับเซิร์ฟเวอร์ที่มีอยู่แล้ว เมื่อใช้ตัวเลือกนี้ไม่ต้องใส่ที่อยู่
--swap-size <size> ขนาดไฟล์ swap เช่น 2G หรือ 1536M
--dry-run ตรวจเซิร์ฟเวอร์และพิมพ์ทุกขั้นตอน โดยไม่เปลี่ยนอะไร
--print-caddyfile พิมพ์ Caddyfile สำหรับที่อยู่ทั้งสอง โดยไม่เปลี่ยนอะไร

Caddy ส่ง origin ของ CMS ต่อไปที่ 127.0.0.1:4321 และ origin ของมีเดียไปที่ 127.0.0.1:9000 ส่ง header Host ต่อไปตามเดิม และรับไฟล์อัปโหลดได้ถึง 25 MB ครบทั้งสองข้อที่การตั้ง reverse proxyต้องการ

บรรทัดแรกของ Caddyfile บอกว่าไฟล์นี้เป็นของสคริปต์ และสคริปต์จะเขียนทับทุกครั้งที่รัน ถ้ามีคนอื่นแก้ Caddyfile ไว้ สคริปต์จะหยุดแทนที่จะเขียนทับ ถ้าต้องการเก็บสิ่งที่แก้เอง ให้รันสคริปต์ด้วย --no-proxy

ถ้า nginx หรือ Apache ใช้พอร์ต 80 หรือ 443 อยู่แล้ว สคริปต์จะบอกชื่อโปรแกรมนั้นแล้วหยุด ให้รันด้วย --no-proxy เพื่อใช้ตัวเดิม แล้วตั้งค่าตามหน้าการตั้ง reverse proxy

deploy/cloud-init.yaml เตรียมเซิร์ฟเวอร์ใหม่และติดตั้ง TomeCMS ตอนบูตครั้งแรก

  1. เปิด deploy/cloud-init.yaml แล้วคัดลอกไป
  2. แทนที่อยู่ตัวอย่างสองบรรทัดด้านบนด้วยที่อยู่ของคุณ
  3. สร้างเซิร์ฟเวอร์ด้วย Ubuntu 24.04 แล้ววางไฟล์ลงในช่อง user data ทั้ง DigitalOcean, Hetzner, Vultr และ AWS มีช่องนี้อยู่ในตัวเลือกขั้นสูงหรือตัวเลือกเพิ่มเติมตอนสร้างเซิร์ฟเวอร์ โดยเรียกว่า user data หรือ cloud config
  4. ชี้ชื่อโฮสต์ทั้งสองไปที่ที่อยู่ของเซิร์ฟเวอร์ใหม่
  5. รอ การบูตครั้งแรกใช้เวลาหลายนาที
  6. เข้าเครื่องผ่าน SSH ถ้ายังติดตั้งไม่เสร็จ ข้อความตอนเข้าระบบจะบอกว่ากำลังติดตั้งอยู่ พอเสร็จแล้วข้อความจะบอกว่าไปติดตั้งต่อที่ไหน และอ่าน installation token ได้อย่างไร

ตอนบูตครั้งแรก เซิร์ฟเวอร์จะ

  • clone TomeCMS ตามรุ่นที่ไฟล์ระบุ ไว้ที่ /opt/tome-cms-src
  • รัน prepare-vps.sh ด้วย --create-user --user tomecms
  • ตั้งแต่ 1.0.0 จะรันตัวติดตั้งแบบ managed ด้วยสิทธิ์ root จาก /opt/tome-cms-src สำหรับรุ่น 0.x ที่เก่ากว่านั้น จะ clone TomeCMS อีกชุดไว้ที่ /home/tomecms/tome-cms แล้วรันสคริปต์ deploy ที่นั่นในนามของ tomecms
  • บันทึกทุกอย่างที่ทำไว้ใน /var/log/tomecms-install.log ซึ่งมีแต่ root ที่อ่านได้

ไฟล์นี้ไม่มีความลับอยู่เลย เซิร์ฟเวอร์สร้างความลับทุกตัวขึ้นเอง ข้อนี้สำคัญ เพราะผู้ให้บริการเก็บ user data ของคุณไว้ และโปรแกรมใดก็ตามบนเซิร์ฟเวอร์อ่านกลับมาได้

ข้อความตอนเข้าระบบจะบอกไว้ ให้อ่านท้ายไฟล์ log

Terminal window
sudo tail -n 50 /var/log/tomecms-install.log

แก้ตามที่ log บอก แล้วรันการติดตั้งใหม่อีกครั้ง คำสั่งนี้จะข้ามสิ่งที่ทำไว้แล้วและเก็บ log เดิมไว้

Terminal window
sudo /usr/local/sbin/tomecms-first-boot

ถ้าต้องการรันทีละขั้นตอนด้วยตัวเอง ให้ใช้คำสั่งที่มันเรียกอยู่ข้างใน

Terminal window
sudo /opt/tome-cms-src/scripts/prepare-vps.sh --create-user --user tomecms --cms-url https://cms.example.com --media-url https://media.example.com
cd /opt/tome-cms-src && sudo npm ci
sudo TOME_CMS_PUBLIC_URL=https://cms.example.com S3_ENDPOINT=https://media.example.com ./scripts/install-managed-vps.sh --version 1.4.0

ตัวติดตั้งไม่ยอมรันทับการติดตั้งที่มันเริ่มไว้แล้ว ถ้ามันหยุดไปหลังจากเขียนไฟล์แล้ว หน้ากลับเข้าหน้าผู้ดูแล บอกว่าต้องทำอะไรแทน