ประสบการณ์วร้ายๆ กับระบบ PopularVote IT3K #16 (Infrastructure)

Kao Tu Patthraphorn
Alchemist
Published in
4 min readFeb 16, 2019

--

สวัสดีงับ ครั้งนี้เราจะมาเล่าประสบการณ์ การทำระบบ IT3K #16 กัน นี่ก็เป็นการเขียนครั้งที่ 2 แล้ว ขอบอกก่อนว่า IT3K คืออะไร? มันคือการเอาเด็ก IT ทั้ง 3 พระจอมมาร่วมเล่นกีฬากัน แต่ไม่ใช่แค่กีฬายังมีการประกวดหลีด สแตนเชียร์ สันทนาการ และดาว เดือน ซึ่งมันคือไฮไลท์ของงานนี้เลย จึงทำให้เกิดระบบนี้ขึ้นมา แต่ไม่ได้มีแค่ vote นะ เดี๋ยวแยกย่อยให้

ขอบคุณรูปภาพจากเพจ IT3K

เรามี service ที่ต้องให้บริการทั้งหมด 4 service

  • Homepage : เป็นหน้า ที่ตามจริงทุกคนต้องเข้าผ่านหน้านี้ไปก่อนไป service อื่นๆ
  • Timer : อันนี้เอาไว้จับเวลา show บน projector
  • Score board : เอาไว้ติดตามผลคะแนน
  • Popular Vote (ไฮไลท์สุด เต็มที่สุด) : เอาไว้ให้คะแนนดาว เดือนที่เราถูกใจ

service ที่เรารับผิดชอบมี 3 service มี homepage, timer, popular vote ส่วน score board เพื่อนเรารับผิดชอบ ส่วน stack dev ที่ใช้ก็มี next.js(fe), react.js(fe), laravel(api), socket.io (ฮ่าาาา socket ตัวรว้ายยย555+)

รอบนี้เรามีเวลาประมาณ 2 อาทิตย์ หลังได้รับ task งานมา(จากครั้งที่แล้ว 1 เดือน) แต่ทุกอย่างถูกเตรียมไว้เกือบหมดแล้ว เช่น มีเครื่อง server ของคณะให้พร้อมแล้ว ด้วยความที่ว่าช่วงนี้เห่อ docker เลยอยาก deploy บน docker ให้ได้ทุก service

digram ประมาณนี้แหละ (ส่วนของเครื่องที่ขอจากคณะมา)

เตรียมเครื่อง develop

ในเมื่อเครื่อง Production มาแล้ว แต่เราก็ต้องลองไป deploy บนเครื่อง dev ซึ่งเครื่องเราเลือกใช้จาก GCP ด้วยการที่พี่ปุ๊ให้กดเครื่องมาใช้ได้ ก็เลยจัดการกดมา เตรียมลง docker, nginx, mariadb ไว้บนเครื่อง จากนั้นเราก็ไปทำ Dockerfile (ง่อว เขียนคล่องขึ้นแล้ว) ทำการ push ขึ้นบน repo ที่จะใช้ แล้วก็จัดการกับ DB บนเครื่องเรียบร้อย เราทำการ deploy popular vote ก่อน เราเริ่มจาก deploy api ก่อน base image มาจากของ WIP ซึ่งพี่ปุ๊เป็นคนทำ api build & run ด้วย docker ได้ แต่ติดตรงที่เชื่อม db ไม่ติด ไม่สามารถ migrate ได้ jwt error (ซะงั้น) ตาม ฝั่ง dev กันมาเลยทีนี้ เพื่อนฝั่ง dev ก็แก้อย่างรวดเร็ว ขอบคุณมันมากจริงๆ มันอ่าน error ได้แล้ว555+ พอแก้เสร็จ db ก็ migrate seed ได้สบาย555+ ส่วน DB เราจะติดตั้งไว้บน host เลย จะไม่ยุ่งกับ docker เพราะมันอันตรายย ._.

ต่อจากนั้นเราก็มา deploy socket และ front-end มีปัญหาบ้าง เช่นลืม config nginx สำหรับ socket.io ฮ่าาา เราจะ check จากการ inspect หน้า web ดูว่ามีอะไร error มั้ยจากนั้นพอมั่นใจว่าโอเค deploy ได้ไม่มีปัญหาตัวแอพ run ได้ปกติ socket.io ต่อติด สามารถ control จากอีก path นึงได้ ก็เริ่มไปจัดการ deploy บน Production เพราะกลัวไม่ทัน…

พร้อมขึ้น Production!

ผ่างงงง! ติดปัญหากับ socket.io เพราะ server ที่ขอคณะมาเขาลืม config ให้ฝั่งเรานิดหน่อย เราก็บอกพี่ปุ๊เลยว่าเกิด error แบบนี้นะ และพี่ปุ๊ก็สอน proof ว่าทางคณะลืมจริงมั้ย โดยแก้ format log nginx ให้ส่งตัวแปร HTTP_UPGRADE มา check จากนั้นก็มั่นใจว่าไม่ใช่ฝั่งเราล่ะ พี่ปุ๊ก็ได้ส่งเรื่องไปให้ทาง infra ของคณะ config เพิ่ม ฝั่งเราก็ทำการ check config nginx อย่างดีหมดเรียบร้อย เป็นอันถือว่าระบบ vote ขึ้น production เรียบร้อยแล้ว 1 ครั้ง

กลับมาที่เครื่อง dev เราได้ทำ shell script สำหรับ pull project & build & run docker container และได้ทำการลองใช้กับเครื่อง dev เป็นการ test การ update code โดยใช้ shell script (อยากใช้ jenkins นะ แต่มัน private server คณะ ถ้าใครมีท่าดีๆ หลังไมค์มาได้) จากนั้นเราก็สลับไปเครื่อง production เอา script update code มาใช้ เจี่ยมม! รอยังเดียว… ช่วงนั้นมีวันว่าง (จริงๆ ก็ไม่ว่างหรอกเพราะตอนนี้เราทำอยู่ 2 งาน คือ WIP Camp กับ IT3K)

อ่าาทีนี้ว้อนอยากทำ EFK Stack (omg) นั่งอ่านนั่งทำอยู่ 4 วันเต็ม basic config EFK ได้แล้ววว แต่ๆๆๆๆ 4 วันที่หายไปก็คือใกล้งานวันจริงแล้ว5555555 สุดท้าย EFK Stack ก็ไม่ได้ใช้ เพราะไม่ทัน ความตั้งใจคือจะเอามันขึ้น docker ให้ได้ ._.

กลับมาที่การ deploy service ต่อ

ใกล้แล้วที่จะถึงงานวันจริง ตอนนั้นลืมด้วยว่ามี service timer แต่อยู่ดีๆ เพื่อนฝั่ง dev ก็โยน repo มาให้ ฝั่งนั้นเพิ่งปั่นมาสดๆ ร้อนๆ555555 ฝั่ง infra ก็จัดการเขียน Dockerfile และ push ขึ้น git hub เขียน shell script การ update เรียบร้อย เตรียมการ config nginx และรอบนี้ไม่ลืมการ config socket.io แล้ว เป็นการ deploy ครั้งเดียว socket.io ติด สามารถ run app ได้ปกติ อิอิ สบายใจ

จากนั้นตามมาด้วยหน้า homepage ก็ถือว่าเป็นอีก 1 service เช่นเดียวกันทำ step เดิม เขียน Dockerfile -> git push -> deploy ด้วย docker รอบเดียวจบ ได้หน้า homepage สวยๆ มาชม จากนั้น dev ก็มีอัพเดต code เรื่อยๆ ส่วน infra ก็ได้คำแนะนำจากพี่ปุ๊ว่าจะ optimize server ให้มีประสิทธิภาพ และเราได้ config ในเรื่องของ socket ให้ connect ได้มากขึ้น ต่างฝ่ายต่างทำงานไป

วันสุดท้ายก่อนวันงานจริง

ตอนเช้าวันนั้น มีนัดไปติดตั้ง wifi ที่โรงยิมของ ม. (ความที่เป็นเด็ก infra เลยอยากทำ อยากทำมันทุกอย่าง) เรากับเพื่อนในทีมก็ขนของกันไปติดตั้ง แต่ก็มีการ config switch เพิ่ม เพิ่มพวก port trunk ที่ tag vlan ของ ม. มาที่โรงยิม ใช้เวลา config ไม่นานมาก แต่ใช้เวลาหาวงเน็ตนานอยู่ พี่ที่คุมการติดตั้งครั้งนี้ก็คือ พี่ปุ๊คนดีคนเดิม -0- และมี step การ config ที่อาจารย์พี่บาสให้ทำ บวกกับเพื่อนในทีมที่ดี ทีมเราก็ช่วยๆ กันจนสามารถ config และ set up ระบบ wifi ขึ้นทั้งหมด จากนั้นในส่วนของ wifi เพื่อนในทีม(ไบร์ท) ก็รับไปทำ manage wifi ได้ดีอยู่ แม่งไบร์ทสมชื่อมันจริมๆ -0-

ส่วนในตอนเย็น ทั้งทีม dev ก็มีนัดขึ้นไป test ระบบ อห. รู้เรื่องเลย socket.io ดีเลย์ กดส่ง socket.io แล้วมันไม่เปลี่ยน path ให้เลย มันดีเลย์มากๆ แอพมีปัญหากับ iphone บ้าง หลายสาเหตุที่เราคุมไม่ได้ ตอนนั้นใจไม่ดีล่ะ พอ test ระบบเสร็จ ทั้งทีมก็ลงมาแก้บั๊ค ปรับ performance แอพต่อ แล้วก็ test ทำ test ซึ่งคน test ก็คือคนในทีมแถมต่อ wifi ในคณะด้วย มันก็เร็วสิครับ ไหลลื่นตาม flow ที่ต้องการ แฮปปี้~~

2/2/62

วันงานก็มาถึงทุก service เกือบได้ใช้หมด ยิ่งระบบ score board ทำให้กรรมการฝ่ายกีฬาดูจะแฮปปี้มากๆ เพราะคะแนนเกือบๆ real time และยังมีสิ่งที่หน้าสนใจอีกอย่างนึงคือ เครื่องกดรับ username password wifi ที่ทางเราได้เตรียมให้ซึ่งคนเตรียมก็คือพี่ปุ๊55555 เดี๋ยวทิ้งวาปตัวอย่างไว้ด้านล่าง blog นี้นะจ๊ะๆ กลับมาต่อๆ timer ก็ได้ใช้ตอนแข่งหลีด สแตนเชียร์ เอาไว้จับเวลา คือทุกอย่างขึ้นอยู่กับจอ projector เกือบหมดต้องขอบคุณเพื่อนที่นั่ง support ตรงจอ projector ด้วย

ใช้ socket.io คุมจากอีกหน้านึง แบบนี้แต่ฉายขึ้นบนจอใหญ่

ถึงคิวพระเอกของงานนี้ระบบโหวตดาว เดือน พอ mc ประกาศชื่อ website request ก็ถูกยิงเข้ามาอย่างรวดเร็ว

request ที่ยิงเข้ามาหน้าแรก ในรอบแรก ดูจาก log ของ socket ที่ dev เขียนไว้

mc ก็ประกาศว่าเรากำลังจะโหวตรอบที่ 1 ทุกคนที่เข้ามาโหวตต้อง login ผ่าน facebook และทำการเลือกคนที่ต้องการจะโหวต ช่วงนี้มีการ down ของ server ด้วยตอนนั้นหน้าเจือน หน้าเสีย ทำหน้าไม่ถูก ไม่เคยเจอมัน down จริงๆ แบบนี้5555

ช่วงที่กราฟหายไป ==

ตอนนั้นพี่เต้ก็เข้ามาดูอาการว่าเป็นยังไง หึๆ laravel block request มันรับ request พร้อมกันได้ 60 request/sec OMG ไปสิ้._. อ่ะๆ แก้โค้ด deploy ใหม่กดรัน script อย่างรวดเร็ว เกิดปัญหาหลายๆ อย่างขึ้น มันใช้เวลาสักพักในการแก้ไข mc ประกาศให้เล่นรอบใหม่ คนในหอประชุมก็เข้ามาโหวต บางคนโหวตได้บางคนไม่ได้ สาเหตุก็มีหลายสาเหตุ เช่น แอพมีปัญหากับ iphone, ใช้ 4G ของตัวเอง แล้วทำไมถึงใช้ 4G ของตัวเองไม่ได้ มันใช้ได้ แต่มันดีเลย์มาก อาจจะกดไม่ได้ในช่วงเวลาที่กำหนด และช่วงนั้นการประชาสัมพันธ์เรื่องมี wifi ให้ใช้ในหอประชุมที่น้อย ทำให้อีก 2 พระจอมไม่ค่อยได้รู้ว่าเราเตรียม provide ระบบ wifi ด้วย ช่วงนั้นกราฟใน zabbix ก็ขึ้นมาเป็นคลื่นลูกที่ 2 อีกครั้งแต่ครั้งนี้ไปรอด อิอิ และแล้วผลโหวตก็ออกมา ผ่างงง ตอนนั้นพี่เกมพี่ infra อีกคนก็มาบอกว่าดีแล้ว เรายังรับคลื่นลูกที่ 2 ได้จนจบ peak time สุดๆ เลยไปจ้ะ 2 รอบ จบ project popular vote แบบเศร้าๆ งงๆ ยอมรับเลยว่าน้ำตาไหล…

ขอบคุณรูปภาพจากตัวเอง… สวยนะ

ขอบคุณประสบการณ์ในครั้งนี้ ถึงจะบอกว่ามันร้ายแต่ในความร้ายนั้นก็ยังมีประสบการณ์ดีๆ ซ่อนอยู่ด้วย

แถมๆ ปัญหาหลายอย่างที่บอกไปข้างบน นี้คืออีกหนึ่งปัญหาที่เกี่ยวกับ wifi งานนี้ติด AP ทั้งหมดประมาณ 6 ตัว ซึ่งเปิดทั้ง 2.4 และ 5 GHz แต่ 5 GHz ช่องสัญญาของ 2 ตัวแรกในหอประชุมมันซ้อนกัน ทำให้ต้อง set up ตัว AP ใหม่ อันนี้ต้องขอบคุณไบร์ทที่เป็นคน check ให้ เลยเสียเวลาให้ AP reboot ด้วย ซึ่งอาจจะนี่อาจจะเป็นส่วนหนึ่งที่ทำให้ socket ดีเลย์ก็เป็นได้~~

โตขึ้นอีกขั้นนึงแล้ว มันยังต้องฝึกอีกเยอะ เรารู้ว่าเราเรียนรู้ช้า แต่เราจะพยายามเรียนรู้ให้ได้มากที่สุด เก็บเกี่ยวประสบการณ์ให้ได้เยอะที่สุด ท้ายนี้ตั้งแต่เราเข้ามาใน Alchemist เราได้เรียนรู้อะไรเยอะมาก ได้จับงานหลายงาน ถึงแม้จะไม่ได้เขียน blog แต่แอบฝึกตัวเองอยู่นาจาา ^^ ขอบคุณที่เข้ามาอ่านจนจบ ขอบคุณค่าาาา

วาปการรับรหัส wifi แบบเด็ก Alchemist : https://www.facebook.com/SIT.Family/posts/10156297762323789

Bye… 14/2/62

--

--