群晖实时同步照片到google photos

由于目前linux系统同步到google photos的方案没有官方的API,唯一可用的gphotos-uploader-cli却不能通过“高质量”无限空间的方式上传,那可怜的15G空间肯定是不够用的,所以目前群晖同步到google photos还是通过VMM虚拟windows来实现。

虽然windows的google photos客户端能够通过网络驱动器smb读取群晖上的照片,但是这种方式文件量一大,新文件经常几天都不能上传成功,于是我想到一个折中的方案:
在win里面划分一个临时本地空间,20G,群晖通过inotify实时同步新照片到这个临时本地空间,google photos的客户端只监控这个临时本地空间,这样速度几乎是同时的。
临时本地空间通过win的定时任务删除30天之前的文件即可。

一、准备工作

  1. 新建VMM虚机,安装google photos客户端,新建一个临时空间共享目录googlephoto
  2. 群晖挂载临时空间共享目录googlephoto

二、群晖运行inotify监控

群晖自带inotify,但是没有inotify-tools,我用docker来解决

docker run --restart=always --privileged --name googlephoto-inotify -itd \
-v /etc/localtime:/etc/localtime:ro \
-v /volume1/docker/gphotos-inotify/run.sh:/run.sh \
-v /volume1/homes/user1/Drive/Moments:/user1 \
-v /volume1/homes/user2/Drive/Moments:/user2 \
-v /volume1/SSD/googlephoto:/googlephoto \
pstauffer/inotify /bin/sh /run.sh
这里要注意的是--privileged这个参数,不加这个参数运行echo 99999999 > /proc/sys/fs/inotify/max_user_watches会提示Read-only file system`

run.sh脚本内容:

#!/bin/bash
echo 99999999 > /proc/sys/fs/inotify/max_user_watches
inotifywait -mrq --excludei '.*/@eaDir.*|.*screenshot.*' --format '%w%f' -e create,moved_to /user1 /user2 | while read line
do
if [ -f "$line" ]
then
    echo $(date +"%Y-%m-%d %T"):new file "$line"
    cp "$line" /googlephoto && echo copy success
fi
done
脚本内容大概翻译一下就是首先修改监控文件数,默认是8192,肯定是不够的。然后监控/user1/user22个目录,排除@eaDir目录和包含screenshot的图片,监控事件有createmoved_to(为什么有moved_to呢?因为如果是通过群晖DSM管理页面上传的话是moved_to,moments的手机端和网页都是create)。监测到有新文件就复制到/googlephoto目录。

三、 虚机win同步

虚机win里面建立一个删除临时空间的批处理:

forfiles /p "D:\googlephoto" /d -30 /s /m *.* /c "cmd /c del /f @path"

在计划任务里面设置每天运行就行了,它会自动删除创建时间大于30天的任何文件和目录(包含子目录)。

评论已关闭