使用Box云盘(Seafile API)实现实验室数据单向备份

Posted by LadderOperator on Saturday, May 21, 2022

实验室中,仪器采集的数据需要定期备份。

传统的备份方式,以我们实验室来说,曾经用过移动硬盘冷备份,也用过DVD光盘刻录。但是这两种方案都不能算非常简便——移动硬盘速度尚可,但是硬盘本身怕磕,需要小心保存;刻录光盘虽然稳妥,却是慢的离谱。

网络备份的设想

如果考虑到网络备份,有的网盘是众所周知的慢,有的则是文件传输有限制。最重要的是,大部分设备都没有办法稳定连接校外网,能连接校园网已经算是比较好的了。也不是没动过实验室自己组个服务器,但是维护又是新的麻烦。

因此,最近想试试把数据自动备份到box.nju.edu.cn上去。有人可能会奇怪:那简单了啊,云盘有客户端,你随便下个,登个谁账号不就行了吗?

其实你细细去想,这样的用法难免会涉及到各种问题:

  • 让学生登录这个账号?学生账号不够大,本来就少;同时毕业时如果记不得就麻烦了。
  • 让老师登录这个账号似乎更加合理,毕竟实验室的教职工是长期在校,500G空间也有一定的余力。但是,无论谁登录都会遇到一个问题:这意味着你的帐号可能会在这台电脑上被任何使用者翻阅。

除了上面两个问题之外,Seafile挂载盘的目录不一定和设备采集数据的存储路径相兼容,需要再复制挪动一次;客户端如果遇到采集时频繁变动的数据文件,也很麻烦,最好有个手动的方法。

最稳妥的办法其实是使用云盘的“上传链接”功能,但定期需要获取链接,或者一直使用同个链接。

但假如,你想把这件事做成一个自动化的任务:既单向上传实验数据,又可以设置定时定期让电脑自己上传,那你的选择可能只有一个了——使用Seafile的API打包一个自己的应用。

获取资料库的Token

在 Seafile 中,Token(令牌)主要有两种:

  • Web API Auth Token:在账户设置中查看,拥有账户认证的权限

Web API Auth Token

  • 资料库的API Token:在资料库的更多选项内,只拥有这个资料库对应权限的API

资料库的API Token

在API文档中,最直观的体现是前者可以使用的API有这么多:

而在资料库单独的API中,仅能对此资料库有有限的操作(这意味着你看不见其他的资料库),还可以设置读写权限。

拿到这个 API 后,照着文档葫芦画瓢就可以攒自己的脚本了。

照着API写代码

因为Seafile提供的是Web API,所以文档内你看到的示例几乎都是curl工具的命令行:

curl -H "Authorization: Token 12c8afe4ce2aaa632a4110a2e6bdf1ad68d04e5a" -H 'Accept: application/json; indent=4' 'https://cloud.seafile.com/api/v2.1/repos/b8e06f24-edfe-44a3-b63b-ad9ecc59e1eb/repo-api-tokens/'

如果对Token的使用不是很熟练,个人建议先按照示例用curl测试一下能不能用。如果直接在Shell写代码可能有点头秃,那么我们如何能够用我们更熟练的Python或其它语言来解决此问题?

这边当然还是直接选Python对我来说更顺手,毕竟有个requests库在这儿,调调包就行了。

代码内容不展开,这里献丑丢个我自己用的小脚本:

https://git.nju.edu.cn/ladderoperator/seafile-data-uploader

在编写完毕之后,你还可以用pyinstaller之类的打个包。为了减少体积,建议使用conda(我直接上了miniconda,各类模块按需装配)先建一个干净的环境进行开发。

待续……?

在尝试做这个之前,其实我做了不少检索,但是没有发现很好用的实验室数据管理软件,全流程包办的信息化系统是有的。这类软件被称为 LIMS(Laboratory Information Management System)。开源的方案也有,只是作为简单的实验室数据管理备份感觉确实有些复杂了。或许我该换个思路,找找有没有“定期分文件夹压缩、归档、上传”的应用?

目前这个脚本搓完,基本能用,不能算满意,或许我该加个:

  • 友善的图形操作界面(交给PyQt?)
  • 本地Token再上一层密码保护
  • 本地的实验数据文件夹压缩、归档、上传管理

留个坑吧,毕竟不是计软大佬,没有时间去做这种项目。