สร้างระบบ Backup Repository อัตโนมัติด้วย Git Mirror และ Cron Job
สร้างระบบ Backup Repository อัตโนมัติด้วย Git Mirror และ Cron Job
Repository ที่ไม่มีการ Backup ถือเป็นโจทย์เสียงอันตรายต่างหากในสายการผลิต คู่มือนี้จะสอนวิธีสร้างระบบ Repository อัตโนมัติโดยใช้ Git Mirror และ Cron Job บน VPS เพื่อให้ข้อมูล Git ของคุณปลอดภัยตลอดเวลา
ทำไมต้อง Backup Git Repository?
- Git Server อาจเสียหาย corruption หรือสูญเสีย Data
- Ransomware อาจทำลาย Repository ทั้งหมด
- Hardware failure สามารถเกิดขึ้นได้ทุกเมื่อ
- การ Backup อัตโนมัติปกป้องจาก User error
- Disaster recovery ต้อง Backup ที่เขียนไว้
วิธีการ Backup Repository ด้วย Git Mirror
ความแตกต่างระหว่าง Clone vs Mirror
| ลักษณะ | git clone | git clone –mirror |
| ประเภท | Working repository | Bare repository |
| Size | เล็กกว่า | เต็มหมด (ทุก Ref) |
| Branches | เฉพาะ Main | ทั้งหมด |
| Tags | เฉพาะที่ referenced | ทั้งหมด |
| Push pull | ได้ | Push only |
| Backup purpose | ไม่เหมาะสม | ดีมาก |
ขั้นตอนสร้างระบบ
Step 1: สร้าง Backup Directory
sudo mkdir -p /var/git-backups
sudo chown git:git /var/git-backups
sudo chmod 750 /var/git-backups
cd /var/git-backups
ls -la
Step 2: สร้าง Backup Script
สร้างไฟล์ Script สำหรับ Backup Repository:
cat > /usr/local/bin/backup-git-repos.sh << 'SCRIPT'
#!/bin/bash
# Git Repository Backup Script
# ใช้ git clone --mirror เพื่อสำรอง Repository ทั้งหมด
BACKUP_DIR="/var/git-backups"
SOURCE_GIT_SERVER="git@github.com:yourcompany" # หรือ Internal Git Server
LOG_FILE="/var/log/git-backup.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE] Backup started..." >> $LOG_FILE
# List ของ Repository ที่ต้อง Backup
REPOS=(
"project-one"
"project-two"
"project-three"
)
for REPO in "${REPOS[@]}"; do
REPO_PATH="$BACKUP_DIR/$REPO.git"
if [ -d "$REPO_PATH" ]; then
# Update backup ถ้ามี
echo "[$DATE] Updating $REPO..." >> $LOG_FILE
cd "$REPO_PATH"
git remote update --prune 2>&1 >> $LOG_FILE
else
# Clone mirror ครั้งแรก
echo "[$DATE] Mirroring $REPO..." >> $LOG_FILE
git clone --mirror "$SOURCE_GIT_SERVER/$REPO.git" "$REPO_PATH" 2>&1 >> $LOG_FILE
fi
done
# Cleanup old backups (เก็บเฉพาะ 30 วันที่สุดท้าย)
find $BACKUP_DIR -type d -name "*.git" -mtime +30 -exec rm -rf {} \; 2>/dev/null
echo "[$DATE] Backup completed." >> $LOG_FILE
SCRIPT
chmod +x /usr/local/bin/backup-git-repos.sh
Step 3: ทดสอบ Script
sudo /usr/local/bin/backup-git-repos.sh
tail -f /var/log/git-backup.log
Step 4: ตั้งค่า Cron Job
ตั้งค่า Cron ให้ทำการ Backup ทุกวันเวลา 2 ทุ่ม:
sudo crontab -e
# เพิ่ม:
0 2 * * * /usr/local/bin/backup-git-repos.sh
Advanced: Backup เข้า External Storage
Backup เข้า AWS S3
สำหรับความปลอดภัยมากขึ้น ให้ Backup เข้า Cloud Storage:
cat > /usr/local/bin/backup-to-s3.sh << 'SCRIPT'
#!/bin/bash
BACKUP_DIR="/var/git-backups"
S3_BUCKET="s3://my-company-backups"
AWS_REGION="ap-southeast-1"
# Install AWS CLI
sudo apt-get install -y awscli
# Configure AWS credentials
aws configure
# Upload to S3
for repo in $BACKUP_DIR/*.git; do
REPO_NAME=$(basename "$repo")
echo "Uploading $REPO_NAME to S3..."
aws s3 sync "$repo" "$S3_BUCKET/$REPO_NAME" \
--region $AWS_REGION \
--delete
done
echo "Backup to S3 completed."
SCRIPT
chmod +x /usr/local/bin/backup-to-s3.sh
Manual Backup: Single Repository
หากต้องการ Backup Repository เดียว:
# Clone mirror
git clone --mirror https://github.com/user/repo.git repo.git
# Update mirror
cd repo.git
git remote update --prune
# Verify
git log --oneline | head -5
Restore จาก Backup
เมื่อต้องการคืน Repository จากการ Backup:
# 1. Clone mirror กลับเป็น working repository
git clone /var/git-backups/repo.git restored-repo
# 2. ตรวจสอบ History
cd restored-repo
git log --oneline
# 3. Push ขึ้น Remote ใหม่
git push -u origin main
Best Practices สำหรับ Backup
- 3-2-1 Rule: เก็บ 3 Backup, 2 ประเภท Storage, 1 Offsite location
- Automation: ใช้ Cron เพื่อให้ Backup ทำโดยอัตโนมัติ
- Verification: ตรวจสอบ Backup บ่อย ๆ เพื่อให้แน่ใจว่าใช้ได้
- Encryption: Encrypt Backup ขณะที่ Transit และ At Rest
- Retention: วางแผน Retention policy เช่น เก็บ 30 วันหรือ 1 ปี
- Monitoring: ตั้ง Alert สำหรับ Failed Backup
- Documentation: เก็บ Documentation เกี่ยวกับวิธี Restore
ตัวอย่าง: Comprehensive Backup Script
#!/bin/bash
# Comprehensive Git Repository Backup Script
BACKUP_DIR="/var/git-backups"
REMOTE_SERVERS=("git@github.com" "git@gitlab.com" "git@gitea.company.com")
RETENTION_DAYS=30
NOTIFICATION_EMAIL="admin@company.com"
backup_single_repo() {
local repo=$1
local backup_path="$BACKUP_DIR/$repo.git"
if [ -d "$backup_path" ]; then
git -C "$backup_path" remote update --prune
else
git clone --mirror "git@github.com:company/$repo.git" "$backup_path"
fi
}
# Cleanup old backups
cleanup_old_backups() {
find $BACKUP_DIR -type f -name "*.git" -mtime +$RETENTION_DAYS -delete
}
# Send notification
send_notification() {
echo "Backup completed at $(date)" | \
mail -s "Git Backup Report" $NOTIFICATION_EMAIL
}
# Main execution
for remote in "${REMOTE_SERVERS[@]}"; do
backup_single_repo "$remote"
done
cleanup_old_backups
send_notification
ตรวจสอบ Backup Status
# ดู Backup ทั้งหมด
ls -lah /var/git-backups/
# ดูขนาด Backup
du -sh /var/git-backups/*
# ตรวจสอบ Log
sudo tail -20 /var/log/git-backup.log
# ตรวจสอบ Cron execution
sudo grep CRON /var/log/syslog | grep backup-git
Monitoring และ Alerting
ตั้ง Alert เมื่อ Backup ล้มเหลว:
# ตรวจสอบว่า Backup เก่าเกิน 24 ชั่วโมง
if [ $(find /var/git-backups -type d -mtime +1) ]; then
echo "WARNING: Backup older than 24 hours" | \
mail -s "Git Backup Alert" admin@company.com
fi
สรุป
ระบบ Backup Repository อัตโนมัติเป็นส่วนสำคัญของ Infrastructure ที่เข็ม ด้วยการใช้ Git Mirror และ Cron Job ไท่ทำงานที่สม่ำเสมอ Repository ของคุณจะปลอดภัยจาก Data loss และ Corruption ไม่ว่าจะเกิดเหตุการณ์ที่ไม่คาดคิดส่ิงขึ้น