เตรียมเซิร์ฟเวอร์ใหม่
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 ลงมาครั้งเดียว ไว้ในโฟลเดอร์ที่การติดตั้งใช้ด้วย แล้วรันสคริปต์จากโฟลเดอร์นั้น
git clone --depth 1 --branch v1.4.0 https://github.com/Dhanabhon/tome-cms.git /opt/tome-cms-srccd /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 ใหม่ บัญชีจึงได้สิทธิ์ของกลุ่ม
สคริปต์ทำงานตามลำดับนี้
- ตรวจเซิร์ฟเวอร์ก่อนเปลี่ยนอะไร ได้แก่ สิทธิ์ root, Ubuntu 24.04,
amd64หรือarm64, systemd 235 ขึ้นไป, บัญชีผู้ใช้ถ้าคุณระบุไว้, ที่อยู่ทั้งสอง และดูว่าพอร์ต 80 กับ 443 ไม่มีโปรแกรมอื่นนอกจาก Caddy ใช้อยู่ ถ้าเจอปัญหาจะแสดงทุกข้อแล้วหยุด - ติดตั้ง
ca-certificates,curl,gitและgnupg - ถ้าใส่
--create-userจะสร้างบัญชีผู้ใช้แบบไม่มีรหัสผ่าน แล้วให้ใช้ SSH key ชุดเดียวกับของ root โดย key แต่ละตัวยังมี option เดิม เช่นfrom=ยกเว้นคำสั่ง “log in as ubuntu” ที่ cloud image ใส่ไว้หน้า key ของ root ซึ่งจะถูกตัดออก - ติดตั้ง Docker Engine และปลั๊กอิน Compose จาก apt repository ของ Docker เอง เปิด Docker และเพิ่มบัญชีผู้ใช้เข้ากลุ่ม
dockerถ้ามีบัญชีนั้น ถ้าเครื่องมี Docker ที่ใช้ Compose ได้อยู่แล้ว สคริปต์จะใช้ตัวเดิม - ติดตั้ง Node.js 22 จาก apt repository ของ NodeSource ไว้ที่
/usr/bin/nodeเว้นแต่ตัวที่อยู่ตรงนั้นเป็น 22.12 ขึ้นไปแล้ว - ติดตั้ง GitHub CLI จาก apt repository ของ GitHub การติดตั้งแบบ managed ตั้งแต่ 1.0.0 ใช้มันตรวจสิ่งที่ดาวน์โหลดมา
- ถ้าหน่วยความจำน้อยกว่า 4 GB และยังไม่มี swap จะสร้างไฟล์ swap ขนาด 2 GB หรือตามที่ระบุใน
--swap-size - อนุญาต SSH ก่อน ตามด้วยพอร์ต 80 และ 443 ใน
ufwแล้วเปิดufwสคริปต์อ่านพอร์ต SSH จากการตั้งค่าของ SSH server เอง และไม่แก้การตั้งค่านั้น - ติดตั้ง Caddy และเขียน
/etc/caddy/Caddyfileสำหรับทั้งสอง origin - ค้นชื่อโฮสต์ทั้งสองแล้วพิมพ์ที่อยู่ที่ชี้ไป ให้คุณเทียบกับที่อยู่ของเซิร์ฟเวอร์
- พิมพ์คำสั่งสำหรับติดตั้ง 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 สำหรับที่อยู่ทั้งสอง โดยไม่เปลี่ยนอะไร |
proxy ที่สคริปต์ตั้งให้
หัวข้อที่มีชื่อว่า “proxy ที่สคริปต์ตั้งให้”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
สร้างเซิร์ฟเวอร์ด้วย cloud-init
หัวข้อที่มีชื่อว่า “สร้างเซิร์ฟเวอร์ด้วย cloud-init”deploy/cloud-init.yaml เตรียมเซิร์ฟเวอร์ใหม่และติดตั้ง TomeCMS ตอนบูตครั้งแรก
- เปิด
deploy/cloud-init.yamlแล้วคัดลอกไป - แทนที่อยู่ตัวอย่างสองบรรทัดด้านบนด้วยที่อยู่ของคุณ
- สร้างเซิร์ฟเวอร์ด้วย Ubuntu 24.04 แล้ววางไฟล์ลงในช่อง user data ทั้ง DigitalOcean, Hetzner, Vultr และ AWS มีช่องนี้อยู่ในตัวเลือกขั้นสูงหรือตัวเลือกเพิ่มเติมตอนสร้างเซิร์ฟเวอร์ โดยเรียกว่า user data หรือ cloud config
- ชี้ชื่อโฮสต์ทั้งสองไปที่ที่อยู่ของเซิร์ฟเวอร์ใหม่
- รอ การบูตครั้งแรกใช้เวลาหลายนาที
- เข้าเครื่องผ่าน 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
sudo tail -n 50 /var/log/tomecms-install.logแก้ตามที่ log บอก แล้วรันการติดตั้งใหม่อีกครั้ง คำสั่งนี้จะข้ามสิ่งที่ทำไว้แล้วและเก็บ log เดิมไว้
sudo /usr/local/sbin/tomecms-first-bootถ้าต้องการรันทีละขั้นตอนด้วยตัวเอง ให้ใช้คำสั่งที่มันเรียกอยู่ข้างใน
sudo /opt/tome-cms-src/scripts/prepare-vps.sh --create-user --user tomecms --cms-url https://cms.example.com --media-url https://media.example.comcd /opt/tome-cms-src && sudo npm cisudo TOME_CMS_PUBLIC_URL=https://cms.example.com S3_ENDPOINT=https://media.example.com ./scripts/install-managed-vps.sh --version 1.4.0ตัวติดตั้งไม่ยอมรันทับการติดตั้งที่มันเริ่มไว้แล้ว ถ้ามันหยุดไปหลังจากเขียนไฟล์แล้ว หน้ากลับเข้าหน้าผู้ดูแล บอกว่าต้องทำอะไรแทน

