newechoes/src/content/Linux/linux实现定时备份网站到网盘.md
lsy 16125a580c 重构内容处理并改进构建配置
- 更新 Vite 配置,使用手动块拆分来提高性能
- 修改内容配置以处理特殊文件命名和路径解析
- 更新导航链接并删除未使用的页面
- 改进文章 API 和路由以支持动态路径处理
- 简化内容结构并添加用于路径操作的实用函数
2025-03-09 01:11:43 +08:00

240 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "Linux实现定时备份网站到网盘"
date: 2024-05-03T20:32:15+08:00
tags: []
---
## 安装bypy
### 安装 pip 和虚拟环境
1. 安装虚拟环境创建工具:
```bash
sudo apt-get install python3-venv -y
```
2. 创建一个新的虚拟环境:
```bash
python3 -m venv "/var/script/venv"
```
3. 激活虚拟环境:
```bash
source "/var/script/venv/bin/activate"
```
4. 安装 Python 库
1. 安装 bypy
```bash
pip install bypy
```
2. 安装 requests
```bash
pip install requests
```
### bypy 设置
#### 授权登录
##### 运行 `bypy info` 后按照提示进行:
1. 将提示中的链接粘贴到浏览器中登录。
2. 输入账号密码登录后授权,获取授权码。
3. 将授权码粘贴回终端并按回车。
##### bypy 基本操作
* `bypy info`:查看空间使用信息。
* `bypy list`:查看目录信息。
* `bypy upload`:上传根目录所有文件。
* `bypy downdir`:把云盘上的内容同步到本地。
* `bypy compare`:比较本地当前目录和云盘根目录。
## 安装阿里网盘备份工具
Github项目地址:[https://github.com/tickstep/aliyunpan](https://github.com/tickstep/aliyunpan)
1. 下载工具包
```bash
wget -P "/var/script" https://github.com/tickstep/aliyunpan/releases/download/v0.3.2/aliyunpan-v0.3.2-linux-amd64.zip -O "/var/script/aliyunpan.zip"
```
2. 解压工具包
```bash
unzip "/var/script/aliyunpan.zip" -d "/var/script"
```
3. 删除压缩包
```bash
rm "/var/script/aliyunpan.zip"
```
4. 重命名工具包名
```bash
mv "/var/script/$(ls "/var/script" | grep "aliyunpan")" "/var/script/aliyunpan"
```
5. 登录阿里云盘
```bash
/var/script/aliyunpan/aliyunpan login
```
## Shell 备份脚本
> 将`数据路径``网站根目录名称``数据库名称``数据库用户名``数据库密码`改为自己的
### 使用于只用docker-compose搭建,只需要备份文件,并上传到网盘
```bash
#!/bin/bash
web_path="/var/www" # 数据路径
date_time=$(date +"%Y_%m_%d") # 日期格式
year=$(date +"%Y") #年份
aliyunpan="/var/script/aliyunpan/aliyunpan" #阿里云盘可执行文件路径
# 激活百度网盘环境
source "/var/script/venv/bin/activate"
for item in "$web_path"/*; do
item_name=$(basename "$item")
# 切换到网站目录进行压缩
cd "$item" || exit
tar -czf "${item_name}_${date_time}.tar.gz" .
# 上传到百度网盘存储
bypy upload "${item_name}_${date_time}.tar.gz" "/${item_name}/"
# 上传到阿里云盘
$aliyunpan upload "${item_name}_${date_time}.tar.gz" "/网站/${item_name}/${year}/"
# 删除文件
rm "${item_name}_${date_time}.tar.gz"
done
```
### 适用于 mysql+nginx的网站,需要备份文件和数据库,并上传到网盘
```bash
#!/bin/bash
web_path="/var/www" # 数据路径
web_arry=("alist" "bitwarden" "blog") # 网站根目录名称
mysql_arry=("blog") # 数据库名称
date_time=$(date +"%Y_%m_%d") # 日期格式
year=$(date +"%Y") #年份
user="root" # 数据库用户名
password="lsy22.com" # 数据库密码
original_dir=$(pwd) # 记录原始目录
# 激活百度网盘环境
source ~/myvenv/bin/activate
# 组合备份
for item in "${mysql_arry[@]}"; do
# 创建SQL备份
mysqldump -u $user -p$password ${item} > "${item}_${date_time}.sql"
# 检查是否有同名的网站目录
if [[ " ${web_arry[@]} " =~ " ${item} " ]]; then
# 切换到网站目录进行压缩
cd "${web_path}/${item}/" || exit
zip -r "${item}_web_${date_time}.zip" .
# 将数据库SQL文件和网站压缩包一起压缩
zip "${item}_${date_time}.zip" "${item}_${date_time}.sql" "${item}_web_${date_time}.zip"
# 删除临时的网站压缩包
rm "${item}_web_${date_time}.zip"
# 返回原始目录
cd "$original_dir" || exit
else
# 否则,只压缩数据库
zip "${item}_${date_time}.zip" "${item}_${date_time}.sql"
fi
rm "${item}_${date_time}.sql"
# 上传到云存储
bypy upload "${item}_${date_time}.zip" "/${item}/${year}/"
# 上传到百度网盘存储
bypy upload "${item}_${date_time}.zip" "/${item}/"
# 上传到阿里云盘
aliyunpan upload "${item}_${date_time}.zip" "/网站/${item}/${year}/"
# 删除文件
rm "${item}_${date_time}.zip"
done
# 单独备份那些没有同名数据库的网站目录
for item in "${web_arry[@]}"; do
if [[ ! " ${mysql_arry[@]} " =~ " ${item} " ]]; then
# 切换到网站目录进行压缩
cd "${web_path}/${item}/" || exit
zip -r "${item}_${date_time}_data.zip" .
# 上传到百度网盘存储
bypy upload "${item}_${date_time}.zip" "/${item}/"
# 上传到阿里云盘
aliyunpan upload "${item}_${date_time}.zip" "/网站/${item}/${year}/"
# 删除文件
rm "${item}_${date_time}_data.zip"
# 返回原始目录
cd "$original_dir" || exit
fi
done
```
### 适用于 mysql+nginx的网站,需要备份文件和数据库
```bash
#!/bin/bash
web_path="/var/www" # 数据路径
web_arry=("alist" "bitwarden" "blog") # 网站根目录名称
mysql_arry=("blog" "study") # 数据库名称
date_time=$(date +"%Y_%m_%d")
year=$(date +"%Y")
user="" # 数据库用户名
password="" # 数据库密码
for item in ${mysql_arry[@]};do
mkdir -p "$item/$year"
mysqldump -u $user -p$password ${item} > "${item}_${date_time}.sql"
zip "./$item/$year/${item}_${date_time}.zip" "./${item}_${date_time}.sql"
rm "./${item}_${date_time}.sql"
done
for item in ${web_arry[@]};do
mkdir -p "./$item/$year"
zip -r "./${item}_${date_time}_data.zip" "${web_path}/${item}"
if [ -f "./$item/$year/${item}_${date_time}.zip" ];then
zip -u "./$item/$year/${item}_${date_time}.zip" "./${item}_${date_time}_data.zip"
else
zip "./$item/$year/${item}_${date_time}.zip" "./${item}_${date_time}_data.zip"
fi
rm "./${item}_${date_time}_data.zip"
done
```
## 添加执行权限
```bash
chmod +x backups.sh
```
## 设置定时任务
1. 编辑 crontab 以自动执行备份脚本:
```bash
crontab -e
```
添加以下内容,调整脚本路径为实际路径:
```cron
0 0 1 * * /var/script/backups.sh # 每个月的第一天的午夜00:00执行
```
2. 重启 cron 服务以应用更改:
```bash
sudo systemctl restart cron
```