สร้างระบบ 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="[email protected]: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=("[email protected]" "[email protected]" "[email protected]")
RETENTION_DAYS=30
NOTIFICATION_EMAIL="[email protected]"
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 "[email protected]: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" [email protected]
fi
สรุป
ระบบ Backup Repository อัตโนมัติเป็นส่วนสำคัญของ Infrastructure ที่เข็ม ด้วยการใช้ Git Mirror และ Cron Job ไท่ทำงานที่สม่ำเสมอ Repository ของคุณจะปลอดภัยจาก Data loss และ Corruption ไม่ว่าจะเกิดเหตุการณ์ที่ไม่คาดคิดส่ิงขึ้น
