Giải pháp Backup Toàn Diện bằng Ubuntu Server Script: Tiết kiệm chi phí, Thay thế Veeam và Phần mềm Backup Có Phí

Trong môi trường doanh nghiệp, việc backup dữ liệu định kỳ là yêu cầu bắt buộc để bảo vệ thông tin trước các rủi ro như hỏng phần cứng, tấn công ransomware, xóa nhầm dữ liệu hay sự cố hệ thống. Nhiều doanh nghiệp đang chi hàng nghìn USD mỗi năm cho các phần mềm backup thương mại như Veeam Backup & Replication, Acronis Cyber Backup, hay Commvault. Tuy nhiên, với Ubuntu Server và các shell script tự động hóa, bạn hoàn toàn có thể xây dựng một hệ thống backup toàn diện, đáng tin cậy với chi phí gần như bằng 0.

Bài viết này sẽ hướng dẫn chi tiết cách xây dựng giải pháp backup tự động cho toàn bộ hạ tầng doanh nghiệp: Zimbra Mail Server, Nextcloud, cơ sở dữ liệu MySQL/MariaDB, SQL Server (Linux), và hệ thống ERP.

Tại sao chọn Ubuntu Script thay vì phần mềm Backup có phí?

Chi phí bằng 0: Veeam Essentials có giá từ 500-1.500 USD/năm tùy số lượng socket. Acronis Cyber Backup từ 60-150 USD/máy chủ/năm. Với script Ubuntu, chi phí bản quyền = 0, chỉ tốn dung lượng lưu trữ backup.

Kiểm soát hoàn toàn: Script tự viết cho phép tùy chỉnh theo đúng nhu cầu của từng hệ thống, không bị phụ thuộc vào vendor hay giao diện của phần mềm thứ ba.

Linh hoạt lưu trữ: Backup có thể lưu lên local disk, NAS/NFS, Amazon S3, Backblaze B2, Google Cloud Storage hoặc bất kỳ storage nào hỗ trợ rsync hay rclone.

Tự động hóa hoàn toàn: Kết hợp với cron job, toàn bộ quá trình backup diễn ra tự động theo lịch đã định, không cần can thiệp thủ công.

Thông báo & giám sát: Tích hợp gửi email/Telegram thông báo kết quả backup mỗi ngày, cảnh báo ngay khi có lỗi.

Cấu trúc thư mục Backup tổng thể

Để quản lý backup có tổ chức, nên tạo cấu trúc thư mục thống nhất:

/backup/
├── zimbra/ # Backup Zimbra Mail
├── nextcloud/ # Backup Nextcloud files + DB
├── mysql/ # Backup MySQL/MariaDB databases
├── sqlserver/ # Backup SQL Server databases
├── erp/ # Backup hệ thống ERP
├── logs/ # Log file backup hàng ngày
└── scripts/ # Chứa toàn bộ script backup

1. Backup Zimbra Mail Server

Zimbra chứa toàn bộ email, lịch, danh bạ của người dùng – đây là dữ liệu quan trọng nhất cần backup thường xuyên.

Script backup Zimbra (/backup/scripts/backup_zimbra.sh):

#!/bin/bash
# ============================================
# Script Backup Zimbra Mail Server
# Nam IT – namit.top
# ============================================
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=”/backup/zimbra”
LOG_FILE=”/backup/logs/zimbra_backup_$(date +%Y%m%d).log”
ZIMBRA_HOME=”/opt/zimbra”
KEEP_DAYS=7

echo “[$DATE] Bat dau backup Zimbra…” | tee -a “$LOG_FILE”

# Tao thu muc backup theo ngay
mkdir -p “$BACKUP_DIR/$DATE”

# Dung Zimbra service de dam bao tinh nhat quan
su – zimbra -c “zmcontrol stop” 2>> “$LOG_FILE”
sleep 30

# Backup toan bo thu muc Zimbra
tar -czf “$BACKUP_DIR/$DATE/zimbra_full_$DATE.tar.gz” \
–exclude=”$ZIMBRA_HOME/log” \
–exclude=”$ZIMBRA_HOME/data/tmp” \
“$ZIMBRA_HOME” 2>> “$LOG_FILE”

# Khoi dong lai Zimbra
su – zimbra -c “zmcontrol start” 2>> “$LOG_FILE”

# Backup LDAP (danh ba, tai khoan nguoi dung)
su – zimbra -c “zmlocalconfig -s zimbra_ldap_password” > “$BACKUP_DIR/$DATE/ldap_pass.txt”
/opt/zimbra/libexec/zmslapcat “$BACKUP_DIR/$DATE” 2>> “$LOG_FILE”

# Backup cau hinh Zimbra
su – zimbra -c “zmlocalconfig -s” > “$BACKUP_DIR/$DATE/zimbra_localconfig.txt”
su – zimbra -c “zmprov gad” > “$BACKUP_DIR/$DATE/zimbra_domains.txt”
su – zimbra -c “zmprov -l gaa” > “$BACKUP_DIR/$DATE/zimbra_accounts.txt”

# Xoa backup cu qua KEEP_DAYS ngay
find “$BACKUP_DIR” -maxdepth 1 -type d -mtime +$KEEP_DAYS -exec rm -rf {} \;

BACKUP_SIZE=$(du -sh “$BACKUP_DIR/$DATE” | cut -f1)
echo “[$DATE] Backup Zimbra hoan thanh! Kich thuoc: $BACKUP_SIZE” | tee -a “$LOG_FILE”

Lưu ý quan trọng: Script trên dừng Zimbra trong khoảng 5-15 phút tùy kích thước dữ liệu. Để backup không downtime, có thể dùng snapshot LVM hoặc backup từng mailbox bằng lệnh zmmailbox.

Backup Zimbra từng mailbox (không cần dừng dịch vụ):

#!/bin/bash
# Backup tung mailbox Zimbra (hot backup)
DATE=$(date +%Y%m%d)
BACKUP_DIR=”/backup/zimbra/mailbox/$DATE”
mkdir -p “$BACKUP_DIR”

# Lay danh sach tat ca email accounts
ACCOUNTS=$(su – zimbra -c “zmprov -l gaa” | grep -v “#”)

for ACCOUNT in $ACCOUNTS; do
echo “Dang backup: $ACCOUNT”
su – zimbra -c “zmmailbox -z -m $ACCOUNT getRestURL ‘/?fmt=tgz'” > “$BACKUP_DIR/${ACCOUNT}.tgz”
done

echo “Backup mailbox hoan thanh!”

2. Backup Nextcloud

Nextcloud cần backup cả phần files (dữ liệu người dùng) lẫn cơ sở dữ liệu.

Script backup Nextcloud (/backup/scripts/backup_nextcloud.sh):

#!/bin/bash
# ============================================
# Script Backup Nextcloud
# Nam IT – namit.top
# ============================================
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=”/backup/nextcloud”
LOG_FILE=”/backup/logs/nextcloud_backup_$(date +%Y%m%d).log”
NC_DATA=”/var/www/nextcloud/data”
NC_CONFIG=”/var/www/nextcloud/config”
DB_NAME=”nextcloud”
DB_USER=”nextcloud”
DB_PASS=”your_db_password”
KEEP_DAYS=7

echo “[$DATE] Bat dau backup Nextcloud…” | tee -a “$LOG_FILE”
mkdir -p “$BACKUP_DIR/$DATE”

# Bat che do bao tri Nextcloud (maintenance mode)
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode –on 2>> “$LOG_FILE”

# Backup database Nextcloud
mysqldump -u”$DB_USER” -p”$DB_PASS” “$DB_NAME” | gzip > “$BACKUP_DIR/$DATE/nextcloud_db_$DATE.sql.gz”
echo “[$DATE] Backup database OK” | tee -a “$LOG_FILE”

# Backup thu muc config
tar -czf “$BACKUP_DIR/$DATE/nextcloud_config_$DATE.tar.gz” “$NC_CONFIG” 2>> “$LOG_FILE”

# Backup du lieu nguoi dung (rsync – chi copy phan thay doi)
rsync -av –delete “$NC_DATA/” “$BACKUP_DIR/$DATE/data/” 2>> “$LOG_FILE”

# Tat che do bao tri
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode –off 2>> “$LOG_FILE”

# Xoa backup cu
find “$BACKUP_DIR” -maxdepth 1 -type d -mtime +$KEEP_DAYS -exec rm -rf {} \;

BACKUP_SIZE=$(du -sh “$BACKUP_DIR/$DATE” | cut -f1)
echo “[$DATE] Backup Nextcloud hoan thanh! Kich thuoc: $BACKUP_SIZE” | tee -a “$LOG_FILE”

3. Backup MySQL / MariaDB

Backup toàn bộ hoặc từng database MySQL/MariaDB với mysqldump hoặc xtrabackup cho hot backup.

Script backup MySQL (/backup/scripts/backup_mysql.sh):

#!/bin/bash
# ============================================
# Script Backup MySQL/MariaDB
# Nam IT – namit.top
# ============================================
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=”/backup/mysql”
LOG_FILE=”/backup/logs/mysql_backup_$(date +%Y%m%d).log”
DB_USER=”root”
DB_PASS=”your_root_password”
KEEP_DAYS=14

echo “[$DATE] Bat dau backup MySQL…” | tee -a “$LOG_FILE”
mkdir -p “$BACKUP_DIR/$DATE”

# Lay danh sach tat ca databases
DATABASES=$(mysql -u”$DB_USER” -p”$DB_PASS” -e “SHOW DATABASES;” 2>/dev/null | grep -Ev “(Database|information_schema|performance_schema|sys)”)

# Backup tung database rieng le
for DB in $DATABASES; do
echo “[$DATE] Dang backup database: $DB” | tee -a “$LOG_FILE”
mysqldump -u”$DB_USER” -p”$DB_PASS” \
–single-transaction \
–routines \
–triggers \
–events \
“$DB” | gzip > “$BACKUP_DIR/$DATE/${DB}_$DATE.sql.gz”

if [ $? -eq 0 ]; then
SIZE=$(du -sh “$BACKUP_DIR/$DATE/${DB}_$DATE.sql.gz” | cut -f1)
echo “[$DATE] OK: $DB ($SIZE)” | tee -a “$LOG_FILE”
else
echo “[$DATE] LOI: Backup $DB that bai!” | tee -a “$LOG_FILE”
fi
done

# Backup toan bo (all-databases) de phong truong hop khon nan
mysqldump -u”$DB_USER” -p”$DB_PASS” –all-databases –single-transaction | \
gzip > “$BACKUP_DIR/$DATE/ALL_DATABASES_$DATE.sql.gz”

# Xoa backup cu
find “$BACKUP_DIR” -maxdepth 1 -type d -mtime +$KEEP_DAYS -exec rm -rf {} \;

echo “[$DATE] Backup MySQL hoan thanh!” | tee -a “$LOG_FILE”

4. Backup SQL Server trên Linux

Microsoft SQL Server 2017+ hỗ trợ chạy trên Ubuntu, và có thể backup bằng cách kết hợp sqlcmd với script bash.

Script backup SQL Server (/backup/scripts/backup_sqlserver.sh):

#!/bin/bash
# ============================================
# Script Backup SQL Server tren Ubuntu
# Nam IT – namit.top
# ============================================
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=”/backup/sqlserver”
LOG_FILE=”/backup/logs/sqlserver_backup_$(date +%Y%m%d).log”
SQL_HOST=”localhost”
SQL_USER=”sa”
SQL_PASS=”your_sa_password”
KEEP_DAYS=14

echo “[$DATE] Bat dau backup SQL Server…” | tee -a “$LOG_FILE”
mkdir -p “$BACKUP_DIR/$DATE”

# Lay danh sach databases (tru system databases)
DATABASES=$(/opt/mssql-tools/bin/sqlcmd -S “$SQL_HOST” -U “$SQL_USER” -P “$SQL_PASS” \
-Q “SET NOCOUNT ON; SELECT name FROM sys.databases WHERE name NOT IN (‘master’,’tempdb’,’model’,’msdb’) AND state_desc=’ONLINE'” \
-h -1 2>/dev/null | tr -d ‘ \r’)

for DB in $DATABASES; do
[ -z “$DB” ] && continue
BAKFILE=”$BACKUP_DIR/$DATE/${DB}_$DATE.bak”
echo “[$DATE] Backup SQL Server DB: $DB” | tee -a “$LOG_FILE”

/opt/mssql-tools/bin/sqlcmd -S “$SQL_HOST” -U “$SQL_USER” -P “$SQL_PASS” \
-Q “BACKUP DATABASE [$DB] TO DISK=’$BAKFILE’ WITH COMPRESSION, STATS=10” \
2>> “$LOG_FILE”

if [ $? -eq 0 ]; then
# Nen file bak lai de tiet kiem dung luong
gzip “$BAKFILE”
SIZE=$(du -sh “${BAKFILE}.gz” | cut -f1)
echo “[$DATE] OK: $DB ($SIZE)” | tee -a “$LOG_FILE”
else
echo “[$DATE] LOI: Backup $DB that bai!” | tee -a “$LOG_FILE”
fi
done

# Xoa backup cu
find “$BACKUP_DIR” -maxdepth 1 -type d -mtime +$KEEP_DAYS -exec rm -rf {} \;

echo “[$DATE] Backup SQL Server hoan thanh!” | tee -a “$LOG_FILE”

5. Backup Hệ thống ERP

Hầu hết các hệ thống ERP phổ biến (Odoo, ERPNext, OpenERP) đều chạy trên nền PostgreSQL hoặc MySQL. Script sau áp dụng cho ERP chạy trên Odoo/PostgreSQL.

Script backup ERP – Odoo (/backup/scripts/backup_erp.sh):

#!/bin/bash
# ============================================
# Script Backup ERP (Odoo/PostgreSQL)
# Nam IT – namit.top
# ============================================
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=”/backup/erp”
LOG_FILE=”/backup/logs/erp_backup_$(date +%Y%m%d).log”
ODOO_DATA=”/var/lib/odoo/.local/share/Odoo/filestore”
ODOO_CONFIG=”/etc/odoo”
PG_USER=”odoo”
KEEP_DAYS=14

echo “[$DATE] Bat dau backup ERP (Odoo)…” | tee -a “$LOG_FILE”
mkdir -p “$BACKUP_DIR/$DATE”

# Lay danh sach database Odoo
DATABASES=$(sudo -u postgres psql -t -c “SELECT datname FROM pg_database WHERE datname NOT IN (‘postgres’,’template0′,’template1′) AND datname LIKE ‘odoo%’;” 2>/dev/null | tr -d ‘ \n’)

for DB in $DATABASES; do
[ -z “$DB” ] && continue
echo “[$DATE] Backup Odoo DB: $DB” | tee -a “$LOG_FILE”

# Backup PostgreSQL database
sudo -u postgres pg_dump “$DB” | gzip > “$BACKUP_DIR/$DATE/${DB}_pg_$DATE.sql.gz”

# Backup filestore (file dinh kem, hinh anh)
if [ -d “$ODOO_DATA/$DB” ]; then
tar -czf “$BACKUP_DIR/$DATE/${DB}_filestore_$DATE.tar.gz” \
“$ODOO_DATA/$DB” 2>> “$LOG_FILE”
fi

echo “[$DATE] OK: ERP database $DB” | tee -a “$LOG_FILE”
done

# Backup cau hinh Odoo
tar -czf “$BACKUP_DIR/$DATE/odoo_config_$DATE.tar.gz” “$ODOO_CONFIG” 2>> “$LOG_FILE”

# Xoa backup cu
find “$BACKUP_DIR” -maxdepth 1 -type d -mtime +$KEEP_DAYS -exec rm -rf {} \;

echo “[$DATE] Backup ERP hoan thanh!” | tee -a “$LOG_FILE”

6. Script Master: Chạy toàn bộ Backup và Gửi Thông báo

Script tổng hợp chạy tất cả backup và gửi báo cáo qua email hoặc Telegram:

#!/bin/bash
# ============================================
# Script Backup Master – Chay toan bo backup
# Nam IT – namit.top
# ============================================
DATE=$(date +%Y%m%d_%H%M%S)
MASTER_LOG=”/backup/logs/master_backup_$(date +%Y%m%d).log”
EMAIL_TO=”[email protected]
TELEGRAM_TOKEN=”your_bot_token”
TELEGRAM_CHAT_ID=”your_chat_id”
SERVER_NAME=$(hostname)
START_TIME=$(date +%s)

echo “=====================================” | tee “$MASTER_LOG”
echo “BAT DAU BACKUP TOAN BO HE THONG” | tee -a “$MASTER_LOG”
echo “Thoi gian: $(date)” | tee -a “$MASTER_LOG”
echo “=====================================” | tee -a “$MASTER_LOG”

# Chay tung script backup
RESULTS=””

run_backup() {
local NAME=$1
local SCRIPT=$2
echo “[$(date)] Dang backup: $NAME…” | tee -a “$MASTER_LOG”
bash “$SCRIPT” >> “$MASTER_LOG” 2>&1
if [ $? -eq 0 ]; then
RESULTS=”${RESULTS}\n✅ $NAME: THANH CONG”
else
RESULTS=”${RESULTS}\n❌ $NAME: THAT BAI”
fi
}

run_backup “Zimbra Mail” “/backup/scripts/backup_zimbra.sh”
run_backup “Nextcloud” “/backup/scripts/backup_nextcloud.sh”
run_backup “MySQL/MariaDB” “/backup/scripts/backup_mysql.sh”
run_backup “SQL Server” “/backup/scripts/backup_sqlserver.sh”
run_backup “ERP (Odoo)” “/backup/scripts/backup_erp.sh”

# Tinh tong thoi gian
END_TIME=$(date +%s)
DURATION=$(( (END_TIME – START_TIME) / 60 ))

# Tong dung luong backup
TOTAL_SIZE=$(du -sh /backup/ 2>/dev/null | cut -f1)

# Noi dung thong bao
MESSAGE=”🖥️ BAO CAO BACKUP – $SERVER_NAME
📅 Ngay: $(date +%d/%m/%Y)
⏱️ Thoi gian: ${DURATION} phut
💾 Tong dung luong: $TOTAL_SIZE

KET QUA:
${RESULTS}”

# Gui thong bao Telegram
curl -s -X POST “https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage” \
-d “chat_id=${TELEGRAM_CHAT_ID}” \
-d “text=${MESSAGE}” \
-d “parse_mode=HTML” > /dev/null 2>&1

# Gui email thong bao
echo -e “$MESSAGE” | mail -s “Bao cao Backup $(date +%d/%m/%Y) – $SERVER_NAME” “$EMAIL_TO”

echo “[$DATE] Hoan thanh toan bo backup! Thoi gian: ${DURATION} phut” | tee -a “$MASTER_LOG”

7. Đồng bộ Backup lên Cloud với rclone

Sau khi backup local, nên đồng bộ lên cloud storage để đảm bảo an toàn theo quy tắc 3-2-1 (3 bản sao, 2 loại media, 1 bản offsite):

#!/bin/bash
# Dong bo backup len Cloud (Google Drive / S3 / Backblaze)
# Can cai dat rclone truoc: curl https://rclone.org/install.sh | sudo bash
# Cau hinh: rclone config

BACKUP_DIR=”/backup”
CLOUD_REMOTE=”gdrive:company-backup” # Ten remote da cau hinh trong rclone
LOG_FILE=”/backup/logs/cloud_sync_$(date +%Y%m%d).log”

echo “Dang dong bo backup len Cloud…” | tee “$LOG_FILE”

rclone sync “$BACKUP_DIR” “$CLOUD_REMOTE” \
–progress \
–log-file=”$LOG_FILE” \
–log-level INFO \
–transfers 4 \
–checkers 8 \
–contimeout 60s \
–timeout 300s \
–retries 3 \
–exclude “*.tmp”

echo “Dong bo Cloud hoan thanh!” | tee -a “$LOG_FILE”

8. Thiết lập Cron Job tự động

Thêm vào crontab để tự động hóa hoàn toàn:

# Mo crontab de chinh sua
crontab -e

# Them cac dong sau vao crontab:
# Backup toan bo luc 2:00 AM moi ngay
0 2 * * * /bin/bash /backup/scripts/master_backup.sh

# Dong bo len Cloud luc 4:00 AM (sau khi backup xong)
0 4 * * * /bin/bash /backup/scripts/cloud_sync.sh

# Kiem tra dung luong backup va canh bao neu > 80%
0 8 * * * df -h /backup | awk ‘NR==2{if($5+0>80) print “CANH BAO: Backup disk ” $5 ” day!”}’ | mail -s “Canh bao Disk” [email protected]

So sánh chi phí: Script vs Phần mềm có phí

Giải pháp Script Ubuntu: Chi phí bản quyền = 0 đồng/năm. Chỉ tốn chi phí storage (ổ cứng hoặc cloud). Hoàn toàn kiểm soát được dữ liệu, không lo vendor lock-in.

Veeam Backup Essentials: Từ 500 USD đến 1.500 USD/năm tùy số socket. Yêu cầu Windows Server để chạy Veeam Console.

Acronis Cyber Backup: Khoảng 60-150 USD/máy chủ/năm. Cần agent cài trên từng máy.

Commvault: Giá từ 1.000 USD/năm trở lên cho phiên bản doanh nghiệp.

Với một doanh nghiệp có 3-5 máy chủ, giải pháp script Ubuntu tiết kiệm từ 1.500 đến 5.000 USD mỗi năm so với các phần mềm backup thương mại.

Lưu ý quan trọng khi triển khai

Kiểm tra restore định kỳ: Backup vô nghĩa nếu không restore được. Hãy test khôi phục dữ liệu ít nhất 1 lần/tháng.

Mã hóa backup: Với dữ liệu nhạy cảm, nên mã hóa file backup bằng GPG trước khi đẩy lên cloud. Dùng lệnh: gpg –symmetric –cipher-algo AES256 file.tar.gz

Phân quyền script: Chạy chmod 700 cho tất cả script backup để chỉ root mới có thể thực thi. Bảo vệ file chứa mật khẩu database bằng chmod 600.

Giám sát log: Đọc log backup mỗi sáng hoặc thiết lập Zabbix/Grafana để giám sát trạng thái backup tự động.

Backup incremental: Với dữ liệu lớn (hàng trăm GB), nên dùng rsync với –link-dest để tạo backup incremental tiết kiệm dung lượng hơn full backup mỗi ngày.

Kết luận

Xây dựng giải pháp backup bằng Ubuntu Server Script không phức tạp như nhiều người nghĩ. Với kiến thức Linux cơ bản và những script trong bài viết này, bạn hoàn toàn có thể tự xây dựng hệ thống backup chuyên nghiệp cho toàn bộ hạ tầng doanh nghiệp: từ Zimbra Mail, Nextcloud, MySQL, SQL Server đến hệ thống ERP – tất cả tự động hóa, có thông báo và sync lên cloud.

Tiết kiệm hàng nghìn USD chi phí bản quyền mỗi năm, trong khi vẫn đảm bảo dữ liệu được bảo vệ an toàn, đúng lịch và có thể khôi phục nhanh chóng khi cần. Đây chính là triết lý của mã nguồn mở: mạnh mẽ, linh hoạt và hoàn toàn miễn phí!

Cùng chuyên mục

Bình luận