157 lines
5.4 KiB
Bash
157 lines
5.4 KiB
Bash
#!/bin/bash
|
||
|
||
# Gitea备份脚本
|
||
# 作者:AI助手
|
||
# 日期:2025-03-13
|
||
|
||
set -e
|
||
|
||
echo "===== Gitea备份脚本 ====="
|
||
|
||
# 设置变量
|
||
BACKUP_DIR="/opt/gitea-backups"
|
||
GITEA_DIR="/opt/gitea"
|
||
MYSQL_CONTAINER="mysql" # 默认MySQL容器名
|
||
MYSQL_USER="gitea"
|
||
MYSQL_PASSWORD="gitea_password"
|
||
MYSQL_DATABASE="gitea"
|
||
DATE=$(date +%Y%m%d-%H%M%S)
|
||
KEEP_DAYS=7
|
||
DOMAIN="gitea.mzh.one"
|
||
|
||
# 检查Nginx容器
|
||
NGINX_CONTAINER=$(docker ps | grep nginx | head -1 | awk '{print $1}')
|
||
if [ -z "$NGINX_CONTAINER" ]; then
|
||
echo "警告: Nginx容器未找到,无法备份Nginx配置" 1>&2
|
||
else
|
||
NGINX_CONTAINER_NAME=$(docker inspect --format='{{.Name}}' $NGINX_CONTAINER | sed 's/\///')
|
||
echo "找到Nginx容器: $NGINX_CONTAINER_NAME"
|
||
|
||
# 检查Nginx容器的挂载点
|
||
SSL_MOUNT=$(docker inspect -f '{{range .Mounts}}{{if eq .Destination "/ssl"}}{{.Source}}{{end}}{{end}}' $NGINX_CONTAINER)
|
||
CONF_MOUNT=$(docker inspect -f '{{range .Mounts}}{{if eq .Destination "/etc/nginx/conf.d"}}{{.Source}}{{end}}{{end}}' $NGINX_CONTAINER)
|
||
|
||
if [ -z "$SSL_MOUNT" ]; then
|
||
echo "警告: 未找到Nginx容器的SSL挂载点,将使用默认路径"
|
||
SSL_MOUNT="/opt/dnmp/services/nginx/ssl"
|
||
else
|
||
echo "找到Nginx SSL挂载点: $SSL_MOUNT"
|
||
fi
|
||
|
||
if [ -z "$CONF_MOUNT" ]; then
|
||
echo "警告: 未找到Nginx容器的配置挂载点,将使用默认路径"
|
||
CONF_MOUNT="/opt/dnmp/services/nginx/conf.d"
|
||
else
|
||
echo "找到Nginx配置挂载点: $CONF_MOUNT"
|
||
fi
|
||
fi
|
||
|
||
NGINX_CONF_DIR="${CONF_MOUNT:-/opt/dnmp/services/nginx/conf.d}"
|
||
SSL_DIR="${SSL_MOUNT:-/opt/dnmp/services/nginx/ssl}/$DOMAIN"
|
||
|
||
# 自动检测MySQL容器
|
||
AUTO_DETECT_MYSQL=$(docker ps | grep -E 'mysql|mariadb' | head -1 | awk '{print $1}')
|
||
if [ ! -z "$AUTO_DETECT_MYSQL" ]; then
|
||
DETECTED_MYSQL_NAME=$(docker inspect --format='{{.Name}}' $AUTO_DETECT_MYSQL | sed 's/\///')
|
||
MYSQL_CONTAINER=$DETECTED_MYSQL_NAME
|
||
echo "自动检测到MySQL容器: $MYSQL_CONTAINER"
|
||
fi
|
||
|
||
# 检查参数
|
||
while getopts "d:g:m:u:p:k:" opt; do
|
||
case $opt in
|
||
d) BACKUP_DIR="$OPTARG" ;;
|
||
g) GITEA_DIR="$OPTARG" ;;
|
||
m) MYSQL_CONTAINER="$OPTARG" ;;
|
||
u) MYSQL_USER="$OPTARG" ;;
|
||
p) MYSQL_PASSWORD="$OPTARG" ;;
|
||
k) KEEP_DAYS="$OPTARG" ;;
|
||
\?) echo "无效的选项: -$OPTARG" >&2; exit 1 ;;
|
||
esac
|
||
done
|
||
|
||
# 显示配置信息
|
||
echo "备份配置:"
|
||
echo " 备份目录: $BACKUP_DIR"
|
||
echo " Gitea目录: $GITEA_DIR"
|
||
echo " MySQL容器: $MYSQL_CONTAINER"
|
||
echo " 保留天数: $KEEP_DAYS"
|
||
echo " 域名: $DOMAIN"
|
||
echo " Nginx配置目录: $NGINX_CONF_DIR"
|
||
echo " SSL证书目录: $SSL_DIR"
|
||
|
||
# 创建备份目录
|
||
mkdir -p "$BACKUP_DIR"
|
||
|
||
# 备份Gitea数据
|
||
echo "备份Gitea数据..."
|
||
if [ -d "$GITEA_DIR/data/gitea" ]; then
|
||
tar -czf "$BACKUP_DIR/gitea-data-$DATE.tar.gz" -C "$GITEA_DIR" data/gitea
|
||
echo "Gitea数据备份完成: $BACKUP_DIR/gitea-data-$DATE.tar.gz"
|
||
else
|
||
echo "警告: Gitea数据目录不存在: $GITEA_DIR/data/gitea"
|
||
fi
|
||
|
||
# 备份MySQL数据库
|
||
echo "备份MySQL数据库..."
|
||
if docker ps | grep -q "$MYSQL_CONTAINER"; then
|
||
docker exec "$MYSQL_CONTAINER" mysqldump -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE" > "$BACKUP_DIR/gitea-db-$DATE.sql"
|
||
echo "MySQL数据库备份完成: $BACKUP_DIR/gitea-db-$DATE.sql"
|
||
else
|
||
echo "警告: MySQL容器不存在或未运行: $MYSQL_CONTAINER"
|
||
fi
|
||
|
||
# 备份Nginx配置和SSL证书
|
||
echo "备份Nginx配置和SSL证书..."
|
||
if [ -f "$NGINX_CONF_DIR/$DOMAIN.conf" ]; then
|
||
mkdir -p "$BACKUP_DIR/nginx-$DATE/conf.d"
|
||
cp "$NGINX_CONF_DIR/$DOMAIN.conf" "$BACKUP_DIR/nginx-$DATE/conf.d/"
|
||
echo "Nginx配置备份完成: $BACKUP_DIR/nginx-$DATE/conf.d/$DOMAIN.conf"
|
||
fi
|
||
|
||
if [ -d "$SSL_DIR" ]; then
|
||
mkdir -p "$BACKUP_DIR/nginx-$DATE/ssl"
|
||
cp -r "$SSL_DIR" "$BACKUP_DIR/nginx-$DATE/ssl/"
|
||
echo "SSL证书备份完成: $BACKUP_DIR/nginx-$DATE/ssl/$DOMAIN"
|
||
fi
|
||
|
||
# 压缩Nginx备份
|
||
if [ -d "$BACKUP_DIR/nginx-$DATE" ]; then
|
||
tar -czf "$BACKUP_DIR/nginx-$DATE.tar.gz" -C "$BACKUP_DIR" "nginx-$DATE"
|
||
rm -rf "$BACKUP_DIR/nginx-$DATE"
|
||
echo "Nginx备份已压缩: $BACKUP_DIR/nginx-$DATE.tar.gz"
|
||
fi
|
||
|
||
# 压缩数据库备份
|
||
if [ -f "$BACKUP_DIR/gitea-db-$DATE.sql" ]; then
|
||
gzip "$BACKUP_DIR/gitea-db-$DATE.sql"
|
||
echo "MySQL数据库备份已压缩: $BACKUP_DIR/gitea-db-$DATE.sql.gz"
|
||
fi
|
||
|
||
# 删除旧备份
|
||
echo "删除$KEEP_DAYS天前的备份..."
|
||
find "$BACKUP_DIR" -name "gitea-data-*.tar.gz" -mtime +$KEEP_DAYS -delete
|
||
find "$BACKUP_DIR" -name "gitea-db-*.sql.gz" -mtime +$KEEP_DAYS -delete
|
||
find "$BACKUP_DIR" -name "nginx-*.tar.gz" -mtime +$KEEP_DAYS -delete
|
||
|
||
echo "===== 备份完成 ====="
|
||
echo "备份文件保存在: $BACKUP_DIR"
|
||
|
||
# 显示备份统计信息
|
||
echo "备份统计:"
|
||
echo " 数据备份数量: $(find "$BACKUP_DIR" -name "gitea-data-*.tar.gz" | wc -l)"
|
||
echo " 数据库备份数量: $(find "$BACKUP_DIR" -name "gitea-db-*.sql.gz" | wc -l)"
|
||
echo " Nginx备份数量: $(find "$BACKUP_DIR" -name "nginx-*.tar.gz" | wc -l)"
|
||
echo " 总备份大小: $(du -sh "$BACKUP_DIR" | cut -f1)"
|
||
|
||
# 使用说明
|
||
echo ""
|
||
echo "使用说明:"
|
||
echo " 1. 手动运行备份: ./backup.sh"
|
||
echo " 2. 自定义备份目录: ./backup.sh -d /path/to/backup"
|
||
echo " 3. 自定义Gitea目录: ./backup.sh -g /path/to/gitea"
|
||
echo " 4. 自定义MySQL容器: ./backup.sh -m container_name"
|
||
echo " 5. 自定义保留天数: ./backup.sh -k 14"
|
||
echo ""
|
||
echo "添加到crontab定时运行:"
|
||
echo " 0 2 * * * /opt/gitea/backup.sh > /var/log/gitea-backup.log 2>&1" |