Files
server-deploy/vps-xray/backup.sh
T
2026-08-05 17:12:18 +08:00

94 lines
2.9 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
# ============================================
# Xray 备份脚本
# 备份 Xray 配置 / 部署配置 / 网络调优参数
# 输出目录默认 /var/backups/xray,自动清理 30 天前的旧备份
# ============================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
log() { echo -e "${GREEN}[INFO]${NC} $*"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
error() { echo -e "${RED}[ERROR]${NC} $*" >&2; }
if [ "$(id -u)" -ne 0 ]; then
error "请使用 root 用户运行: sudo bash backup.sh"
exit 1
fi
if [ -f .env ]; then
sed -i 's/\r$//' .env
set -a; source .env; set +a
fi
BACKUP_DIR="${BACKUP_DIR:-/var/backups/xray}"
KEEP_DAYS="${BACKUP_KEEP_DAYS:-30}"
STAMP="$(date '+%Y%m%d%H%M%S')"
mkdir -p "$BACKUP_DIR"
chmod 700 "$BACKUP_DIR"
backed_up=0
# ===== 1. Xray 配置 =====
# 打包 /usr/local/etc/xray 整个目录,恢复时 tar xzf ... -C /usr/local/etc/
if [ -d /usr/local/etc/xray ]; then
tar czf "${BACKUP_DIR}/xray_config_${STAMP}.tar.gz" -C /usr/local/etc xray
log "Xray 配置已备份: ${BACKUP_DIR}/xray_config_${STAMP}.tar.gz"
backed_up=$((backed_up + 1))
else
warn "/usr/local/etc/xray 不存在,跳过"
fi
# ===== 2. 部署配置(.env + 脚本)=====
# .env 含私钥,打包后权限收紧到 600
deploy_files=()
for f in .env deploy.sh uninstall.sh backup.sh upload.sh .env.example; do
[ -f "$f" ] && deploy_files+=("$f")
done
if [ "${#deploy_files[@]}" -gt 0 ]; then
tar czf "${BACKUP_DIR}/deploy_${STAMP}.tar.gz" -C "$SCRIPT_DIR" "${deploy_files[@]}"
chmod 600 "${BACKUP_DIR}/deploy_${STAMP}.tar.gz"
log "部署配置已备份: ${BACKUP_DIR}/deploy_${STAMP}.tar.gz(权限 600,含私钥)"
backed_up=$((backed_up + 1))
else
warn "未找到可备份的部署文件,跳过"
fi
# ===== 3. 网络调优参数 =====
if [ -f /etc/sysctl.d/99-xray-turbo.conf ]; then
cp /etc/sysctl.d/99-xray-turbo.conf "${BACKUP_DIR}/sysctl_${STAMP}.conf"
log "网络调优参数已备份: ${BACKUP_DIR}/sysctl_${STAMP}.conf"
backed_up=$((backed_up + 1))
else
warn "/etc/sysctl.d/99-xray-turbo.conf 不存在,跳过"
fi
if [ "$backed_up" -eq 0 ]; then
error "没有任何内容被备份,请确认 Xray 是否已部署"
exit 1
fi
# ===== 4. 清理过期备份 =====
old_count=$(find "$BACKUP_DIR" -maxdepth 1 -type f \
\( -name 'xray_config_*.tar.gz' -o -name 'deploy_*.tar.gz' -o -name 'sysctl_*.conf' \) \
-mtime "+${KEEP_DAYS}" | wc -l)
if [ "$old_count" -gt 0 ]; then
find "$BACKUP_DIR" -maxdepth 1 -type f \
\( -name 'xray_config_*.tar.gz' -o -name 'deploy_*.tar.gz' -o -name 'sysctl_*.conf' \) \
-mtime "+${KEEP_DAYS}" -delete
log "已清理 ${old_count} 个超过 ${KEEP_DAYS} 天的旧备份"
fi
echo ""
log "备份完成,目录: ${BACKUP_DIR}"
ls -lh "$BACKUP_DIR" | tail -n +2 | tail -10