gongxiangp2/backup-database.sh
chenpei d17f6df2c7 feat: 部门管理和文件上传优化
新功能:
1. 部门管理功能
   - 管理员可在系统设置中添加/删除部门
   - 用户注册时从下拉框选择部门
   - 新增Department数据库表和API

2. 文件上传优化
   - 支持直接上传源文件(.max/.psd/.ai/.cad/.dwg/.c4d)
   - 自动识别文件类型并设置素材类型
   - 压缩包需手动选择类型
   - 优化拖拽上传体验

数据库变更:
- 新增departments表
- User表新增department字段
2025-10-26 14:06:19 +08:00

187 lines
4.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
################################################################################
# 由壹点3D素材共享平台 - 数据库自动备份脚本
# 功能:自动备份PostgreSQL数据库(不包含源素材文件)
# 使用:./backup-database.sh
################################################################################
# 配置
BACKUP_DIR="/mnt/PoolOne/backups/youyidian-3d"
DB_HOST="192.168.58.20"
DB_PORT="5432"
DB_NAME="lobechat"
DB_USER="gongxiangpan"
DB_PASS="gongxiangpan123"
KEEP_DAYS=30 # 保留最近30天的备份
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
# 创建备份目录
create_backup_dirs() {
log_info "创建备份目录..."
mkdir -p "$BACKUP_DIR/database"
mkdir -p "$BACKUP_DIR/logs"
}
# 备份数据库
backup_database() {
local timestamp=$(date +%Y%m%d_%H%M%S)
local backup_file="$BACKUP_DIR/database/db_backup_${timestamp}.sql.gz"
log_info "开始备份数据库..."
# 使用Docker运行pg_dump
docker run --rm \
-e PGPASSWORD="$DB_PASS" \
postgres:15-alpine \
pg_dump \
-h "$DB_HOST" \
-p "$DB_PORT" \
-U "$DB_USER" \
-d "$DB_NAME" \
--no-owner \
--no-acl \
2>/dev/null | gzip > "$backup_file"
if [ $? -eq 0 ] && [ -f "$backup_file" ]; then
local size=$(du -h "$backup_file" | cut -f1)
log_info "数据库备份成功: $backup_file (大小: $size)"
return 0
else
log_error "数据库备份失败"
rm -f "$backup_file"
return 1
fi
}
# 清理旧备份
cleanup_old_backups() {
log_info "清理超过 ${KEEP_DAYS} 天的旧备份..."
# 清理数据库备份
local db_deleted=$(find "$BACKUP_DIR/database" -name "db_backup_*.sql.gz" -mtime +$KEEP_DAYS -delete -print | wc -l)
if [ $db_deleted -gt 0 ]; then
log_info "删除了 $db_deleted 个旧数据库备份"
fi
# 清理旧日志
find "$BACKUP_DIR/logs" -name "backup_*.log" -mtime +$KEEP_DAYS -delete
}
# 生成备份报告
generate_report() {
local report_file="$BACKUP_DIR/logs/backup_$(date +%Y%m%d_%H%M%S).log"
cat > "$report_file" << EOF
================================================================================
数据库备份报告
================================================================================
备份时间: $(date '+%Y-%m-%d %H:%M:%S')
数据库: $DB_NAME@$DB_HOST:$DB_PORT
--- 备份统计 ---
数据库备份数量: $(ls -1 "$BACKUP_DIR/database" 2>/dev/null | wc -l)
最旧备份: $(ls -t "$BACKUP_DIR/database" 2>/dev/null | tail -n 1 | xargs stat -c %y 2>/dev/null | cut -d' ' -f1)
最新备份: $(ls -t "$BACKUP_DIR/database" 2>/dev/null | head -n 1 | xargs stat -c %y 2>/dev/null | cut -d' ' -f1)
--- 磁盘使用 ---
数据库备份占用: $(du -sh "$BACKUP_DIR/database" 2>/dev/null | cut -f1)
总计占用: $(du -sh "$BACKUP_DIR" 2>/dev/null | cut -f1)
--- 最新5个备份 ---
$(ls -lht "$BACKUP_DIR/database" 2>/dev/null | head -n 6 | tail -n 5)
================================================================================
EOF
log_info "备份报告已生成: $report_file"
}
# 测试数据库连接
test_connection() {
log_info "测试数据库连接..."
docker run --rm \
-e PGPASSWORD="$DB_PASS" \
postgres:15-alpine \
psql \
-h "$DB_HOST" \
-p "$DB_PORT" \
-U "$DB_USER" \
-d "$DB_NAME" \
-c "SELECT 1;" >/dev/null 2>&1
if [ $? -eq 0 ]; then
log_info "数据库连接成功"
return 0
else
log_error "数据库连接失败"
return 1
fi
}
# 主函数
main() {
echo ""
echo "========================================"
echo " 由壹点3D素材 - 数据库备份"
echo "========================================"
echo ""
# 测试连接
if ! test_connection; then
log_error "备份终止:无法连接到数据库"
exit 1
fi
# 创建目录
create_backup_dirs
# 执行备份
local db_status=0
backup_database || db_status=1
# 清理旧备份
cleanup_old_backups
# 生成报告
generate_report
# 汇总结果
echo ""
echo "========================================"
echo " 备份完成"
echo "========================================"
if [ $db_status -eq 0 ]; then
log_info "数据库备份任务成功完成"
exit 0
else
log_error "数据库备份任务失败"
exit 1
fi
}
# 执行主函数
main "$@"