เป็น shell script ที่จะ backup samba container ไว้ที่ folder data_backup
- สร้าง folder เก็บข้อมูลก่อน โดยคำสั่ง
mkdir -p /Users/Shared/Portable/ad-samba-m/data_backup - สร้างไฟล์
touch data_backup.sh - ใส่เนื้อหา
#!/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 - ให้สิทธิ์
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)
อ่านเพิ่มเติม
