Setup Server เพื่อเตรียมพร้อมสำหรับการ deploy

   อัปเดตล่าสุด June 20, 2024

Setup Server เพื่อเตรียมพร้อมในการ deploy

บทเรียนหัวข้อนี้คือการตั้งค่าพื้นฐานของทาง Server เพื่อเตรียมพร้อมในการ Deployment ต่อไปซึ่งผู้เรียนควรผ่านหัวข้อดังต่อไปนี้

  • การควบคุม server ผ่านการ remote ด้วย SSH
  • การสร้าง Droplet บน DigitalOcean

เพื่อให้สามารถเรียนรู้การตั้งค่าผ่าน server ได้

หากเป็นผู้ให้บริการรายอื่นอาจจะมีรายละเอียดที่แตกต่างกันบ้างในการตั้งค่าต่างๆ แต่สามารถเรียนรู้และนำไปประยุกต์ใช้ได้
โดยบทความนี้จะอ้างอิงและเขียนเพิ่มเติมจาก Django Deployment ของคุณ Bradtravesy ที่ OS Ubuntu 20.04 LTS Focal Fossa



ทำการสร้าง Droplet จากบทเรียนที่แล้ว


หน้า Instance และ ipv4 ของ droplet ที่เราจะทำการ ssh เข้าไปใช้

เมื่อเราได้ทำการสร้างและ SSH เข้ามาที่ทาง server ของเราด้วย root user แล้วเราจะพบข้อความที่แสดงถึงระบบเราสิ่งนี้เรียกว่า Message of the day


หน้า message of the day


สร้าง User ใหม่และให้สิทธิ SuperUser

เมื่อเราสร้าง Droplet ทาง DigitalOcean จะให้สิทธิพื้นฐานเป็น root user ซึ่งจะมีสิทธิสูงสุดสามารถรันคำสั่งได้ทุกอย่าง แต่โดยทั่วไปแล้วเราจะสร้าง User ขึ้นมาใหม่และให้สิท sudo หรือ super user do ซึ่งจะมีความแตกต่างคือเวลาที่ sudo User รันคำสั่งที่โดยปกติไม่สามารถทำได้จะต้องทำการใส่ sudo นำหน้าคำสั่งทุกครั้ง และจะถูกบังคับใส่ Password อีกครั้งหนึ่งซึ่งก็จะมีความปลอดภัยกว่าการรัน root user ตรงๆ

เราสามารถสร้าง user ใหม่ด้วยคำสั่ง useradd และตามด้วยชื่อ user ที่เราต้องการใช้ซึ่งในที่นี้ผมขอใช้ชื่อ djangoadmin

adduser <user>

ต่อมาเราจะทำการเพิ่ม user ของเราเข้า sudo usergroup เพื่อให้สามารถรันคำสั่งต่างๆได้

usermod -aG <user>


add sudo user


เพิ่มสิทธิการ SSH ไปยัง User

ในกรณีที่เราสร้าง Droplet ด้วย Password-based จะยังไม่มีการตั้งค่ามาแต่หากเราเลือกเป็นแบบ ssh แต่ต้นทาง DigitalOcean จะทำการตั้งค่า key ให้เราพร้อมใช้งานที่ user Root ตั้งแต่ต้นเลย แต่เราก็สามารถทำการเปลี่ยนหรือตั้งค่าเองได้ ซึ่งในกรณีที่เราสร้าง User ใหม่ขึ้นมาเราก็จำเป็นที่จะต้องเพิ่ม key ตัวนี้เข้าไปยัง user ใหม่ด้วยเช่นกันเพื่อให้เราสามารถ ssh ผ่าน user ใหม่เข้ามายัง server ได้ โดยการเพิ่ม ssh key ให้กับ user นั้นสามารถทำได้ผ่านไฟล์ชื่อว่า authorized_keys ในโฟลเดอร์ที่ชื่อว่า .ssh ตาม homepath ของ user นั้นๆ เช่นหากเราต้องการเพิ่ม ssh key ให้กับ djangoadmin ให้ทำการ copy public key ไปยัง /home/djangoadmin/.ssh/authorized_keys (หากไม่มีโฟลเดอร์ .ssh ให้ทำการสร้างโฟลเดอร์ก่อน)

sudo nano /home/<user>/.ssh/authorized_keys


ในทีนี้ root user มีการตั้งค่า SSH key อยู่แล้วจึงนำ public key จาก root user ไปยัง djangoadmin

เมื่อตั้งค่าเสร็จแล้วสามารถทำสอบด้วยการ ssh ด้วย key ไปยัง User ที่สร้างขึ้นมาใหม่

*ข้อสังเกตุ โดยทั่วไป homepath จะอยู่ที่ /home/<ชื่อ user>/.ssh/authorized_keys แต่หากเป็น root user จะมี homepath ที่ต่างจาก user อื่นจึงอยู่ที่ /root/.ssh/authorized_keys

Disable Root user, Password Login

*ขั้นตอนนี้สามารถข้ามได้
เมื่อเราได้สร้าง sudo user เสร็จแล้ว โดยต่อจากนี้เราจะใช้ user djangoadmin ที่เราได้สร้างขึ้นมาเป็นหลัก โดยทั่วไปแล้วเราจะทำการ disable root user (เหตุผลเดียวกับการสร้าง sudo user)และปิดการเข้าระบบด้วย password อนุญาติแค่การ secure shell เข้ามาด้วยเหตุผลทางความปลอดภัย เราสามารถทำได้ดังนี้
ไปที่ไฟล์ /etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config
ทำการค้นหาบรรทัดที่มีชื่อว่า PermitRootLogin และ PasswordAuthentication และเปลี่ยนคำข้างหลังให้เป็น no 
PermitRootLogin no
PasswordAuthentication no



เสร็จแล้วให้ทำการรันคำสั่ง

sudo systemctl reload sshd

การตั้งค่า firewall

* สามารถข้ามขั้นตอนนี้ได้
UFW หรือ Uncomplicated Firewall เป็น firewall แบบ uncomplicated หรือก็คือไม่ซับซ้อนมากนัก การ set firewall สามารถทำได้ในหลากหลายขั้นตอนไม่ว่าจะที่ระดับ DNS ระดับ Server (DigitalOcean) หรือภายในระดับ OS ซึ่ง ufw จะมี set rule ของ application ต่างๆเตรียมให้เราใช้งานไว้แล้วเช่น
  • HTTP - รับ TCP ที่ port 80
  • HTTPS - รับ TCP ที่ port 443
  • Nginx - รับ TCP ที่ port 80/443
  • Apache - รับ TCP ที่ port 80/443
  • OpenSSH - set ค่าสำหรับการ SSH ที่ port 22 
โดยเราสามารถทำการเปิดหรือปิด ufw ได้ผ่านคำสั่ง
sudo ufw enable
sudo ufw disable
เราสามารถตั้งค่าอนุญาติหรือไม่อนุญาติได้ผ่านคำสั่ง allow/deny
sudo ufw allow [port]/[protocol]
sudo ufw disable [port]/[protocol]
เช่นเราทำการอนุญาติ HTTP ก็สามารถทำได้ผ่าน
sudo ufw allow 80/tcp
หรือเราจะอนุญาติตาม set rule พื้นฐานได้เช่น
sudo ufw allow 'Nginx'
หากต้องการลบเราก็สามารถทำได้ด้วยการ delete allow
sudo ufw delete allow 'Nginx'
ซึ่งในที่นี้เราจะทำการอนุญาติ OpenSSH ซึ่งโดยพื้นฐานจะติดตั้งมาแล้วเราสามารถเช็ค set rule ปัจจุบันได้ด้วยคำสั่ง
sudo ufw app list
ในเบื้องต้นให้ทำการ enable และมี OpenSSH ก็พอแล้ว


sudo apt update && sudo apt upgrade

เมื่อเราได้ทำการเข้าถึง Server ของเราแล้วในตอนนี้ Package ต่างๆจะขึ้นอยู่กับทางผู้ให้บริการ Server ซึ่งใน Ubuntu จะมีตัวจากการ Package Library ต่างๆที่ชื่อว่า apt โดยเราจะทำการรันคำสั่งเพื่อ update ตัว apt ก่อนแล้วถึง upgrade library ต่างๆตามมา

sudo apt update -y&& sudo apt upgrade -y

* การใส่ -y นั้นโดยพื้นฐานเวลาเราลงมากจะมีขั้นตอนให้ยืนยันการลงโดยพิม y อีกครั้งนึงหากเราใส่ option -y ระบบจะลงอัตโนมัติโดยเราไม่ต้องพิมยืนยัน


Update Library and apt package


Install Dependency for Deployment

* สำหรับใครที่ต้องการ deploy ผ่าน docker สามารถข้ามขั้นตอนนี้ไปได้

sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl gunicorn python3-venv



Install Docker, Docker Compose

sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
sudo apt install docker-ce -y
sudo systemctl status docker

ทำการเช็คสถานะของ docker daemon


องทำการรันคำสั่งในการเช็ค version ของ docker ด้วยคำสั่ง

docker --version


แต่จะพบว่า docker นั้นติดปัญหา permission อยู่จึงทำให้เราต้องรันผ่านคำสั่ง sudo จึงจะสามารถรันได้ 

ซึ่งสามารถแก้ได้ด้วยคำสั่ง

sudo chgrp docker /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket

***ทำการออกระบบและ ssh เข้าใหม่ก็จะสามารถใช้คำสั่งโดยไม่ต้องผ่าน sudo ได้แล้ว


ทำการลง docker-compose

sudo apt install docker-compose -y


อ้างอิง

Django Deployment - Digital Ocean · GitHub

How To Set Up Django with Postgres, Nginx, and Gunicorn on Ubuntu | DigitalOcean

How to Set Up a Firewall with UFW on Ubuntu | DigitalOcean

How To Install and Use Docker on Ubuntu 20.04 | DigitalOcean




คอร์สเรียนแนะนำ