ประสบการณ์อัพเกรด Drupal 7 เป็น Drupal 8

Drupal 8

มีเหตุให้ต้องย้ายโฮสต์ของบล็อก isriya.com เลยถือโอกาสอัพเกรดเอนจิน CMS จาก Drupal 7 เป็น Drupal 8 ไปพร้อมกันเลย แต่กว่าจะทำสำเร็จต้องใช้พลังกายพลังใจเยอะกว่าที่คิดมาก (ทำๆ หยุดๆ อยู่เกือบสัปดาห์) ควรค่าแก่การบันทึกไว้เป็น knowledge base

Background

ต้องบอกว่า Drupal 7 กับ Drupal 8 แทบจะเรียกว่าเป็น CMS คนละตัวกันเลยก็ว่าได้ มีการเปลี่ยนแปลงระดับโครงสร้างเยอะมาก และแน่นอนว่าทำให้ break compatibility มหาศาล

กระบวนการ "อัพเกรด" (upgrade) จากเวอร์ชัน 7 เป็น 8 ตรงๆ จึงไม่สามารถทำได้เหมือนตอนอัพเกรดจากเวอร์ชัน 6 มาเป็น 7 แต่ต้องใช้วิธี "ย้าย" (migrate) จากไซต์ที่เป็นเวอร์ชัน 7 มายังไซต์ที่เป็นเวอร์ชัน 8 แทน

รายละเอียดอ่านได้จาก Upgrading to Drupal 8 uses migration approach

Drupal 8 Upgrade Path

ดังนั้น ในภาพรวมแล้ว เราต้องมี 2 ไซต์คือ D7 เดิมที่มีข้อมูลอยู่ (oldsite) และไซต์ D8 ว่างๆ ที่ติดตั้งเสร็จแล้วไม่ต้องทำอะไรกับมัน (newsite)

2 ไซต์ที่ว่าจะใช้ท่ายังไงก็ได้ แต่ถ้าอยู่บนโฮสต์เดียวกันก็จะง่ายหน่อย ผมใช้วิธีให้ isriya.com (ที่ย้ายโฮสต์แล้ว) เป็น oldsite และสร้าง subdomain ใหม่เป็น d8.isriya.com สำหรับ newsite

ข้อจำกัดของการ Migrate

เนื่องจาก Drupal 8 มีปัญหาเรื่อง compatibility เยอะมากๆ (ผมจนแทบจะเลิกใช้ไป และมีทีมงานบางส่วนไม่พอใจแนวทางของ D8 ถึงขั้นแยกไปทำ CMS ตัวใหม่ชื่อ Backdrop ที่อยู่บนฐานของ Drupal 7) การ migrate จาก D7 เป็น D8 จึงมีปัญหาจุกจิกมากมาย ส่วนจะมากแค่ไหนขึ้นกับปริมาณโมดูลที่ใช้บน D7 เพราะไม่ใช่ว่าทุกโมดูลพร้อมสำหรับการอัพเกรดเป็น D8

แม้ว่า Drupal 8 จะออกตัวจริงมาแล้วถึง 2 ปี (November 2015) แต่ความพร้อมในการอัพเกรดจาก D7 เป็น D8 ก็ยังไม่สมบูรณ์ 100% อยู่ดี ยังห่างไกลกับความจริงอยู่มาก ในประกาศของ Drupal 8.4 เวอร์ชันล่าสุดขณะที่เขียนโพสต์นี้ (October 2017) ก็ยังเขียนไว้ชัดเจนว่า

Most high-priority migrations from Drupal 7 to 8 are now available, but the migration path is still not complete, especially for multilingual sites, so you may encounter errors or missing migrations when you try to migrate. That said, since your Drupal 7 site can remain up and running while you test migrating into a new Drupal 8 site, you can help us stabilize the Drupal 7 to Drupal 8 migration path! 

ดังนั้นประสบการณ์ในการอัพเกรดเป็น D8 ของแต่ละคนจึงแตกต่างกันไป ผมเองพยายามอัพเกรดบล็อกอันนี้อยู่หลายรอบก็ไม่สำเร็จ (แม้ว่าใช้โมดูลไม่เยอะก็ตาม) มาสำเร็จเอารอบนี้แต่กว่าจะทำได้ก็ลำบากมิใช่น้อย (ถ้าเป็นเว็บใหญ่ๆ แบบ Blognone คงไม่กล้าทำ และอยู่กับ D7 ไปจนกว่าจะหมดอายุขัย)

เตรียมความพร้อมเว็บเก่า

สิ่งแรกที่ต้องทำเป็นอย่างยิ่งคือ backup ครับ ปกติแล้วเวลาผมอัพเกรด CMS มักขี้เกียจแบ็คอัพ เพราะไม่ค่อยมีปัญหาอะไรซีเรียส แต่การอัพเป็น D8 มีขวากหนามเยอะมาก ต้องทำ full backup ทั้งไฟล์และฐานข้อมูลเก็บรักษาไว้อย่างดี ตลอดกระบวนการที่ทำมา ต้อง restore จากแบ็คอัพมาใช้อยู่หลายรอบทีเดียว

ขั้นถัดมาคือ สำรวจว่าไซต์ D7 ของเราใช้โมดูลอะไรบ้าง มีโมดูลอะไรบ้างที่ไม่จำเป็น และโมดูลอะไรบ้างที่ย้ายจาก contributed ของ D7 ไปสู่ core ของ D8 (เช่น Views) อันนี้ต้องสำรวจข้อมูลในโลกของ Drupal ไว้สักหน่อย เพราะส่วนใหญ่แล้วโมดูลที่เป็น contributed นี่แหละที่มักจะมีปัญหาอัพเกรดไม่ได้

รายละเอียดอ่านใน Preparing a site for upgrade to Drupal 8

เนื่องจากบล็อก isriya.com เป็นบล็อกที่เขียนคนเดียว แทบไม่ได้ใช้โมดูลภายนอกอะไรมากนัก พวกโมดูลเสริมความสวยงามหรือฟีเจอร์บางอย่าง (เช่น ปุ่มแชร์ FB/TW) ก็ไม่ได้สำคัญเท่าไร โมดูลที่จำเป็นต้องใช้จริงๆ มีแค่

  • Blog (Core ใน D7 แต่ถูกถอดออกใน D8)
  • Markdown (Contributed แต่มีทั้งเวอร์ชัน D7/D8)

ส่วนธีมนี่เป็นเรื่องใหญ่กว่าโมดูลด้วยซ้ำ เพราะ D8 เปลี่ยนมาใช้ระบบธีมแบบใหม่ที่ใช้ของเก่าไม่ได้เลย ถ้าใช้ธีมทำเอง (custom theme) คงเจอปัญหาหนักมาก เผอิญว่าเราไม่ซีเรียสเรื่อง look & feel ของบล็อกอันนี้มากนัก เลยหาธีมใหม่ของ D8 รอเอาไว้เลย

เมื่อสำรวจความเป็นไปได้ต่างๆ ครบหมดแล้ว ให้เตรียมเว็บเก่าดังนี้

  • อัพเดต Drupal 7 และโมดูลทุกตัวให้เป็นเวอร์ชันล่าสุด
  • ปรับเป็น maintenance mode
  • ปิดโมดูลทุกตัวที่เป็น non-core
  • ปิดการทำงานของ clean URL
  • ลบไฟล์ temp ต่างๆ ในระบบไฟล์ออก

จากการทดลองหลายรอบ ผมพบว่าโมดูล Blog นี่จริงๆ เราไม่ต้องใช้เพราะเขียนคนเดียว เลยปิดไปได้ (เนื้อหายังอยู่ครบ แค่ว่าไม่มีแยกบล็อกระหว่าง user แต่ละคน ซึ่งมีคนเดียวอยู่แล้วไม่เป็นไร) 

ส่วน Markdown ลองแล้วพบว่าไม่มี upgrade path ระหว่างเวอร์ชัน (แม้เป็นโมดูลตัวเดียวกันก็ตาม) และการเปิดทิ้งไว้ระหว่างอัพเกรดกลับสร้างปัญหา เลยเลือกปิดการทำงานของ Markdown ไปก่อนอัพเกรดด้วย 

สรุปว่าต้องปิดเกือบทุกอย่าง เหลือโมดูล Core ที่จำเป็นจริงๆ เท่านั้น

สร้างเว็บใหม่ที่เป็น Drupal 8

ขั้นนี้ค่อนข้างง่าย ให้เราสร้างเว็บใหม่ขึ้นมาหนึ่งอัน แล้วติดตั้ง Drupal 8 เปล่าๆ ลงไป (ถ้าไม่เคยทำ ควรซ้อมทำก่อน อ่านใน Installing Drupal 8)

เผอิญว่าโฮสต์ที่ใช้เป็น Plesk สามารถติดตั้ง CMS ยอดนิยมอย่าง WordPress, Drupal, Joomla ได้จากหน้าจัดการของ Plesk เลย ก็ไม่มีอะไรยากครับ สร้าง subdomain อันใหม่ขึ้นมา (สมมติว่าเป็น d8.isriya.com) แล้วคลิกเพื่อติดตั้งแอพพลิเคชัน Drupal 8

เมื่อติดตั้งเรียบร้อยแล้ว ให้ล็อกอินเข้าหน้า Admin ของ Drupal 8 แล้วเปิดโมดูล 3 ตัวคือ Migrate, Migrate Drupal, Migrate Drupal UI

Migrate Modules

Drupal จะถามย้ำเราหน่อยว่ายังเป็นโมดูล experimental นะ แน่ใจเหรอ (ก็แหงสิ พวกแกทำกันไม่เสร็จสักทีนี่นา) พอติดตั้งเรียบร้อยแล้ว จะมีลิงก์ให้กดเข้าสู่หน้าอัพเกรด (หรือจะเข้าผ่าน sitename.com/upgrade ก็ได้)

เริ่มกระบวนการ Migrate

การ Migrate ทำได้สองวิธีคือผ่านหน้าเว็บ และผ่าน Drush กรณีนี้เราทำผ่านหน้าเว็บนะครับ รายละเอียดอ่านจาก Upgrade using web browser

เมื่อเข้าสู่หน้า Upgrade เราจะเห็นหน้าจอตามภาพ

Drupal 8 Upgrade Process

สิ่งที่ต้องใส่คือ Database ของเว็บเก่า ใส่ผู้ใช้-รหัสผ่าน-เลขพอร์ตให้เรียบร้อย ถ้าอยู่บนโฮสต์เดียวกันก็ใส่เป็น localhost ได้เลย

อีกช่องที่ต้องใส่คือ Source Files ซึ่งกรณีส่วนใหญ่เราใช้แต่ Public Files อยู่แล้ว ก็ใส่ URL ของเว็บต้นทางได้เลย (ช่อง Private file ก็ปล่อยว่างไว้ได้)

เสร็จแล้วก็กดปุ่ม Review Upgrade ระบบของ D8 จะอ่านข้อมูลจากเว็บ D7 มาดูว่าอัพเกรดไหวรึเปล่า

Drupal 8 Module Path

จากภาพจะเห็นว่าของเรามีโมดูลที่ไม่มี upgrade path อยู่ 5 ตัว (ภาพนี้ยังมี markdown อยู่ แต่หลังทดลองอัพเกรดแล้ว พบว่าปิดไปแต่แรกเลยดีกว่า) ถึงแม้เป็นโมดูลในกลุ่ม Core แต่ก็ไม่ใช่ตัวสำคัญ ดังนั้นเราเดินหน้าลุยสั่งอัพเกรดเลย

พร้อมแล้วก็สั่ง Perform Upgrade แล้วสวดภาวนาครับ (จริงๆ นะ) ถ้าไม่ซวยจนเกินไป นั่งรอสักพักใหญ่ๆ กระบวนการอัพเกรดจะรันไปเองจนเสร็จ เราจะได้เว็บเวอร์ชัน D8 ที่ทำงานได้ (บ้าง) มาใช้งาน

จากประสบการณ์ลองอัพเกรดหลายรอบ ผมเจอปัญหาจุกจิกบางอย่าง เช่น เว็บ D7 ไม่สามารถเขียน tmp file ได้เพราะไม่มีโฟลเดอร์ tmp ซึ่งในการใช้งานจริงไม่มีปัญหาอะไร แต่ตอนสั่งอัพเกรดกลับทำให้ process ตายกลางทาง ต้องไปแก้ D7 ให้สะอาดปลอดภัยก่อนแล้วค่อยสั่งอัพเกรด

ความห่วยของ D8 migrate module คือ ถ้าระหว่างกระบวนการอัพเกรดเกิดตายกลางทางขึ้นมา ไม่มีวิธีย้อนกลับด้วยนะครับ ทางออกเดียวคือต้องล้างทั้งไซต์ D8 แล้วติดตั้ง D8 ใหม่ เปิดใช้โมดูล migrate ใหม่หมด เสียเวลามาก เป็นความเจ็บปวด ~~~

ปรับแต่งเว็บไซต์ Drupal 8

ถ้าผ่านกระบวนการ upgrade process มาได้แล้ว เราจะได้เว็บไซต์ D8 ที่ค่อนข้างเพียวๆ ทำอะไรไม่ได้มากนัก สิ่งที่ต้องทำคือติดตั้งโมดูลเสริมความสามารถของ D8 กลับคืนเข้าไป

กรณีของบล็อกนี้ใช้โมดูลสำคัญตัวเดียวคือ Markdown

Markdown Module for Drupal 8

วิธีการติดตั้งไม่มีอะไรยาก ดาวน์โหลด Markdown จากเว็บไซต์ Drupal แล้วติดตั้งตามระบบโมดูลปกติ แต่กลับพบปัญหาว่ามันทำงานไม่ได้

สาเหตุเกิดจาก Markdown Module ทำหน้าที่เป็นตัวเรียกไลบรารี Markdown ของ PHP อีกที ซึ่งกระบวนการเรียกของ D7 และ D8 ต่างกันอยู่บ้าง

PHP Markdown Missing

ในกรณี D8 จะพยายามให้เราติดตั้ง PHP Markdown ผ่าน PHP Composer (ตัวจัดการแพ็กเกจของ PHP) แต่เนื่องจากโฮสต์ที่ใช้เป็น Plesk เลยไม่สามารถติดตั้ง PHP Composer ไปตรงๆ ได้

แต่ Plesk ก็เอื้อให้เราติดตั้งแพ็กเกจของ Composer ผ่านหน้าเว็บของ Plesk เองได้ (วิธีการ) อย่างไรก็ตาม ผมลองติดตั้ง PHP Markdown ผ่าน Plesk Composer แล้วกลับไม่เป็นผล ตัว Drupal 8 ก็ยังมองหา PHP Markdown ไม่เจออยู่ดี (ยังหาคำอธิบายไม่ได้ว่าเป็นเพราะอะไร) เสียเวลาตรงนี้อยู่หลายวัน เลยต้องใช้ทางเลือกอื่นแทน (ข้อมูลจาก Readme ของ Markdown Module)

Plesk PHP Composer

ทางเลือกที่สองคือติดตั้งไลบรารี PHP Markdown ด้วยตัวเอง แล้วเรียกใช้ผ่านโมดูล Libraries API (รายละเอียด)

ขั้นตอนคือ

  • ติดตั้งโมดูล Libraries API (เวอร์ชัน 8 ยังไม่เสถียรสักที แต่ก็ใช้งานได้)
  • สร้างโฟลเดอร์ sites/all/libraries
  • ดาวน์โหลด PHP Markdown ตามลิงก์
  • แตกไฟล์ ZIP จะได้โฟลเดอร์ชื่อ php-markdown-lib
  • เปลี่ยนชื่อเป็น php-markdown ไม่ต้องมี lib (เสียเวลาหาวิธีแก้ตรงนี้นานมาก)
  • ย้ายโฟลเดอร์ php-markdown ไปใส่ไว้ใน sites/all/libraries

เท่านี้ Markdown น่าจะทำงานได้แล้ว (ในข้อความเตือนว่ามองไม่เห็น PHP Markdown ในหน้า error น่าจะหายไป) เราไปเปิดใช้ input format เป็น Markdown ได้เลย

ที่เหลือก็เป็นการเพิ่มโมดูลอื่นๆ ของ Drupal 8 ที่ตรงไปตรงมากว่า เช่น Google Analytics, Disqus ตรงนี้คงทำกันเองได้ไม่ยากครับ

สรุป

ประสบการณ์อัพเกรดจาก Drupal 7 เป็น Drupal 8 ของผมค่อนข้างโหดร้ายทีเดียว ปัญหาจุกจิกเยอะมาก ขนาดเว็บไม่ค่อยมีอะไรซับซ้อน ตรงนี้จึงไม่น่าแปลกใจนักว่าทำไมชุมชน Drupal ถึงแตกแยกมากเรื่อง Drupal 8 เพราะทีมงานหลักไปใส่ใจกับปัญหาเชิงโครงสร้างของระบบ โดยละเลยเรื่อง UX ในการอัพเกรดไป

ปัญหาของ D8 ส่งผลให้ตอนแรกคิดจะย้ายไปใช้ Backdrop ด้วยซ้ำ เพราะอัพเกรดจาก D7 ไปง่ายกว่ามาก (โครงสร้างตัวเดียวกัน) แต่ก็ยังกังวลเรื่อง commitment ของโครงการในระยะยาว ว่าจะอยู่ไปได้นานแค่ไหน

สำหรับเว็บอื่นๆ ที่เป็น D7 คิดว่ายังคงความเป็น D7 ต่อไปได้อีกเรื่อยๆ จนกว่าจะหมดอายุขัย (น่าจะอีกหลายปีเพราะต้องรอ Drupal 9 ออก) แต่เมื่อถึงเวลาอัพเกรดแล้วก็มีความเจ็บปวดอีกมากแน่นอน (เรื่องธีมนี่คงต้องทำธีมของ D8 รอไว้เลย ตอนย้ายจะได้ไม่เสียเวลา)

Keyword