Deploy เว็บไซต์ ไปที่ DigitalOcean เมื่อเราเขียนเว็บไซต์ แล้ว ก็คงอยากที่จะ deploy เว็บไซต์ ขึ้นไปยัง web hosting เพื่อให้คนอื่นสามารถเข้าถึงเว็บไซต์ได้
บทความนี้จะมาแนะนำวิธีการ Deploy เว็บไซต์หรือการอัพโหลดเว็บไซต์เราไปที่เครื่อง Hosting นั่นเอง โดยใช้ ซึ่ง DigitalOcean คือ Cloud Hosting ซึ่งให้บริการคลาวด์เซิร์ฟเวอร์ (Cloud server) โดยให้เรามีสิทธิจัดการกับเครื่องได้ทุกอย่าง (Root Access) เปรียบเสมือนผู้ใช้งานมีเครื่องคอมพิวเตอร์อีกเครื่องไว้ใช้งานได้ สามารถสร้างเครื่องเพิ่มได้ตามความต้องการ (Droplet) ถูกออกแบบมาเพื่อให้ผู้ใช้งานคลาวด์ใช้งานได้อย่างสะดวกและง่าย
Droplet คือ Server แต่ละเครื่องที่ถูกสร้างขึ้นมา และทันทีที่สร้าง Droplet ขึ้นมา ก็จะได้ IP Assign ให้ทันที ต่างกับ AWS ที่ต้องผูก IP เอง เมื่อสร้างเครื่องขึ้นมาเราก็จะได้ IP มา 1 ไอพี พร้อมสำหรับใช้งาน และ ได้ account สำหรับ SSH เพื่อเข้าไปจัดการเครื่องของเราได้เลย
ข้อกำหนดเบื้องต้น
ข้อกำหนดสำหรับบทความนี้คือ คุณต้องติดตั้ง Go บนคอมพิวเตอร์ของคุณตามบทความ ติดตั้ง Go บน Mac และ คุณคุ้นเคยกับรูปแบบและโครงสร้างของมัน มาก่อน
สร้างโปรเจค go-website
สร้างโปรเจคใหม่ ในตัวอย่างชื่อ go-website สร้างไฟล์ main.go เปิดเทอร์มินัลแล้วใช้คำสั่ง
go mod init go-website

ไฟล์ main.go เขียนโค้ดดังนี้
package main
import (
"fmt"
"net/http"
)
type page struct {
}
func (p page) ServeHTTP(w http.ResponseWriter, r *http.Request){
fmt.Fprint(w, "<h1>Hello World")
}
func main() {
var p page
err := http.ListenAndServe("localhost:3000", p)
checkError(err)
}
func checkError(err error) {
if err != nil {
panic(err)
}
}
ทดสอบการทำงาน go run main.go

ที่เว็บบราวเซอร์ป้อน http://localhost:3000/ จะได้ผลลัพธ์การทำงาน ตามรูปด้านล่าง

แก้ไขโค้ด ก่อน Deploy เว็บไซต์
ลบ localhost ออก


สมัครใช้งาน DigitalOcean
ไปที่ https://www.digitalocean.com/ สมัครใช้งานโดยระบบจะมีการทดสอบ การชำระเงินผ่านบัตรเครดิตหรือ บัตรเดบิตก่อน
เปิดใช้งาน คลาวด์เซิร์ฟเวอร์
ไปที่ https://cloud.digitalocean.com/ ที่เมนู Create เลือกไปที่ Droplets

ในตัวอย่างเลือก Ubuntu -> Basic -> 6/mo

เลือก Singapore -> SSH keys

สร้าง SSH Key ที่คอมของเรา
OpenSSH คือชุดเครื่องมือมาตรฐานสำหรับ การจัดการ SSH ในการเริ่มต้น ให้เปิดหน้าต่างเทอร์มินัลใหม่ ในหน้าต่างเทอร์มินัลใหม่ พิมพ์ cd .ssh แล้วเลือกคีย์ Enter
cd .ssh

ให้พิมพ์ ssh-keygen แล้วเลือกคีย์ Enter
ssh-keygen

ต่อไปคุณจะต้องกำหนดตำแหน่งที่คุณต้องการบันทึก คีย์ SSH ใหม่ ชื่อไฟล์เริ่มต้นและตำแหน่งจะแสดงในวงเล็บกลมในหน้าต่างเทอร์มินัล หากคุณต้องการบันทึกคีย์ของคุณไว้ที่อื่นและด้วยชื่อไฟล์อื่น ให้พิมพ์ตำแหน่งใหม่และชื่อไฟล์ที่นี่ ในตัวอย่างใช้ชื่อ mainkey จากนั้นเลือกคีย์ Enter

ต่อไป คุณจะต้องพิมพ์ข้อความรหัสผ่านเพื่อเข้ารหัสคีย์ส่วนตัวของคุณ (หากคุณต้องการใช้) พิมพ์ข้อความรหัสผ่านของคุณสองครั้ง หรือเลือกป้อน (enter) สองครั้งเพื่อเว้นว่างข้อความรหัสผ่านไว้



ใช้คำสั่ง ls ณ จุดนี้ คีย์ SSH ของคุณ จะถูกสร้างขึ้นในตำแหน่งบันทึกที่คุณระบุ และใช้ ชื่อไฟล์ mainkey เริ่มต้น สำหรับการเข้ารหัส RSA ( mainkey.pub สำหรับคีย์สาธารณะและ mainkey สำหรับคีย์ส่วนตัว)
ls

เปิดไฟล์ mainkey.pub ด้วยคำสั่ง
cat mainkey.pub

ก๊อบปี้ SSH Key ส่วนนี้เก็บไว้

สร้าง SSH Key ที่ DigitalOcean
คลิกที่ New SSH Key

นำ SSH Key ที่สร้างไว้ที่คอมของเรา วางไว้ที่ช่องบน และตั้งชื่อในตัวอย่างชื่อ mainkey2022 แล้วคลิก Add SSH Key

เลือก mainkey2022

คลิก Create Droplet

ในตัวอย่าง จะได้ IP มา 1 ไอพี คือ 167.172.85.72

Deploy เว็บไซต์ ไปที่ DigitalOcean
เข้าไปในโฟลเดอร์โปรเจคของเรา ในตัวอย่างชื่อ go-website

Deploy ไฟล์ main.go ไปที่ DigitalOcean
scp -i ~/.ssh/mainkey main.go root@167.172.85.72:

ถ้าไม่พบความผิดพลาดแสดงว่าชื่อมต่อกับ คลาวด์เซิร์ฟเวอร์ได้

เข้าไปที่ คลาวด์เซิร์ฟเวอร์
ssh -i ~/.ssh/mainkey root@167.172.85.72

แสดงการเชื่อมต่อกับ คลาวด์เซิร์ฟเวอร์

ใช้คำสั่ง ls จะพบไฟล์ main.go ที่เรา Deploy ขึ้นไป

ทำการอัพเดท คลาวด์เซิร์ฟเวอร์ ด้วยคำสั่ง
sudo apt update


ติดตั้ง Go
ติดตั้ง Go ด้วยคำสั่ง
sudo apt install golang


การ Build วิธีที่ 1
build บน เซิร์ฟเวอร์
go build -o webpage

ใช้คำสั่ง ls จะพบไฟล์ที่ build แล้วชื่อ webpage

การ Build วิธีที่ 2
build ด้วยเครื่องของเรา
GOOS=linux GOARCH=amd64 go build -o webpage

แล้ว deploy ไปที่ DigitalOcean ด้วยคำสั่ง
scp -i ~/.ssh/mainkey webpage root@167.172.85.72:

สั่งให้ทำงานด้วยคำสั่ง
./webpage

ที่เว็บบราวเซอร์ป้อน http://167.172.85.72:3000/ จะได้ผลลัพธ์การทำงาน ตามรูปด้านล่าง

ทดสอบหยุดการทำงาน ด้วยการ กด ctrl+c หรือ ปิดหน้าต่างเทอร์มินัล ลงไป

ผลลัพธ์การทำงาน เว็บไซต์จะหยุดการทำงาน ตามรูปด้านล่าง

สร้างเซอร์วิส รีสตาร์ทอัตโนมัติ
cd ../../etc/systemd/system

สร้างเซอร์วิส golangweb.service
sudo nano golangweb.service
[Unit]
Description = Go Server
[Service]
ExecStart=/root/webpage
User =root
Group =root
Restart=always
[Install]
WantedBy=multi-user.target
Save

รีสตาร์ทเซิฟเวอร์
sudo reboot

เชื่อมต่อ เซิร์ฟเวอร์
ssh -i ~/.ssh/mainkey root@167.172.85.72

เข้าไปที่ system
cd ../../etc/systemd/system

เปิดใช้งาน เซอร์วิส
sudo systemctl enable golangweb.service

เริ่มการทำงาน เซอร์วิส
sudo systemctl start golangweb.service

แสดง สถานะเซอร์วิส
sudo systemctl status golangweb.service

ถึงตอนนี้ ถ้ารีเฟรช เว็บบราวเซอร์ เว็บไซต์จะกลับมาทำงาน

หยุดการทำงาน ด้วยการ กด ctrl+c หรือ ปิดหน้าต่างเทอร์มินัล ลงไป

เว็บไซต์จะยังทำงานตามปรกติ

และเมื่อมีการรีสตาร์ทเซิฟเวอร์
sudo reboot

เว็บไซต์ก็ยังคงทำงานตามปรกติ
