Skip to content

Commit 9d49a41

Browse files
committed
feat: add backup and restore scripts for Docker volumes, including functionality for creating backups and restoring from specific dates
1 parent 9675148 commit 9d49a41

3 files changed

Lines changed: 96 additions & 1 deletion

File tree

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@
22
.env*
33
!.env.example
44

5-
.DS_Store
5+
.DS_Store
6+
7+
backup/

backup.sh

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#!/bin/bash
2+
3+
# Docker 備份腳本
4+
# 使用方法: ./backup.sh
5+
6+
set -e
7+
8+
# 設定變數
9+
BACKUP_DIR="./backup"
10+
DATE=$(date +%Y%m%d-%H%M%S)
11+
PROJECT_NAME="pastexam"
12+
13+
# 創建備份目錄
14+
mkdir -p $BACKUP_DIR
15+
16+
echo "開始備份 Docker 容器資料..."
17+
echo "備份時間: $DATE"
18+
19+
# 備份 Volume 資料
20+
echo "備份 Docker Volumes..."
21+
22+
# PostgreSQL Volume 備份
23+
if docker volume ls --format "{{.Name}}" | grep -q "pastexam-postgres-data"; then
24+
echo "備份 PostgreSQL volume..."
25+
docker run --rm -v pastexam-postgres-data:/data -v $(pwd)/$BACKUP_DIR:/backup alpine tar czf /backup/postgres-volume-$DATE.tar.gz -C /data .
26+
echo "PostgreSQL volume 備份完成"
27+
fi
28+
29+
# MinIO Volume 備份
30+
if docker volume ls --format "{{.Name}}" | grep -q "pastexam-minio-data"; then
31+
echo "備份 MinIO volume..."
32+
docker run --rm -v pastexam-minio-data:/data -v $(pwd)/$BACKUP_DIR:/backup alpine tar czf /backup/minio-volume-$DATE.tar.gz -C /data .
33+
echo "MinIO volume 備份完成"
34+
fi
35+
36+
echo "所有備份已完成!備份檔案位於: $BACKUP_DIR"
37+
echo "備份檔案列表:"
38+
ls -la $BACKUP_DIR/*$DATE*
39+
40+
# 保留最近 4 週的備份,刪除舊的 (每週備份,保留 4 份)
41+
echo "清理 4 週前的備份檔案..."
42+
find $BACKUP_DIR -name "*.tar.gz" -mtime +28 -delete
43+
echo "備份腳本執行完成!"

restore.sh

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#!/bin/bash
2+
3+
# Docker 還原腳本
4+
# 使用方法: ./restore.sh [backup_date]
5+
# 例如: ./restore.sh 20241225-143022
6+
7+
set -e
8+
9+
BACKUP_DIR="./backup"
10+
BACKUP_DATE=$1
11+
12+
if [ -z "$BACKUP_DATE" ]; then
13+
echo "使用方法: $0 [backup_date]"
14+
echo "可用的備份:"
15+
ls -la $BACKUP_DIR/ | grep -E "\.(sql|tar\.gz)$" | head -10
16+
exit 1
17+
fi
18+
19+
echo "開始還原 Docker 容器資料..."
20+
echo "還原日期: $BACKUP_DATE"
21+
22+
# 確保容器停止
23+
echo "停止容器..."
24+
docker compose down
25+
26+
# 還原 Volume 資料
27+
echo "還原 Docker Volumes..."
28+
29+
# 還原 PostgreSQL Volume
30+
if [ -f "$BACKUP_DIR/postgres-volume-$BACKUP_DATE.tar.gz" ]; then
31+
echo "還原 PostgreSQL volume..."
32+
docker volume rm pastexam-postgres-data 2>/dev/null || true
33+
docker volume create pastexam-postgres-data
34+
docker run --rm -v pastexam-postgres-data:/data -v $(pwd)/$BACKUP_DIR:/backup alpine tar xzf /backup/postgres-volume-$BACKUP_DATE.tar.gz -C /data
35+
echo "PostgreSQL volume 還原完成"
36+
fi
37+
38+
# 還原 MinIO Volume
39+
if [ -f "$BACKUP_DIR/minio-volume-$BACKUP_DATE.tar.gz" ]; then
40+
echo "還原 MinIO volume..."
41+
docker volume rm pastexam-minio-data 2>/dev/null || true
42+
docker volume create pastexam-minio-data
43+
docker run --rm -v pastexam-minio-data:/data -v $(pwd)/$BACKUP_DIR:/backup alpine tar xzf /backup/minio-volume-$BACKUP_DATE.tar.gz -C /data
44+
echo "MinIO volume 還原完成"
45+
fi
46+
47+
48+
49+
echo "還原完成!現在可以啟動服務:"
50+
echo "docker compose up -d"

0 commit comments

Comments
 (0)