gitlab跨服务器备份

因业务需求,需要将B服务器的备份文件定时拷贝到A服务器,并且保留最近三天同步的备份文件以及每个月1日的备份文件,实现shell脚本如下:gitlab-backup.sh

bash 复制代码
#!/bin/bash

# ================= 配置区域 =================
# B 服务器 IP
REMOTE_IP="192.168.1.1"
# B 服务器备份目录
REMOTE_DIR="/data/backup/gitlab"
# A 服务器本地备份目录
LOCAL_DIR="/data/backup/gitlab/gitlab"
# 登录用户
REMOTE_USER="root"
# SSH 端口
SSH_PORT="62222"
# =============================================
# 1. 确保本地目录存在
mkdir -p "$LOCAL_DIR"

echo "================ 开始同步任务 ================"

# 2. 找出 B 服务器上最新的那个 tar 文件
# 使用 ssh 连接到 B,ls -t 按时间排序,head -n 1 取第一个
LATEST_REMOTE_FILE=$(ssh -p ${SSH_PORT} ${REMOTE_USER}@${REMOTE_IP} "ls -t ${REMOTE_DIR}/*.tar 2>/dev/null | head -n 1")

# 如果远程没有找到文件,退出
if [ -z "$LATEST_REMOTE_FILE" ]; then
    echo "错误:在远程服务器上未找到任何 .tar 备份文件"
    exit 1
fi

# 提取文件名 (去掉路径)
FILENAME=$(basename "$LATEST_REMOTE_FILE")
echo "发现远程最新文件: $FILENAME"

# 3. 判断本地是否已存在该文件
# 如果本地已经有了这个文件,说明已经是最新的,无需同步
if [ -f "$LOCAL_DIR/$FILENAME" ]; then
    echo "本地已存在最新文件 $FILENAME,跳过传输。"
else
    echo "正在拉取文件..."
    # 4. 只拉取这 1 个文件
    # 注意:源是 远程:文件路径, 目标是 本地目录/
    rsync -avz -P -e "ssh -p ${SSH_PORT}" "${REMOTE_USER}@${REMOTE_IP}:${LATEST_REMOTE_FILE}" "$LOCAL_DIR/"

    if [ $? -eq 0 ]; then
        echo "文件拉取成功。"
    else
        echo "文件拉取失败!"
        exit 1
    fi
fi

# 5. 在 A 服务器(本地)执行清理策略
# 策略:删除 3 天前的文件,但保留文件名包含 '_01_' (每月1号) 的文件
echo "正在执行本地清理策略..."

cd "$LOCAL_DIR"

# 这里的逻辑是:
# find 找到 3天前的文件 -> grep -v 排除掉 '_01_' 的文件 -> xargs 删除
# 为了安全,你可以先去掉 "| xargs rm -f" 看看会删除哪些文件
DELETED_FILES=$(find . -maxdepth 1 -name '*.tar' -type f -mtime +3 | grep -v '_01_' | xargs -I {} basename {})

if [ -z "$DELETED_FILES" ]; then
    echo "没有需要清理的旧文件。"
else
    echo "即将删除以下文件:"
    echo "$DELETED_FILES"
    # 执行删除
    find . -maxdepth 1 -name '*.tar' -type f -mtime +3 | grep -v '_01_' | xargs rm -f
    echo "清理完成。"
fi

echo "================ 同步任务结束 ================"

对文件进行授权

bash 复制代码
cd /data/backup/gitlab/
chmod +x gitlab-backup.sh

配置服务器定时任务

bash 复制代码
# 执行
crontab -e
# 增加下面这两行
# 异地备份gitlab,每天凌晨 02:30 执行同步脚本
30 2 * * * /data/backup/gitlab/gitlab-backup.sh >> /data/backup/gitlab/gitlab.log 2>&1
相关推荐
艾莉丝努力练剑1 天前
【Linux网络】Linux 网络编程入门:TCP Socket 编程(上)
linux·运维·服务器·网络·tcp/ip·计算机网络
wgl6665201 天前
ELF文件 && 链接与加载
linux·运维·服务器
liuluyang5301 天前
linux kernel CONFIG_FHANDLE解析
linux·运维·服务器
冴羽yayujs1 天前
GitHub 前端热榜项目 - 日榜(2026-05-07)
前端·github
java1234_小锋1 天前
能让你的 AI 编程 Token 降低 60% 以上的开源神器:目前 GitHub 狂揽约 4.2 万星标
人工智能·github·ai编程
霜落花轻扬1 天前
在 Rails 中指定端口和 IP 地址
服务器·ruby on rails
H Journey1 天前
网络编程:服务器监听+非阻塞设置
服务器·网络·服务器监听+非阻塞设置
学困昇1 天前
彻底搞懂 Linux 基础 IO:文件描述符、重定向、dup2、缓冲区一次讲透!
linux·运维·服务器·开发语言·c++
xmlhcxr1 天前
从 0 到 1 落地企业级 DevOps CI/CD 流水线:基于 GitLab+Jenkins+Harbor 的完整实践
运维·docker·gitlab·jenkins·harbor·devops
赋创小助手1 天前
PCIe 8.0 要来了:1TB/s 带宽背后,AI 算力服务器正在进入“高速互联时代”
运维·服务器·人工智能