GiteaDocker/backup.sh

157 lines
5.4 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
# 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"