47 lines
1.9 KiB
Bash
47 lines
1.9 KiB
Bash
#!/bin/sh
|
|
# backup_db.sh — MariaDB dump จาก container → host backup dir
|
|
# ใช้ร่วมกับ dms_mariadb (ชื่อ container), และ mount /backup ไว้แล้ว
|
|
|
|
set -eu
|
|
|
|
# ---- ปรับค่าตามจริง ----
|
|
CONTAINER_NAME="dms_mariadb"
|
|
DB_NAME="dms"
|
|
DB_USER="center"
|
|
DB_PASS="Center#2025" # แนะนำเปลี่ยนไปใช้ ENV/ไฟล์ .env แล้ว source แทนการฝังรหัสผ่าน
|
|
RETENTION_DAYS="${RETENTION_DAYS:-14}"
|
|
# ------------------------
|
|
|
|
STAMP="$(date +'%Y%m%d_%H%M%S')"
|
|
OUTFILE="/backup/${DB_NAME}_backup_${STAMP}.sql.gz"
|
|
|
|
echo "[INFO] Starting dump: $OUTFILE"
|
|
|
|
# ตรวจว่า container รันอยู่?
|
|
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
|
echo "[ERROR] Container ${CONTAINER_NAME} not running."
|
|
exit 1
|
|
fi
|
|
|
|
# ตรวจว่ามี /backup ใน container (map มาจาก /share/dms-data/mariadb/backup)
|
|
if ! docker exec "${CONTAINER_NAME}" sh -lc 'test -d /backup'; then
|
|
echo "[ERROR] /backup is not mounted inside container."
|
|
exit 1
|
|
fi
|
|
|
|
# ทำ dump แล้วบีบอัดภายในคอนเทนเนอร์ (ประหยัด IO/permission ง่ายสุด)
|
|
docker exec "${CONTAINER_NAME}" sh -lc "mysqldump -u\"${DB_USER}\" -p\"${DB_PASS}\" --single-transaction --routines --triggers --events \"${DB_NAME}\" | gzip > \"${OUTFILE}\""
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo "[OK] Backup complete: ${OUTFILE}"
|
|
else
|
|
echo "[ERROR] Backup failed."
|
|
exit 1
|
|
fi
|
|
|
|
# ลบไฟล์เก่าตามนโยบายเก็บรักษา (ทำจาก host ผ่าน bind mount)
|
|
HOST_BACKUP_DIR="${HOST_BACKUP_DIR:-/share/dms-data/mariadb/backup}"
|
|
find "${HOST_BACKUP_DIR}" -type f -name "${DB_NAME}_backup_*.sql.gz" -mtime +${RETENTION_DAYS} -print -delete
|
|
|
|
echo "[DONE] Cleanup older than ${RETENTION_DAYS} days finished."
|