[教程]手把手教你用OneDrive自动备份网站

发布于 2020-08-16  2.64k 次阅读


最近TG上加了一位dalao(耐心的可爱大姐姐(x)),从她口中听闻了IDC供应商的一些幕后真想。加之受最近某些国人IDC跑路的影响,因此愈发担心这台服务器的数据安全(虽然大姐姐说本站目前在用的狗云大概不会跑路)。

于是,便想到用免费的OneDrive网盘进行定期数据备份。

前置知识:

一个大容量的OneDrive账户

(这里我采用了开小号注册开发者白嫖Office 365 E5订阅 + 开小号GitHub Action自动续期(ms:我 嫖 我 自 己。话说备份服务器难道不算开发者需求吗?当然算了~))

一台需要备份的服务器(废话)

准备完成后,可以开始利用OneDrive备份这台服务器了~

步骤一:rclone挂载OneDrive

首先安装需要的软件

我的服务器基于ProgynovaDebian,所以对应的命令为:

sudo apt install rclone fuse

同时在你的本机也安装rclone备用。

在你的本机(能打开浏览器的机器上),执行

rclone authorize "onedrive"

在浏览器中继续操作(登陆OneDrive并授权),并复制Paste the following into your remote machine --->,<---End paste之间的内容,那是一段json文本。

在服务器执行

sudo rclone config

依据指示操作(这点英文肯定大家都看得懂吧),并粘贴复制的json文本,完成rclone挂载点设置。

之后,在远程机器上运行:

sudo rclone mount MountName:RemoteDir LocalDir --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000

其中MountName为之前在rclone中设置的挂载点名称,RemoteDir为远程文件夹的目录(OneDrive中的路径),LocalDir为本地挂载路径。

我的挂载点名称为OneDrive,远程路径为Backup,本地路径为/home/OneDrive,于是,我的命令就是:

rclone mount OneDrive:Backup /home/OneDrive --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000

这时你的终端会没有相应,没关系,这并不是rclone被卡死,而是正常现象。

打开另一个ssh,连接服务器,执行

df -h

可以正常看到OneDrive挂载点,说明挂载成功。

进入OneDrive挂载目录,新建几个文件试试?

你会发现网页端文件夹被神奇的同步了。

但是,就这样让rclone每次卡住一个终端可不是什么好主意,即使用screen运行,也缺乏必要的守护。服务器必要追求稳定,于是,我们选择用systemd守护rclone。

首先Ctrl+C你之前打开的rclone进程。

sudo nano /lib/systemd/system/rclone.service

粘贴以下内容:

[Unit]
Description = rclone
Requires=network.target

[Service]
User = root
ExecStart = /usr/bin/rclone mount OneDrive:Backup /home/OneDrive --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000
Restart = on-abort

[Install]
WantedBy = multi-user.target

请将ExecStart一行替换为你所需要的内容。

sudo systemctl enable rclone
sudo systemctl restart rclone
sudo systemctl status rclone

没有报错,说明OneDrive挂载正式完成。

步骤二:编写备份脚本

首先决定你要备份的文件和备份方式,我要备份wordpress网站目录、wordpress数据库、apache2配置文件。

(什么?你说这台服务器上还跑着calendar?那种怎样都好的东西炸了就炸了吧~)

相应的备份命令为:

sudo tar -zcvf ./wordpress.tar.gz /var/www/wordpress
sudo tar -zcvf ./apache.tar.gz /etc/apache2
sudo mysqldump -uUser -pPassword wordpress > wordpress.sql

哪里需要替换大家都很清楚(什么?你不知道?这都不知道还配做Linux运维?)

当然如果你认为我的数据库用户名密码就是User和Password那我也没办法~

把这些东西写成脚本,大概是这个样子:

#!/usr/bin/python3

import time
dirName = str(time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime()))

import os

print('Creating Directory')
os.system('mkdir ' + dirName)
print('Zipping WordPress Site')
os.system('sudo tar -zcvf ./' + dirName + '/wp_sitefiles.tar.gz /var/www/wordpress')
print('Zipping Aapche2 Configure')
os.system('sudo tar -zcvf ./' + dirName + '/apache2_conf.tar.gz /etc/apache2')
print('Dumping Database')
os.system('sudo mysqldump -uroot -pVirgo wordpress > ./' + dirName + '/wp_database.sql')
print('Moving Files')
os.system('mv ./' + dirName + ' /home/OneDrive/' + dirName)

(因为不会用bash所以只好用Python,不用骂了,我自己会爪巴的)

对这个文件chmod +x增加执行权限,然后用root账户运行以下~

然后你会看到你的OneDrive对应文件夹里出现了以时间为名的文件夹,里面还有你需要的文件

什么?里面只有奇奇怪怪的tmp文件,且执行没有完成?

请静待上传完成,执行

watch -n 0.5 -d sudo ifconfig eth0

用监视网络流量来减少你的焦虑

如果成功的话,只要让这个文件定时执行,我们的定期备份就算成功了。

sudo crontab -e

文件末尾追加以下内容:

0 3 * * 1 /home/Amagi/backup/work.py

这条命令意为每周1上午3时执行work.py,最后的可执行文件路径请修改成自己的文件。crontab具体用法请自行必应。

最后,别忘了启动cron服务。

sudo systemctl enable cron
sudo systemctl start cron
sudo systemctl status cron

素质三连,然后静待下次更新后,看成果吧~

呐,所以,如果对你有帮助的话,能否帮忙推荐一下这个萌新的博客呢?


Faster than LIGHT