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