ตั้งค่า Bare Git Repository บน VPS สำหรับ Deploy

Bare Git Repository เป็นรูปแบบ Git Repository พิเศษที่ออกแบบมาโดยเฉพาะสำหรับการใช้งานบนเซิร์ฟเวอร์ โดยไม่มี Working Tree ทำให้เหมาะสำหรับการจัดเก็บและการ Deploy โค้ด บทความนี้จะแนะนำวิธีการตั้งค่า Bare Git Repository บน VPS พร้อมตัวอย่างเชิงปฏิบัติและคำแนะนำการใช้งาน

Bare Git Repository คืออะไร

Bare Repository คือ Git Repository ที่ไม่มี Working Directory ไฟล์ทั้งหมดจะอยู่ในรูปแบบ .git structure โดยไม่มีไฟล์โปรเจกต์จริงที่ใช้งาน Repository นี้ใช้เพื่อเก็บข้อมูล Git ที่แชร์ได้บนเซิร์ฟเวอร์ ซึ่งคล้ายกับ Repository บนที่เก็บเอกสารสำคัญของธนาคาร หรือคลังข้อมูลกลาง

ลักษณะสำคัญของ Bare Repository

  • ไม่มี Working Directory ทำให้ไม่สามารถแก้ไขไฟล์ได้โดยตรงบนเซิร์ฟเวอร์
  • มีเฉพาะข้อมูล Git เท่านั้น ไม่มีไฟล์ที่ compiled หรือไฟล์ temp
  • เหมาะสำหรับการทำหน้าที่เป็น Central Repository บนเซิร์ฟเวอร์ที่หลายคนสามารถ Push/Pull ได้
  • ป้องกันปัญหา Non-fast-forward Pushes ที่อาจเกิดขึ้นเมื่อหลายคนทำงานพร้อมกัน
  • ใช้พื้นที่น้อยกว่าปกติเนื่องจากไม่มี Working Tree
  • เพิ่มความปลอดภัย: ไม่มีไฟล์ที่ active ทำให้ไม่เสี่ยงต่อการ lock หรือความขัดแย้ง

ตัวอย่างการเทียบเคียง

ลองนึกถึง Repository ธรรมดา เหมือนกับโครงการที่อยู่ในโฟลเดอร์ของคุณ มี .git folder และไฟล์ source code ส่วน Bare Repository เหมือนกับเก็บไฟล์ที่ส่วนกลาง (server-side repository) ที่เก็บเฉพาะประวัติศาสตร์และข้อมูล Git เท่านั้น ไม่มีไฟล์ source code ที่ active

เตรียมสภาพแวดล้อมบน VPS

ก่อนสร้าง Bare Repository คุณต้องเตรียมสภาพแวดล้อมและผู้ใช้ให้พร้อม นี่เป็นขั้นตอนสำคัญเพื่อให้การ Push/Pull ทำงานได้อย่างถูกต้องและปลอดภัย

# เข้าสู่ VPS ด้วย SSH
ssh root@your-vps-ip

# สร้าง git user หากยังไม่มี
useradd -m -s /bin/bash git

# ตั้งรหัสผ่าน (ตัวเลือก)
passwd git

# สร้าง directory สำหรับเก็บ repositories
mkdir -p /var/git

# ตั้งค่าสิทธิ์
chown -R git:git /var/git
chmod 755 /var/git

สร้าง Bare Repository บน VPS

ขั้นตอนการสร้าง Bare Repository ค่อนข้างง่าย แต่ต้องปฏิบัติตามขั้นตอนให้ถูกต้อง

ขั้นตอนที่ 1: เข้าสู่ VPS

ssh root@your-vps-ip

ขั้นตอนที่ 2: สร้าง Bare Repository

# สร้างโฟลเดอร์สำหรับเก็บ Repository
mkdir -p /var/git/myproject.git
cd /var/git/myproject.git

# สร้าง Bare Repository
git init --bare

# ตรวจสอบว่าสร้างสำเร็จ
ls -la

คำสั่ง git init --bare จะสร้าง Repository ที่ไม่มี Working Directory ไฟล์ที่สร้างขึ้นจะประกอบด้วย HEAD, config, description, hooks, objects, refs เป็นต้น ซึ่งทั้งหมดนี้คือข้อมูล Git ที่จำเป็น

ขั้นตอนที่ 3: ตั้งค่าสิทธิ์ของ Directory

# ตั้งค่าเจ้าของและกลุ่มให้เป็น git user
chown -R git:git /var/git/myproject.git

# ตั้งค่าสิทธิ์สำหรับอ่าน/เขียน
chmod -R 755 /var/git/myproject.git

# สำหรับความปลอดภัยที่สูงขึ้น (restrictive)
chmod -R 750 /var/git/myproject.git

การตั้งค่าสิทธิ์นี้มีความสำคัญมากเพราะจะช่วยให้ git user มีการเข้าถึง Repository ได้อย่างเหมาะสม ในขณะที่ผู้ใช้อื่นไม่สามารถลบหรือแก้ไขได้โดยไม่ได้รับอนุญาต

ตั้งค่า SSH Key สำหรับการเชื่อมต่ออย่างปลอดภัย

เพื่อให้การ Push/Pull ทำงานได้อย่างปลอดภัยโดยไม่ต้องใส่รหัสผ่านทุกครั้ง ให้ตั้งค่า SSH Key เสียก่อน

# บนเครื่อง Local คุณ
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_git -N ""

# คัดลอก Public Key ไปยัง VPS
ssh-copy-id -i ~/.ssh/id_rsa_git.pub git@your-vps-ip

# หรือ Manual copy
cat ~/.ssh/id_rsa_git.pub | ssh git@your-vps-ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

ตั้งค่า Remote บนเครื่อง Local

บนเครื่อง Local ของคุณ ให้ใช้คำสั่ง Git เพื่อเพิ่ม Remote ที่ชี้ไปยัง Bare Repository บน VPS

# เข้าไปในโปรเจกต์ของคุณ
cd /path/to/local/project

# เพิ่ม Remote origin
git remote add origin git@your-vps-ip:/var/git/myproject.git

# ตั้งค่า Default Branch เป็น main (หากยังไม่มี)
git branch -M main

# Push ไปยัง Remote เป็นครั้งแรก
git push -u origin main

ขั้นตอนการ Push และ Pull

หลังจากตั้งค่า Bare Repository และ SSH Key แล้ว คุณสามารถ Push/Pull ได้เหมือนกับ GitHub หรือ GitLab ปกติ

# ทำการแก้ไขไฟล์
echo "new feature" >> myfile.txt

# Stage และ Commit
git add .
git commit -m "Add new feature"

# Push ไปยัง VPS
git push origin main

# Pull ของคนอื่น
git pull origin main

ตั้งค่า Git Hooks สำหรับ Deploy อัตโนมัติ

Bare Repository ทำให้สามารถตั้งค่า Git Hooks ได้ง่าย โดยเฉพาะ post-receive hook ที่ทำงานเมื่อมีการ Push เข้ามา คุณสามารถใช้ hook นี้เพื่อ Deploy โค้ดไปยังโฟลเดอร์จริงบน VPS

# เข้าไปยัง Bare Repository
cd /var/git/myproject.git/hooks

# สร้างไฟล์ post-receive
cat > post-receive << 'EOF'
#!/bin/bash
WORKTREE="/var/www/myproject"
REPO="/var/git/myproject.git"

# Clone หรือ Pull ไปยัง Working Directory
if [ ! -d $WORKTREE ]; then
    git clone $REPO $WORKTREE
else
    cd $WORKTREE
    git pull
fi

echo "Deploy successful!"
EOF

# ทำให้เป็น executable
chmod +x post-receive

ด้วยการตั้งค่า post-receive hook คุณจะสามารถ Deploy โค้ดไปยัง VPS โดยอัตโนมัติเมื่อมีการ Push เพียงแค่ Push ไปยัง Repository บน VPS มันจะ Deploy โค้ดไปยังโฟลเดอร์ที่ต้องการให้บริการ

ตรวจสอบว่า Push สำเร็จ

เข้าสู่ VPS และตรวจสอบว่า Commit ได้ถูก Push เข้ามา

# เข้า SSH ไปยัง VPS
ssh root@your-vps-ip

# ไปยัง Bare Repository
cd /var/git/myproject.git

# ตรวจสอบ Log
git log --oneline

# ตรวจสอบ Branches
git branch -a

# ตรวจสอบว่า Deploy สำเร็จ (ถ้าตั้ง hooks ไว้)
ls -la /var/www/myproject

ปัญหา: Permission denied เมื่อ Push

หากได้รับข้อผิดพลาด "Permission denied" ให้ตรวจสอบสิทธิ์ของไฟล์และ SSH key

# ตรวจสอบและแก้ไขสิทธิ์
chown -R git:git /var/git/myproject.git
chmod 755 /var/git/myproject.git

# ตรวจสอบ SSH key
ssh -i ~/.ssh/id_rsa_git git@your-vps-ip

# ถ้ายังไม่ได้ ลองตั้ง SSH config
cat ~/.ssh/config
# ควรมี:
# Host your-vps-ip
#     IdentityFile ~/.ssh/id_rsa_git
#     User git

ปัญหา: Reference update rejected

หากเจอข้อความ "Reference update rejected" อาจเป็นเพราะ Repository ไม่ใช่ bare repository ลองตรวจสอบว่าใช้ flag --bare ในการสร้าง

# ตรวจสอบว่า config ถูกต้อง
cat /var/git/myproject.git/config

# ควรมี
# [core]
#     bare = true
#     repositoryformatversion = 0

ข้อดีของการใช้ Bare Repository

  • ความปลอดภัยสูง: ไม่มี Working Directory ที่อาจเกิดความขัดแย้งหรือการแก้ไขโดยตั้งใจ
  • ใช้เนื้อที่น้อย: เก็บเฉพาะข้อมูล Git ไม่มีไฟล์ที่ compiled หรือ temp files
  • ง่ายต่อการจัดการ: รองรับการตั้งค่าสิทธิ์และการเข้าถึงได้อย่างมีประสิทธิภาพ
  • สมบูรณ์แบบสำหรับ CI/CD: ช่วยให้ Deploy อัตโนมัติเป็นไปได้ ด้วยการใช้ Git Hooks
  • ความเพื่อมั่นใจ: เหมาะสำหรับการใช้งานบน ผู้ให้บริการโฮสติ้ง Cloud VPS เพราะเสถียรและปลอดภัย

เปรียบเทียบกับ GitHub/GitLab

Bare Repository บน VPS ส่วนตัวของคุณช่วยให้คุณมีความเป็นเจ้าของ (ownership) เต็มที่ของข้อมูล โค้ด และประวัติศาสตร์ Git ไม่เหมือน GitHub หรือ GitLab ที่คุณต้องพึ่งพิงบริการของบุคคลที่สาม การใช้ Bare Repository บน ผู้ให้บริการโฮสติ้ง Cloud VPS ให้คุณการควบคุมเต็มที่และลดต้นทุนในระยะยาว

สรุป

Bare Git Repository เป็นวิธีที่มีประสิทธิภาพและปลอดภัยในการจัดการโค้ดบน VPS และเป็นพื้นฐานสำคัญสำหรับการ Deploy อัตโนมัติ ด้วยการตั้งค่า Bare Repository และ Git Hooks คุณสามารถสร้าง Deployment Pipeline ที่เป็นอัตโนมัติได้อย่างสมบูรณ์ ลดความเสี่ยงของข้อผิดพลาด และประหยัดเวลาในการ Deploy เว็บไซต์บน ผู้ให้บริการโฮสติ้ง Cloud VPS ของคุณ