สร้างระบบ 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="[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 ไม่ว่าจะเกิดเหตุการณ์ที่ไม่คาดคิดส่ิงขึ้น