#!/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."