cat > backup.sh << 'EOF'

!/bin/bash

定义备份文件名 (带时间戳)

BACKUP_FILE="/tmp/server_backup_$(date +%Y%m%d_%H%M%S).tar.gz"

echo "🚀 开始备份阿里云轻量服务器关键数据..."
echo "📂 目标文件: $BACKUP_FILE"

定义需要备份的目录列表

注意:确保路径末尾的斜杠处理正确,tar 会处理相对路径

DIRS_TO_BACKUP=(

"/opt/dockers"
"/etc/letsencrypt"
"/etc/nginx/conf.d"
"/var/www/html"
"/etc/docker"

)

检查目录是否存在

for dir in "${DIRS_TO_BACKUP[@]}"; do

if [ ! -d "$dir" ]; then
    echo "⚠️ 警告: 目录 $dir 不存在,将跳过。"
fi

done

执行压缩打包

使用 --absolute-names 保留绝对路径,方便还原时直接解压覆盖

tar -czvf "$BACKUP_FILE" \

--absolute-names \
"${DIRS_TO_BACKUP[@]}" 2> /tmp/tar_errors.log

检查压缩是否成功

if [ $? -eq 0 ]; then

echo "✅ 备份压缩成功!"

# 获取文件大小
FILE_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
echo "📦 压缩包大小: $FILE_SIZE"

# 尝试获取本机公网IP (阿里云内网元数据)
PUBLIC_IP=$(curl -s http://100.100.100.200/latest/meta-data/eipv4)
if [ -z "$PUBLIC_IP" ]; then
    # 如果元数据获取失败,尝试通过网卡获取
    PUBLIC_IP=$(curl -s ifconfig.me)
fi

echo "------------------------------------------------"
echo "📥 下载链接 (请在浏览器中打开):"
echo "http://${PUBLIC_IP}/backup_$(date +%Y%m%d_%H%M%S).tar.gz"
echo "------------------------------------------------"
echo ""
echo "💡 提示:如果无法直接下载,请使用 scp 命令将 /tmp/server_backup_*.tar.gz 下载到本地。"

# 为了方便,把文件软链接到 Nginx 根目录(如果 Nginx 正在运行且允许访问)
# 这样你可以直接通过 http://IP/filename 下载,无需配置复杂的 Web 服务器
if [ -d "/var/www/html" ]; then
    LINK_NAME="/var/www/html/backup_latest.tar.gz"
    ln -sf "$BACKUP_FILE" "$LINK_NAME"
    echo "🔗 已创建快捷下载链接: http://${PUBLIC_IP}/backup_latest.tar.gz"
fi

else

echo "❌ 备份失败!请检查 /tmp/tar_errors.log"
exit 1

fi
EOF

赋予执行权限

chmod +x backup.sh

cat > restore.sh << 'EOF'

!/bin/bash

定义备份文件路径 (请根据实际情况修改,或者通过参数传入)

默认查找 /tmp 目录下最新的备份文件

BACKUP_FILE=$(ls -t /tmp/server_backup_*.tar.gz 2>/dev/null | head -n 1)

if [ -z "$BACKUP_FILE" ]; then

echo "❌ 错误: 在 /tmp 目录下未找到备份文件 (server_backup_*.tar.gz)"
echo "💡 请先将备份文件上传到 /tmp 目录。"
exit 1

fi

echo "🚀 开始从备份还原服务器数据..."
echo "📦 使用备份文件: $BACKUP_FILE"

1. 检查并安装必要软件 (简单检测)

echo "🔍 检查基础环境..."
if ! command -v docker &> /dev/null; then

echo "⚠️ 警告: 未检测到 Docker,请确保已预先安装 Docker 和 Docker Compose。"

fi

2. 停止正在运行的容器 (防止文件冲突)

echo "🛑 停止可能正在运行的 Docker 容器..."
cd /opt/dockers 2>/dev/null && docker compose down 2>/dev/null
cd - > /dev/null

3. 解压备份文件

--absolute-names: 使用绝对路径解压

--overwrite: 覆盖已存在的文件

echo "📂 正在解压文件..."
tar -xzvf "$BACKUP_FILE" --absolute-names --overwrite

4. 修复权限 (关键步骤)

echo "🔧 修复目录权限..."

修复 Nginx 网页目录权限

if [ -d "/var/www/html" ]; then

# 假设使用 www-data 用户 (Debian/Ubuntu),如果是 CentOS 可能是 nginx 或 root
chown -R www-data:www-data /var/www/html
chmod -R 755 /var/www/html
echo "✅ /var/www/html 权限已修复"

fi

修复 Docker 数据目录权限

if [ -d "/opt/dockers" ]; then

# Docker 挂载的目录通常保持 root 权限即可,或者跟随 docker-compose 配置
# 这里主要确保目录可读写
chmod -R 755 /opt/dockers
echo "✅ /opt/dockers 权限已修复"

fi

5. 修复 Let's Encrypt 证书权限

证书目录权限要求非常严格,否则 Certbot 会报错

if [ -d "/etc/letsencrypt" ]; then

chmod -R 755 /etc/letsencrypt
# 确保私钥等敏感文件只有 root 可读
find /etc/letsencrypt -type f -name "*.pem" -exec chmod 644 {} \;
echo "✅ /etc/letsencrypt 权限已修复"

fi

6. 重启服务

echo "⚙️ 启动 Docker 容器..."
cd /opt/dockers
if [ -f "docker-compose.yml" ] || [ -f "docker-compose.yaml" ]; then

# 尝试启动所有服务
docker compose up -d
echo "✅ Docker 容器已尝试启动"

else

echo "⚠️ 未检测到 docker-compose.yml,跳过容器启动。"

fi

重启 Nginx 以加载新的配置

echo "🔄 重启 Nginx..."
systemctl restart nginx 2>/dev/null || service nginx restart 2>/dev/null
if [ $? -eq 0 ]; then

echo "✅ Nginx 已重启"

else

echo "⚠️ Nginx 重启失败,请检查配置文件是否正确。"

fi

echo "------------------------------------------------"
echo "🎉 还原完成!"
echo "请检查以下服务状态:"
echo "1. docker ps"
echo "2. systemctl status nginx"
echo "------------------------------------------------"
EOF

chmod +x restore.sh

标签: none

添加新评论