Deployment 🚀

หลังจากเราสร้าง API ของเราเสร็จเรียบร้อยแล้ว ตอนนี้ API ของเราถูกรันบนเครื่องคอมพิวเตอร์ของเราเองอยู่ใช่มั้ยล่ะ ถ้าสมมติว่าเราปิดคอมพิวเตอร์ API ของเราก็จะถูกปิดไปพร้อมกัน ดังนั้นนอกจากเราจะต้องรู้วิธีพัฒนา API แล้ว เรายังต้องรู้วิธี Deploy Application ของเราด้วย

โดยในหัวข้อนี้ จะให้ทดลอง Deploy API บน Linux Server ทั้งในรูปแบบ Bare Metal และ Container

Pre-requisite ⛷️

  • Linux Server ที่สามารถ SSH เข้าไปได้ และมีสิทธิ์ root

  • FastAPI Source Code

Project Dependencies ‼️

ก่อนเราจะ Deploy Project เราต้องเข้าใจก่อนว่า Project ของเราอาจมี Dependency ต่าง ๆ มากมาย เช่น Library ที่เราติดตั้ง เป็นต้น ดังนั้น การจะนำ Source Code ไปรันบนอุปกรณ์อื่น ๆ นั้น จำเป็นต้องระบุด้วยว่า ต้องติดตั้ง Dependency อะไรบ้าง

สำหรับ Python สามารถ Export Dependencies ที่ใช้ใน Project ได้ (อย่าลืมว่าเราต้องอยู่ใน Virtual Environment นะ) โดยใช้คำสั่ง

pip freeze >> requirements.txt

เมื่อใช้คำสั่งด้านบน เราจะได้ไฟล์ requirements.txt ซึ่งภายในจะระบุ Dependencies และเวอร์ชันที่ต้องใช้ใน Project ด้านล่าง เป็นตัวอย่างไฟล์ requirements.txt

requirements.txt
annotated-types==0.7.0
anyio==4.6.2.post1
certifi==2024.8.30
click==8.1.7
colorama==0.4.6
dnspython==2.7.0
email_validator==2.2.0
fastapi==0.115.5
fastapi-cli==0.0.5
h11==0.14.0
httpcore==1.0.7
httptools==0.6.4
httpx==0.28.0
idna==3.10
Jinja2==3.1.4
markdown-it-py==3.0.0
MarkupSafe==3.0.2
mdurl==0.1.2
pydantic==2.10.2
pydantic_core==2.27.1
Pygments==2.18.0
python-dotenv==1.0.1
python-multipart==0.0.18
PyYAML==6.0.2
rich==13.9.4
shellingham==1.5.4
sniffio==1.3.1
starlette==0.41.3
typer==0.14.0
typing_extensions==4.12.2
uvicorn==0.32.1
watchfiles==1.0.0
websockets==14.1

โดยหากเรานำ Project นี้ ไปรันบนอุปกรณ์เครื่องอื่น ("Environment อื่น ๆ") เราจำเป็นต้องติดตั้ง Dependencies ก่อน โดยใช้คำสั่ง

นอกจาก Python แล้ว Framework อื่น ๆ ก็อาจมีอะไรคล้าย ๆ กัน เช่น package.json ใน node.js เป็นต้น

Bare Metal Deployment Ⓜ️

การ Deploy แบบ Bare Metal หมายถึงการติดตั้งและใช้งานซอฟต์แวร์หรือแอปพลิเคชันบนฮาร์ดแวร์จริงโดยตรง โดยไม่ผ่านชั้นของระบบเสมือนจริง (Virtualization) หรือระบบคลาวด์ เช่น VMware, Hyper-V, หรือแพลตฟอร์มคอนเทนเนอร์อย่าง Docker และ Kubernetes

อย่างไรก็ตาม ในหัวข้อนี้ เราจะมอง Linux Virtual Machine เป็น Physical Machine เพื่อให้เข้าใจหลักการของ Bare Metal Deployment

  1. เปิด Terminal และใช้คำสั่ง SSH ในการ Remote เข้าไปที่ Linux Server

  1. สร้าง Directory ใหม่ภายใน Linux Server

จากนั้น Navigate เข้าไปที่ Directory ที่เพิ่งสร้าง

สามารถใช้คำสั่ง pwd (Print Working Directory) เพื่อดูว่า ตอนนี้เราอยู่ที่ path ใดได้ ให้จำ Path นี้ไว้ดี ๆ เพราะเราจะต้อง Copy ไฟล์จากคอมพิวเตอร์ของเรา ขึ้นไปบน Linux Server กัน

/home/paratpanu.p/fastapi-deploy

  1. กลับมาที่ Workspace บนคอมพิวเตอร์เรา ซึ่งตอนนี้น่าจะมีหน้าตาประมาณนี้

เราจะใช้คำสั่ง scp เพื่อ Copy ไฟล์ทั้งหมด (ยกเว้น .venv) ไปบน Linux Server ดังนั้นตอนนี้ไฟล์ที่เราต้อง Copy ไปก็มีเพียง 2 ไฟล์ คือ main.py และ requirements.txt

โดยแทนที่ Path ด้วย Working Directory บนเครื่อง Linux Server ที่สร้างไว้ เช่น

โดยหลังจากรันคำสั่ง อาจต้องมีการใส่ Password ของ User ตัวเองก่อน

  1. ตรวจสอบ Workspace บน Linux Server ว่าเรา Copy ไฟล์มาสำเร็จหรือไม่

สังเกตว่า ไฟล์ทั้งสองที่เรา Copy จากคอมพิวเตอร์ของเรา อยู่บน Linux Server เรียบร้อยแล้ว

  1. ติดตั้ง Dependencies จากไฟล์ requirements.txt

บางครั้ง ระบบปฏิบัติการอาจะไม่ได้ติดตั้ง Python และ Python PIP มาให้ ทำให้เราจำเป็นต้องติดตั้งด้วยตนเอง

  1. ก่อนที่เราจะรัน API ของเรา เราต้องสร้าง Terminal Session ใหม่ขึ้นมาก่อน เนื่องจากถ้าเรารัน API บน Terminal Session ปัจจุบันของเรา สมมติว่าเรากดปิด Terminal ไป (ซึ่งเดี๋ยวยังไงเราก็ต้องปิด) Process ของ API ก็จะถูก Terminate ทันที ดังนั้น เราจะเปิด Session ใหม่กัน

จะได้ Terminal Session ใหม่ขึ้นมา

  1. รัน API ของเรากันเลย สำหรับการรันบน Production ซึ่งจะไม่ Reload เมื่อไฟล์มีการแก้ไข เราจะใช้คำสั่ง

สังเกตว่า API เรารันได้สำเร็จแล้ว !! จากนั้นเราจะออกจาก Terminal Session ปัจจุบันกัน (แต่เราไม่ได้ปิดมันทิ้งนะ) โดยกดปุ่ม Ctrl + A + D จะทำให้เรากลับมาที่ Terminal Session ก่อนหน้า

เราสามารถดูว่าตอนนี้เราเปิด Terminal Session อะไรอยู่ได้ โดยใช้คำสั่ง

  1. ทดลองใช้งาน API ของเรากันเลยยยยย ลองส่ง Request ไปที่เครื่อง Linux Server ของเราซิว่าทำได้มั้ย (สามารถใช้คำสั่ง ip a เพื่อดู IP Address ของ Linux Server เราก่อนได้)

ได้แล้วววว เยสสสส 🥳🥳

Container Deployment 🐋

เดี๋ยวมาเขียนต่อครับ

Last updated

Was this helpful?