#!/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"