在CentOS7下使用OneDrive Free Client将网站备份文件同步到个人OneDrive

标题应该能说明想干嘛了是吧?注意,这里的“OneDrive Free Client“是个特指,是一个开源的Linux下访问巨硬OneDrive的工具。
这玩意儿安装起来颇费周折,故此撰文记录一下。
首先,这个工具有两个开发者。原开发者skilion 2021年后放弃了维护,转而被 abraunegg 接手继续开发。但是A君的文档写得实在是乱七八糟,我到原库查看了S君的文档,才顺利地装了下来。
总之就是玩这个东东,开始的安装和授权相当麻烦,后面的配置和启动都不值一提。

安装

※可能是使用D语言开发的缘故,本工具需要编译安装,不同Linux发行版的编译环境的配置方法不同,这里只写CentOS7 的,其余版本的编译环境安装方法请自行在官网文档里查找,大同小异。

安装编译环境

sudo yum groupinstall 'Development Tools'
sudo yum install libcurl-devel sqlite-devel
curl -fsS https://dlang.org/install.sh | bash -s dmd-2.099.0

除libcurl-devel和sqlite-devel外,如果提示少啥库就装啥库,

下载代码、编译、安装

git clone https://github.com/abraunegg/onedrive.git
cd onedrive
#使用编译需要的环境变量
source ~/dlang/dmd-2.099.0/activate
./configure
make clean; make;
sudo make install
#恢复原始环境变量
deactivate

这里的“2.099.0”,就是上一步安装的dmd的版本,不同的版本需要根据官网的说明进行替换。
因为这玩意儿卸载的时候也要make,所以建议代码留着别删。

在个人账户下给此APP授权访问

Linux控制台下,不带参数运行onedrive,窗口上会给出一个访问链接。把Authorize this app visiting:后面的内容复制粘贴到浏览器。

onedrive
Configuring Global Azure AD Endpoints
Authorize this app visiting:

#复制控制台上的下面这个链接↓↓↓
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&scope=Files.ReadWrite%20Files.ReadWrite.All%20Sites.ReadWrite.All%20offline_access&response_type=code&prompt=login&redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient

Enter the response uri:

访问后会要求输入你的onedrive账号和密码。之后弹出是否同意此APP访问账户的窗口,选同意。
onedrive_app_auth
同意后浏览器上一片空白,但是邮箱里会收到一封确认信。我安装时卡在这里好久,完全看不出已经可以继续了。此时把白屏的地址栏上的内容复制下来备用。
什么?你没有账号和密码?那把这篇博文叉了吧。

回到Linux控制台,在Enter the response url: 后面粘贴上刚才复制的内容,回车

Configuring Global Azure AD Endpoints
Authorize this app visiting:

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&scope=Files.ReadWrite%20Files.ReadWrite.All%20Sites.ReadWrite.All%20offline_access&response_type=code&prompt=login&redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient

#把浏览器上的链接粘贴到冒号后面↓↓↓
Enter the response uri: https://xxxxxxxxxxxxxxxxxx

Application has been successfully authorised, however no additional command switches were provided.

Please use 'onedrive --help' for further assistance in regards to running this application.

OK,至此最离谱的部分都过去了。
此时其实已经可以用了,什么都不改,执行同步命令,你的OneDrive就会跟~/OneDrive血脉相连了。但这还不够,因为我只想上传网站备份,在linux上保留整个onedrive毫无必要。所以接下来要对默认配置进行修改。

配置

配置文件

使用默认配置是不需要配置文件的。但要修改配置的话,需要先下载配置文件。(呃,其实也可以完全手搓)
下载到下面两个位置都可以生效。
~/.config/onedrive/
/etc/onedrive/
默认这两个文件都是不存在的,想修改默认配置的时候再创建它们即可。
因为上传备份这件事只能以root身份运行,所以这里这两个位置也没差多少。如果多用户公用服务器的话,当然是各人配各人的。

下载配置文件

mkdir -p ~/.config/onedrive
wget https://raw.githubusercontent.com/abraunegg/onedrive/master/config -O ~/.config/onedrive/config

编辑配置文件

vim ~/.config/onedrive/config

找到”sync_dir”字段,去掉前面的“#”号,并改成备份文件所在的上一级目录。对于bt面板来说,备份目录是”/www/backup”。为了数据安全,当然可以另存到其它位置。不过那样还需要另外启cron进行搬运,对我来说太麻烦了。
另外我还修改了监视时间。网站一天备份一次,默认的300秒对我来说太频繁了,根本用不上。
还有一个monitor_fullscan_frequency,是全盘同步频率,乘以monitor_interval得到的是扫整个folder的时间间隔。现在的使用场景根本不需要作全盘同期,所以随便改改就好,我这里给监视时间设成4小时,全盘同期设成了12小时。
另外还有很多项目可以设,对我来说没需要,看都没看。有需要的在这里自己查。

#sync_dir="~/OneDrive"
sync_dir = "/www"
#monitor_interval="300"
monitor_interval="14400"
# monitor_fullscan_frequency = "12"
monitor_fullscan_frequency = "3"

创建同步文件列表

此软件提供了单独的文件列表功能,如果创建了此列表,则【只】同步此列表中出现的内容。这正是我想要的。也正是因为有这个功能,上面才会把同步文件夹指定到备份目录的上一级目录。

vim ~/.config/onedrive/sync_list

配置文档上写得很清楚,就不解释了。这里只要同步database和site这两个目录就够了
/backup/site/*.tar.gz
/backup/database/*.sql.gz

至此,配置完成。

测试及初次运行

先“空跑”一下,根据log判断是否是自己想要的配置。

onedrive --synchronize --verbose --dry-run --resync

注意,每次修改了configure中的sync_dir,skip_dir,skip_file,drive_id,或者sync_list的话,要加上”–resync”这个参数。

配置无误的话,去掉”–dry-run”进行首次同步

onedrive --synchronize --verbose --resync

查看一下个人目录,会发现备份文件已经咔咔上传了。

服务

注意:启动服务之前,一定要成功地先进行过至少一次手动执行命令;如果改动了上文提到的configure或者sync_list,一定要执行过resync,否则服务无法成功启动。

启动

systemctl start onedrive

开机自启动

systemctl enable onedrive

stop,restart,disable,status也一样,玩服务器的都懂,就不废话了。

命令

命令列表里啥都有。列几个用得到的。

查看配置

onedrive --display-config

执行同步

onedrive --synchronize

显示详细加 –verbose,空跑加–dry-run,重新全部同期加–resync

只同步某个目录

onedrive --synchronize --single-directory 'dir_name'

只下载

onedrive --synchronize --download-only

只上传

onedrive --synchronize --upload-only

反安装

这个必须要提一下,因为这货反安装也需要make。
记得安装时建议保留原代码不?这里用到。删了也行,重新下呗。

cd onedrive
source ~/dlang/dmd-2.099.0/activate
sudo make uninstall
deactivate
rm -f ~/.config/onedrive/refresh_token

以上。这下我再也不用担心服务器供应商跑路了。

已有16条评论

  1. 比较复杂,不适合我这种小白哈,现在备份直接用的七牛和腾讯,随时备份,保存15个版本

    1. 我不信任任何国产服务。

  2. `make clen; make;`
    clean 少了个a

    头一次见到用D语言开发的玩意,就感觉日本人喜欢D语言的多一些。

    这种类oauth2认证点完确定然后页面一片空白(然后收到邮件)这种荒唐事,微软干,谷歌也干,非死不可也干,推特也干,基本上所有大厂对于第三方客户端的认证接口都特别做了劣化,多少人多少次在多少场景下都被这么坑过,相当烦躁。

    用源码`make uninstall`那得是无参数`./configure`才能成功,像我这种喜欢`–prefix`的直接就去删prefix目录。然后不论是有源码make uninstall还是删prefix目录,最后都会在`~/`下面丢出一大堆垃圾出来,root安装的软件甚至还在/root下面有垃圾,搞不好/etc甚至/var底下都有垃圾,追上Windows了,烦死了,以至于我现在看到`sudo make install`就恶心,一个用户端软件要个屁屁的root权限。现在看到这种玩意我就直接套皮在Docker里面用,或者干脆直接找Docker版本。

    1. 谢抓虫。
      后面接手的哥们之所以文档写的差,就是他支持了docker和普通用户。然后docker版的说明、不同用户的说明跟原版的说明混在一起乱七八糟。对于docker我在VPS上始终没敢迈出第一步,只能在公司服务器上瞎玩。

      1. Docker这玩意的文档就在于,Docker一侧的用户文档会跟原版的文档差别大到离谱,以至于我对自己项目Docker化之后都是直接开一个新仓库单独搞(然后发现自己并没有同时存在标准编译和Docker的项目)。不过网上多数项目源文件和Dockerfile都是堆在一起的。正规点的项目会直接不写Docker传参的文档,要求用户直接mount配置文件目录。
        另外写文档这事以前以为可能只有中国人有这类问题,我那些以前同时写文档都跟挤牙膏似的。然后小需求看多了就发觉全球人写文档都跟母语不及格似的。
        如果你在主机上搞了特别多iptables或者Docker也用到的东西的话,那用起来是会比较坑。

  3. 这个真麻烦 我部署了rsync文件同步服务 也做了FTP备份 缺点也很明显需要两台机器😂

  4. 刚把工作电脑的ubuntu格了,装上debian

  5. 看到中间Microsoft那个截图,感慨难得遇到一个用日文作系统语言的伙伴啊!(其实日文IT看着很吃力)

    1. 在日文开发的很多吧。我们大连遍地都是,扫卫生阿姨都会整两句日语。

  6. 代码高亮,代码是黑的,背景也是黑的?😂

    1. 这个问题我是知道的,一直懒得改。既然你好心提醒了,那我就改了一下下。谢谢。

  7. 这个看着就很头疼,现在微软的win11和linux结合的那么好,在linux上装一个onedrive却要这么折腾,也是无语。我上回也想在自己常用的ubuntu上安装一个onedrive进行同步备份文件,折腾了许久没搞定,还apt install了一大堆有的没的依赖和软件,搞得我差点洁癖发作重装系统,后来删了几个文件夹了事。

    1. ubuntu上好像有个带图形界面的。不过确实得一点一点试。这次我其实是被VPS供应商吓到了,因为后台没注册手机号,他们没通知就把我服务停了。我还以为删库跑路了。

  8. 这头像的什么字体还挺好看的,居然还支持中英文,不知道文件大不大。

    1. 中英文不是同一种字体。英文是Lavishly Yours,中文是Long Cang,都是谷歌字体随便找的。在线加载的,英文字体应该很小,中文这个全加载挺大的。

    1. Dropbox只用过一小段时间它就被墙了,后来微软账号免费送5G就换OneDrive了。我还是信任硬盘。没有在网盘上存重要东西的习惯。

  9. 用rclone不就好了,我现在用这个备份数据到onedrive,而且支持的网盘也更多。

    1. 就因为它支持的太多,所以我才不想用。

  10. one drive感觉很鸡肋,手机系统本身就自带云空间,似乎没有必要单独为pc购买云空间,还不如各种云。

    1. 国产手机厂商们带的?根本不敢用。我连它们的账号都不敢注册,除非不注册不让继续用手机。

  11. 现在还在用CentOS7么?可以考虑换其它的了。

    1. 没必要。

  12. 我也不信任国产服务。目前我的博客在虚拟主机,但是有个vps做测试,留个后路。我在vps用了cyberpanel面板,面板里有个google drive备份。不过,我一直在想学这篇文章中提到的备份方法,于是我想知道在almalinux 8里能不能用。我想照着做一下,现在没有足够的时间,等我放假的时候试试。

    1. almalinux跟CentOS一样,是红帽系的。但是almalinux 8应该对应去找CentOS 8的编译教程。前面编译不一样,后面配置的方法应该是一样的。

  13. onedrive的体验一直挺好的,我两台电脑也通过这个同步数据。
    不过同步网站的话,最简单的还是rsync,如果电脑是windows的话,装个cygwin环境即可,可以跑Linux脚本。
    rclone更方便应该,可以映射为电脑磁盘。

你好,新朋友。留言前请先填写昵称邮箱