Docker: Samba Backup

Byphunsanit

Docker: Samba Backup

เป็น shell script ที่จะ backup samba container ไว้ที่ folder data_backup

  1. สร้าง folder เก็บข้อมูลก่อน โดยคำสั่ง
    mkdir -p /Users/Shared/Portable/ad-samba-m/data_backup
  2. สร้างไฟล์
    touch data_backup.sh
  3. ใส่เนื้อหา
    #!/bin/bash
    
    # Configuration with Defaults
    VOLUME_NAME="${1:-ad-samba-data}"
    BACKUP_DIR="${2:-./data_backup}"
    TIMESTAMP=$(date +"%Y%m%dT%H%M%S")
    BACKUP_FILE="${BACKUP_DIR}/ad_samba_backup_${TIMESTAMP}.tar.gz"
    
    echo "=========================================="
    echo " Samba AD DC Backup Utility"
    echo "=========================================="
    echo "Volume Name: $VOLUME_NAME"
    echo "Backup Dir : $BACKUP_DIR"
    echo "Target File: $BACKUP_FILE"
    echo "------------------------------------------"
    
    # Create backup directory if it doesn't exist
    mkdir -p "$BACKUP_DIR"
    
    # 1. Stop the container to ensure data consistency
    echo "Stopping container..."
    docker compose stop
    
    if [ $? -ne 0 ]; then
    	echo "❌ Failed to stop container. Backup aborted."
    	exit 1
    fi
    
    # 2. Perform Backup
    echo "Starting backup..."
    # Run a temporary alpine container to mount the volume and backup directory,
    # then compress the volume contents into a tar.gz file.
    docker run --rm \
      -v "$VOLUME_NAME":/source_volume \
      -v "$(pwd)/$BACKUP_DIR":/backup_dir \
      alpine \
      tar czf "/backup_dir/ad_samba_backup_${TIMESTAMP}.tar.gz" -C /source_volume .
    
    BACKUP_STATUS=$?
    
    # 3. Start the container again
    echo "Starting container..."
    docker compose start
    
    # 4. Check Result
    if [ $BACKUP_STATUS -eq 0 ]; then
      echo "✅ Backup successful: $BACKUP_FILE"
      # List the created file to show size
      ls -lh "$BACKUP_FILE"
    else
      echo "❌ Backup failed!"
      exit 1
    fi
    
  4. ให้สิทธิ์
    chmod +x data_backup.sh

BACKUP

สามารถทำได้ง่าย ๆ โดยคำสั่ง

./data_backup.sh

จะดึงข้อมูลจาก Volume ad-samba-data มาเก็บเป็นไฟล์ .tar.gz ในโฟลเดอร์ data_backup/ บน Host

options

  • VOLUME_NAME=”${1:-ad-samba-data}”
    • หน้าที่: กำหนดชื่อ Volume ที่ต้องการจะแบ็คอัพ
    • $1: หมายถึง Argument ตัวที่ 1 ที่ต่อท้ายตอนเรียกใช้สคริปต์ ( เช่น ./data_backup.sh my-volume )
    • :-: เป็นไวยากรณ์ที่แปลว่า “ถ้าตัวแปรด้านซ้ายว่างเปล่า ( ไม่ได้ใส่ค่ามา ) ให้ใช้ค่าด้านขวาแทน”
    • สรุป: ถ้ารันสคริปต์แล้วใส่ชื่อ Volume มาด้วย ก็จะใช้ชื่อนั้น แต่ถ้าไม่ใส่ จะใช้ค่าเริ่มต้นคือ ad-samba-data
  • BACKUP_DIR=”${2:-./data_backup}”
    • หน้าที่: กำหนดโฟลเดอร์ปลายทางที่จะเก็บไฟล์แบ็คอัพ
    • $2: หมายถึง Argument ตัวที่ 2 ( เช่น ./data_backup.sh my-volume /home/user/backup )
    • สรุป: ถ้ารันสคริปต์แล้วระบุ path ที่เก็บไฟล์มาเป็นค่าที่สอง ก็จะบันทึกลงที่นั่น แต่ถ้าไม่ระบุ จะสร้าง / เก็บไว้ในโฟลเดอร์ชื่อ data_backup ซึ่งอยู่ภายใต้ Directory ปัจจุบันที่กำลังรันสคริปต์ (./)
  • TIMESTAMP=$(date +”%Y%m%dT%H%M%S”)
    • หน้าที่: สร้างตัวเลขประทับเวลา (Timestamp) เพื่อเอาไปต่อท้ายชื่อไฟล์ ป้องกันไม่ให้ไฟล์แบ็คอัพใหม่ทับไฟล์เก่า
    • $(...): คือการรันคำสั่งที่อยู่ข้างใน แล้วเอาผลลัพธ์มาเก็บไว้ในตัวแปร
    • date +"%Y%m%dT%H%M%S": ดึงเวลาปัจจุบันในรูปแบบ ปีเดือนวันTชั่วโมงนาทีวินาที (เช่น 20260220T010701)
  • BACKUP_FILE=”${BACKUP_DIR}/ad_samba_backup_${TIMESTAMP}.tar.gz”
    • หน้าที่: นำตัวแปรทั้งหมดมาประกอบร่างกันเพื่อสร้าง “Path และชื่อไฟล์ที่สมบูรณ์” สำหรับไฟล์แบ็คอัพ
    • ตัวอย่างผลลัพธ์: หากใช้ค่าเริ่มต้นทั้งหมด ไฟล์ที่ได้จะมีหน้าตาแบบนี้ครับ: ./data_backup/ad_samba_backup_20260220T010701.tar.gz

ตัวอย่างการนำสคริปต์ไปรันใช้งานจริง

  • ไม่ใส่ Option จะใช้ค่า Default
    ./data_backup.sh
    ( ผลลัพธ์: แบ็คอัพ ad-samba-data ไปไว้ที่ ./data_backup )
  • ระบุชื่อ Volume เอง
    ./data_backup.sh my-new-volume
    ( ผลลัพธ์: แบ็คอัพ my-new-volume ไปไว้ที่ ./data_backup )
  • ระบุทั้งชื่อ Volume และที่เก็บไฟล์
    ./data_backup.sh my-new-volume /mnt/external_drive/backups
    ( ผลลัพธ์: แบ็คอัพ my-new-volume ไปไว้ที่ /mnt/external_drive/backups )

อ่านเพิ่มเติม

About the author

phunsanit administrator