ติดตั้ง UserGrid ด้วย Docker Container

อยากสร้าง App บนมือถือ แต่ไม่อยากยุ่งยากจัดการ User, ทำระบบ Login, ฐานข้อมูล, เขียนเชื่อมต่อฐานข้อมูล แถมต้องใช้ได้กับทุก Platform มีอะไรที่จัดการให้หมดเลยไหม

             Apache usergrid [1] เป็นทางออกหนึ่งสำหรับผู้ที่ไม่อยากยุ่งยากในการจัดการในส่วนของ Server-Side Code และเน้นในการเขียน Application ในการใช้งานเพียงอย่างเดียว โดย usergrid ชื่อก็บอกเป็นนัย ๆ อยู่แล้วครับ ว่าเป็นระบบจัดการ User ทั้งการเข้าถึงรวมถึงการกำหนดสิทธิในการใช้งาน แต่จะมีในส่วนของระบบฐานข้อมูล Application ไว้ให้ใช้งานด้วย โดยฐานข้อมูลจะเป็น nosql ซึ่งจะมีเครื่องมือในการ query เบื้องต้น, Rest Service และ SDK สำหรับพัฒนาในอุปกรณ์มือถือ และสามารถใช้ในการพัฒนา Application ด้วยภาษาต่าง ๆ มากมาย สามารถเข้าไปอ่านเพิ่มเติมได้ที่ http://usergrid.apache.org/

            สำหรับวิธีลงมีหลายแบบ แต่ที่จะแนะนำจะเป็นการติดตั้งเป็น Container ด้วย Docker[2] ซึ่งสิ่งที่ต้องการใช้งานมีดังนี้

  • Java – Ubuntu base image with Oracle JVM : สำหรับใช้ Run ระบบ เท่าที่ติดตั้งไม่ลงตัวนี้ก็สามารถใช้งานได้
  • Cassandra : ระบบฐานข้อมูล nosql
  • Elasticsearch : ระบบค้นหาแบบ distributed search ลองนึกถึงการ search ที่ทุก field ทำ index ไว้หมดซึ่งเร็วแน่นอน
  • Usergrid : ระบบ Core Engine ซึ่งจะให้บริการผ่าน RESTful API (เทียบได้กับ Web Service แต่ยืนหยุ่นกว่าและคุยด้วย json)
  • Usergrid Admin Portal : เป็น Web Site ที่ใช้ในการบริหารจัดการข้อมูล กำหนดสิทธิ์ และสามารถ Query ข้อมูลเบื้องต้นได้ 

1. ทำการติดตั้ง OS และ Docker (อ่านเพิ่มเติมได้จาก sysadmin.psu.ac.th[3]) แต่จากตัวอย่างจะรันด้วย PhotonOS[4] เนื่องจากมีขนาดเล็กและเหมาะกับการใช้งานกับ Vmware มากกว่า (ติดตั้งด้วย .ova) แต่สามารถติดตั้งผ่าน Linux Distribution อื่นได้ด้วยคำสั่งเดียวกัน

2. ติดตั้งฐานข้อมูล cassandra ด้วยคำสั่งดังนี้ (ในกรณีที่ต้องการติดตั้งแบบ cluster สามารถศึกษา option ได้จาก website ข้างต้น[2])

docker run --detach --name cassandra --volume $(pwd)/cassandra-data:/var/lib/cassandra yep1/usergrid-cassandra

            โดยสำหรับ option –volume หน้า : คือ path ของเครื่อง Host, หลัง : จะเป็น path ใน containner ในกรณีที่ลบ containner หรือ update software  ใน containner ข้อมูลในฐานข้อมูลจะได้ไม่หาย

2. ติดตั้งระบบค้นหา Elasticsearch ด้วยคำสั่งดังนี้

docker run --detach --name elasticsearch --volume $(pwd)/elasticsearch-data:/data yep1/usergrid-elasticsearch

3. ติดตั้ง Usergrid ด้วยคำสั่งดังนี้

docker run --detach --name usergrid --env ADMIN_PASS=password --env ORG_NAME=org --env APP_NAME=app --link elasticsearch:elasticsearch --link cassandra:cassandra -p 8080:8080 yep1/usergrid

            ให้ตั้งค่า ADMIN_PASS ซึ่งเมื่อตั้งแล้วจะเป็นเป็นรหัสผ่านเดียวกับ Usergrid-Portal ในส่วนของ ORG_NAME จะเป็นการแบ่ง Zone ของโปรแกรมที่เกิดขึ้นเมื่อมีการใช้งานจริง เราสามารถกำหนดผู้ใช้งานให้เห็นแค่ Zone ตัวเองได้ ในส่วนของ APP_NAME ไว้สำหรับสร้าง Application ย่อย ๆ ใน Zone นั้น ๆ -p ใช้สำหรับกำหนด Port ข้างในข้างนอก ไม่แนะนำให้ตั้ง 80 หรือ 443 เพราะยังต้องติดตั้ง Usergrid-Portal เป็นหน้าบริหารจัดการที่ควรใช้ได้ใช้ port 80,443 มากกว่า

            ซึ่งการติดตั้ง Usergrid Core Engine จะ require cassandra และ elasticsearch ที่ได้ติดตั้งไว้แล้ว โดยใช้ผ่านคำสั่ง –link จะเห็นว่าแต่ละโปรแกรมแยกออกจากกัน โดยอาจจะรันบนคนละ containner os หรือคนละสภาพแวดล้อมก็ได้ โดยไม่เกี่ยวข้องกัน แต่จะมีการเรียกใช้ผ่าน port ตามปกติ แค่เปรียบเสมือนอยู่กันคนละเครื่อง (เหมือนลงบน VM หลาย ๆ  VM แต่ถ้าเป็น VM จะใช้ Resource เยอะ เพราะหมดไปกับ OS ที่สำคัญแต่ละโปรแกรมต้องลงเองทั้งหมด ไม่ได้มีคนทำ software มาเป็น image ที่เปิดใช้งานได้เพียงไม่กี่วินาทีเหมือนใน containner)

4. สุดท้ายคือทำการติดตั้ง Usergrid-Portal ซึ่งเป็น Web ที่ใช้สำหรับการตั้งค่าในส่วนต่าง ๆ และมีเครื่องมือ Query เบื้องต้นให้ใช้งาน

docker run -d --env USERGRID_HOST=192.168.x.y:8080 -p 8088:80 yep1/usergrid-portal

             Host ให้ตั้งเป็น IP Public ในกรณีที่มีการ Nat ไปยัง IP จริง หรือทำ HA-PROXY เพื่อเข้าถึงจากเน็ตภายนอกได้ (ในกรณีที่ไม่แยกวงภายใน ภายนอกก็สามารถใช้งาน IP ของ Host ได้เลย) จากคำสั่งอธิบายได้ดังนี้

-d ==> เนื่องจากคนทำ image สั่งให้รัน debug หลังจาก start image ถ้าไม่ใส่จะค้างไม่ออกมาจาก debug จึงต้องรันแบบ background
-p 8088:80 ==> ให้ map หน้า web จาก port 80 ใน containner ไปเป็น port 8088 บนเครื่อง Host

USERGRID_HOST=192.168.x.y:8080 ==> เมื่อเปิดหน้า web มาแล้วด้วย port 8088 หลังจาก Login เสร็จให้ไปเรียก Core Engine ผ่าน port 8080


หมายเหตุ
 : การเปิด port ในตัว containner เปิดกี่ port ก็ได้ตามสบาย แต่ port บน host ต้องไม่ชนกัน ดูได้จากคำสั่ง docker ps

 

หน้าตาโปรแกรม

 

ในตอนหน้าจะมาพูดถึงวิธีการใช้งานกันครับ……

=================================================

References :
[1] http://usergrid.apache.org

[2] https://github.com/yep/usergrid-docker

[3] https://sysadmin.psu.ac.th/2017/01/03/docker-ubuntu-16-04/

[4] https://vmware.github.io/photon/