OpenWrt下使用docker安装icloudpd实现iPhone照片备份私有云盘nas

时间:2024-10-04 08:56:44

文章目录

  • 一、背景与需求
  • 二、部署方法
    • 2.1 我的环境
    • 2.2 准备工作
      • 2.2.1 检查docker环境是否运行正常
      • 2.2.2 查询宿主系统用户id和组id
      • 2.2.3 规划挂载目录
      • 2.2.4 编写启动参数
      • 2.2.5 解决OpenWrt下docker容器桥接模式容器内无法连接公网的问题
      • 2.2.6 解决OpenWrt重启后,docker无法启动的问题
    • 2.3 正式操作
      • 2.3.1 拉取镜像
      • 2.3.2 创建容器
      • 2.3.3 创建.mounted文件
      • 2.3.4 启动容器
      • 2.3.5 初始化容器
      • 2.3.6 拷贝与修改cookies文件名
      • 2.3.7 检查与验证
  • 三、结束语
  • FAQ

一、背景与需求

大概2018年前后折腾过黑群,玩nas做电脑资料的备份,当时也玩的不亦乐乎,但是一年多板子就坏掉了(点背),再加上黑裙的风扇声实在忍不了,2020年初又迷上了J4125工控机软路由方案,因为他小巧,性能强,完全静音无风扇,用到现在2年多了,期间也折腾了不少方案,hyper-v,esxi。最后还是选择了pve,不得不说属实稳,性能也直接拉满。

折腾党,nas还是必须要有的,但我并没有大量的电影资源需要存储,只是用来存储学习资源和电影、家庭全部照片,对内网传输nas的速度并没有极致跑满的要求;能够支持smb、webdav、FTP文件共享,结合ddns,可以随时在任何终端查看和下载,Transmission、Aria2等工具可以将各种所需资源远程直接下载到nas中,这些就足够了。

因为我和媳妇用的都是iPhone,日常给孩子拍照、录视频,实在占用手机存储空间实在太大了,并且只能在自己的手机上看,如果选择iCloud备份和共享,5G根本不够用,扩容的价格实在太高了,我就琢磨有没有办法能够把我和我媳妇的iPhone上照片自动传输到nas上,iPhone上可以删除照片释放空间,实现统一集中存储,通过第三方软件连接到nas,随时远程查看。

有人可能会说了,你这是脱裤子放屁,直接在iphone上安装个FE浏览器、ES浏览器、photosync之类的备份到nas不香吗?对不起,我全部实测过,自动备份都比较扯,苹果杀后台时,什么自动备份也不好使,必须要打开app。听说google photos 和群晖的 photos如果不杀后台时,能够实现无感备份,但google需要魔法,并且备份速度堪忧,群晖nas对我来说太臃肿,不想搭建。百度云盘、阿里云盘的相册备份应用层虽然做的比较好,但同样需要打开app才能自动备份,另外,公有云服务厂商,对视频、图片都是有审核的,虽然是AI审核,充分保密,但把我私人照片去过一遍他们服务器过滤一遍,存在他们的服务器上,时不时的给你丢掉几张,我可不想这样。

查了很多方案,测试了很多软件,都没有达到预期,终于在偶然的一个帖子评论下,看到了icloudpd同步方案,经过测试,效果很令我满意。

几乎完美的方案是:
通过icloudpd这个开源程序实现iPhone照片→iCloud→OpenWrt中的docker(icloudpd)→nas的无感、无缝、无痛、无损、带元数据信息的自动备份。

iCloud 能无感自动后台备份相册到iCloud云端,然后 icloudpd 支持很多环境变量配置参数,自动将源文件从云端同步到 nas !同时 iPhome 上还能保留低像素的缩略图,充分释放iPhone空间。

二、部署方法

网上几乎所有的教程都是在群晖NAS上部署docker的icloudpd容器来实现备份到群晖。所以理论上如果你没有群晖,只要你有docker环境,都是可以部署和使用的,只是不能完全照搬群晖上部署的教程,需要你真正的理解这篇文章中docker使用方法,做一些微调,都是可以的。
下面我讲的方法就是在openwrt的docker环境下部署icloudpd,将数据存储在openwrt挂载的4T机械硬盘上。其中遇到的几个坑,我已经淌过来了,只要按照我说的方法,你一定可以部署成功。

2.1 我的环境

硬件:1台J4125工控机+1根16G内存+1块16G ssd+1块480G ssd+1块4T hdd
虚拟化平台:pve-manager/6.3-2/22f57405
在这里插入图片描述

OpenWrt:使用lean大雕源码,自编译带docker-ce插件的x86固件,固件版本:R22.3.13 内核版本:5.15.31
在这里插入图片描述
OpenWrt-Lean大源码:/coolsnowwolf/lede
icloudpd源码:/boredazfcuk/docker-icloudpd

2.2 准备工作

2.2.1 检查docker环境是否运行正常

使用命令:docker version
正确的回显如下:

root@OpenWrt:~# docker version
Client:
 Version:           20.10.12
 API version:       1.41
 Go version:        go1.17.8
 Git commit:        e91ed57
 Built:             Sun Apr 10 10:43:41 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server:
 Engine:
  Version:          20.10.12
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.8
  Git commit:       459d0df
  Built:            Sat Mar 26 01:36:39 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        52b36a2dd837e8462de8e01458bf02cf9eea47dd
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

2.2.2 查询宿主系统用户id和组id

命令:id 用户名
openwrt下查询出来root用户名和组id如下:

root@OpenWrt:~# id root
uid=0(root) gid=0(root) groups=0(root)
  • 1
  • 2

2.2.3 规划挂载目录

icloudpd程序需要挂载2个目录,1个用于存储配置文件(cookies),1个用储存储下载的照片。
openwrt下,推荐把配置文件存入/root目录下即可,重启不丢失,我的配置文件目录设置为/root/icloudpddjz_config,照片的下载目录我设置到成了通过usb到J4125工控机的4T机械盘上,4T机械盘的挂载目录是/mnt/sdb1,我设置的下载目录就是/mnt/sdb1/back_photos/jiangzhuangdeiphone。
此步骤只是规划挂载路径,你自己心中有数就行了,规划的路径用于后面配置icloudpd容器的启动参数。
为了你更好的理解上面两个挂载路径,贴一张我的lsblk截图:

root@OpenWrt:# lsblk
NAME     MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda        8:0    0 10.2G  0 disk 
├─sda1     8:1    0   16M  0 part /boot
│                                 /boot
├─sda2     8:2    0  160M  0 part /rom
├─sda3     8:3    0    2G  0 part /overlay
├─sda4     8:4    0    8G  0 part /opt
└─sda128 259:0    0  239K  0 part 
sdb        8:16   0  3.6T  0 disk 
└─sdb1     8:17   0  3.6T  0 part /mnt/sdb1

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.2.4 编写启动参数

icloudpd作者在github上已经对每项启动参数做了细致的备注和描述,你可以根据自己的需求,设置所需要的启动参数,作者是国外的大神,如果你看不懂英文,google浏览器自带翻译,你可以直接鼠标右键翻译此网页。
推荐使用notepad++这种纯文本工具编写好,格式不会有误,看着也清楚,我的启动参数如下:

docker create \		#不要改
--name icloudpddjz \		#可以改,只是容器的名字,部署多个容器时,必须要改,不能一致
--hostname icloudpd_boredazfcuk \		#不用改
--network bridge \		#openwrt环境下,用bridge桥接即可
--restart=always \		#不用改
--env user=root \		#openwrt环境下,默认只有root用户,作者建议与宿主系统用户名一致,避免权限问题
--env user_id=0 \		#openwrt环境下,root用户的id是0
--env group=root \		#openwrt环境下,root用户的用户组也是root
--env group_id=0 \		#openwrt环境下,root组id也是0
--env apple_id="xxxxxxx@" \		#填写你的iCloud账号
--env authentication_type=2FA \		#身份验证类型,如果你启用了两步验证,则为2FA,否则为Web
--env folder_structure={:%Y/%m} \		#下载目录的文件夹结构,我设置的是/年/月结构	
--env auto_delete=True \		#扫描iCloud中“最近删除”的照片和视频,并在本地下载目录中也删除对应的照片和视频。(如果您在iCloud中恢复照片,它将再次下载)
--env synchronisation_interval=43200 \		#同步间隔时间,可设置为以下时段:21600(6 小时)、43200(12 小时)、86400(24 小时)、129600(36 小时)、172800(48 小时)和 604800(7 天)。默认为 86400 秒。设置较短的同步周期时要小心,Apple倾向于限制过于频繁地访问其服务器的连接。设置小于 12 小时的值将显示警告,因为 Apple 可能会限制您。我设置的是每12小时同步一次。
--env icloud_china=True \		#如果设置了这个变量,它将使用云上贵州,而不是 作为下载源。推荐设置上这个参数。
--env TZ=CST-8 \		#设置容器时间为东八区时间
--env download_path=/home/root/iCloud \		#容器中的目录,此变量设置上比较好,不设定的话,默认也是这个
--volume /root/icloudpddjz_config:/config \		#配置文件挂载路径。冒号前面是openwrt环境的绝对路径,冒号后面是映射到容器里的路径,你需要修改的就是冒号前面的。
--volume /mnt/sdb1/back_photos/jiangzhuangdeiphone:/home/root/iCloud \		#照片下载路径。冒号前面是openwrt环境的绝对路径,冒号后面是映射到容器里的路径,你需要修改的就是冒号前面的。
boredazfcuk/icloudpd		#不要改
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

2.2.5 解决OpenWrt下docker容器桥接模式容器内无法连接公网的问题

这是我遇到的第1个坑,启动完容器后,程序始终无法运行到登录那步,经过排查后才发现,从容器里是无法ping通百度的,能返回百度的ip,但不通。google后才发现,据说是固件的bug。按照如下步骤修改:
1、Luci -> 网络 -> 防火墙 -> 转发:接受
2、添加如下防火墙规则

iptables -t nat -A POSTROUTING -s 172.31.0.0/16 ! -o docker0 -j MASQUERADE
  • 1

备注:172.17.0.0/16 根据你的docker环境的bridge网络情况设置
3、删除 docker0 并重启

ip link del docker0
reboot
  • 1
  • 2

2.2.6 解决OpenWrt重启后,docker无法启动的问题

这是另一个坑,是我跑起来icloudpd以为大工告成时发现的,但我特意做了一个鲁棒性测试,就是路由器在重启后,程序是否会自动启动并正常运行。结果发现,docker起不来了,报错:unix:///var/run/. Is the docker daemon running?
尝试了很多方法,最终有效的方法是:
a) 修改文件。
使用命令:vi /etc/docker/
增加"registry-mirrors": [""]参数,修改后的文件内容如下:

{
"data-root": "/opt/",
"log-level": "warn",
"registry-mirrors": [""]
}
  • 1
  • 2
  • 3
  • 4
  • 5

b) 修改cgroupfs-mount文件。
使用命令:vi /etc//cgroupfs-mount
注释掉其中的这三行:

#	if mountpoint -q /sys/fs/cgroup; then
#		umount /sys/fs/cgroup/
#	fi

  • 1
  • 2
  • 3
  • 4

c) 修改dockerd文件。
/etc//dockerd这个文件,将里面的START参数从25改为60,修改后的文件内容如下:

#!/bin/sh /etc/

USE_PROCD=1
START=60

start_service() {
        local nofile=$(cat /proc/sys/fs/nr_open)
        local wanmode=$(uci get dockerd.@docker[0].wan_mode)

        if [ $wanmode = "1" ] ;then
        dockerwan=" "
        else
        dockerwan="--iptables=false"
  fi

        procd_open_instance
        procd_set_param stderr 1
        procd_set_param command /usr/bin/dockerd $dockerwan
        procd_set_param limits nofile="${nofile} ${nofile}"
        procd_close_instance

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

2.3 正式操作

2.3.1 拉取镜像

拉取命令:docker pull boredazfcuk/icloudpd:latest
检查是否拉取成功,命令:docker images
正确的回显应包含icloudpd的镜像已被拉取回来,如下:

root@OpenWrt:~# docker images
REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
boredazfcuk/icloudpd     latest    91aba32e5f75   5 weeks ago    249MB
portainer/portainer-ce   latest    ed396c816a75   2 months ago   280MB

  • 1
  • 2
  • 3
  • 4
  • 5

2.3.2 创建容器

使用上面准备好的启动参数,创建容器,创建成功后,默认是不启动的,使用命令docker ps -a查看容器是否已创建成功。
正确的回显如下:

root@OpenWrt:~# docker ps -a
CONTAINER ID   IMAGE                    COMMAND                  CREATED        STATUS                       PORTS                                                           NAMES
1d65bdc40bef   boredazfcuk/icloudpd     "/bin/sh -c /usr/loc…"   23 hours ago   Exited (137) 7 seconds ago                                                                   icloudpddjz
aad39ffd5f90   portainer/portainer-ce   "/portainer"             3 days ago     Up 2 days                    8000/tcp, 9443/tcp, 0.0.0.0:9999->9000/tcp, :::9999->9000/tcp   portainer

  • 1
  • 2
  • 3
  • 4
  • 5

2.3.3 创建.mounted文件

这个文件是作者加入的故障保护机制,只有这个文件存在于下载目录当中,同步才会真正开始,否则不会向下载目录写入任何文件。所以我们需要在启动容器前,在下载目录中,手动创建这个文件。使用如下命令,创建这个文件:

root@OpenWrt:/mnt/sdb1/back_photos/jiangzhuangdeiphone# touch .mounted
root@OpenWrt:/mnt/sdb1/back_photos/jiangzhuangdeiphone# ll
drwxr-x---    3 root     root          4096 Apr 14 13:13 ./
drwxrwxrwx    3 root     root          4096 Apr 11 19:39 ../
-rw-r-----    1 root     root             0 Apr 12 05:29 .mounted
drwxr-x---    3 root     root          4096 Apr 14 13:13 2022/

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.3.4 启动容器

使用命令docker start icloudpddjz启动容器,请注意修改成你自己设置的容器名。
再使用docker ps -a查看容器是否已经成功启动,我们发现icloudpddjz容器的状态已经是up,说明启动成功。

root@OpenWrt:~# docker ps -a
CONTAINER ID   IMAGE                    COMMAND                  CREATED        STATUS                        PORTS                                                           NAMES
1d65bdc40bef   boredazfcuk/icloudpd     "/bin/sh -c /usr/loc…"   23 hours ago   Up About a minute (healthy)                                                                   icloudpddjz
aad39ffd5f90   portainer/portainer-ce   "/portainer"             3 days ago     Up 2 days                     8000/tcp, 9443/tcp, 0.0.0.0:9999->9000/tcp, :::9999->9000/tcp   portainer

  • 1
  • 2
  • 3
  • 4
  • 5

查看日志的命令docker logs -f --tail 100 容器名,也可以通过OpenWrt的Portainer界面的日志按钮去看,比较方便。
如果你看到如下的日志,说明程序已经正常跑起来了,但没有运行初始化程序,也就是没有登录账号的cookies

ERROR    Keyring file /config/python_keyring/keyring_pass.cfg does not exist.
INFO      - Please add the your password to the system keyring using the --Initialise script command line option.
INFO      - Syntax: docker exec -it <container name>  --Initialise
INFO      - Example: docker exec -it icloudpd  --Initialise
INFO     Restarting in 5 minutes...
  • 1
  • 2
  • 3
  • 4
  • 5

恭喜你,距离成功已经走了一大半路程。

2.3.5 初始化容器

此时,你需要运行初始化脚本,在宿主机OpenWrt下运行(请注意修改容器名):
docker exec -it icloudpddjz --Initialise
初始化脚本会引导你一步步的登录到iCloud,从而保存下来Web cookie以及两步验证的cookie,其中Web cookie有效期2个月,两步验证的cookie有效期3个月。

提示输入你的密码,请盲输,就是看不到的,输完直接回车(此时你的iPhone手机会提示是否允许登录,先忽略不管):

2022-04-14 13:07:57 INFO     Skip live photos: False
2022-04-14 13:07:57 INFO     Number of most recently added photos to download: Download All Photos
2022-04-14 13:07:57 INFO     Stop downloading when prexisiting files count is: Download All Photos
2022-04-14 13:07:57 INFO     Live photo size: original
2022-04-14 13:07:57 INFO     Skip videos: False
2022-04-14 13:07:57 INFO     Convert HEIC to JPEG: False
2022-04-14 13:07:57 INFO     JPEG conversion quality: 90
2022-04-14 13:07:57 INFO     Downloading from: 
2022-04-14 13:07:57 WARNING  Downloading from  is untested. Please report issues at /boredazfcuk/docker-icloudpd/issues
2022-04-14 13:08:00 INFO     Script launch parameters: --Initialise
2022-04-14 13:08:00 INFO     Group, root:0, already created
2022-04-14 13:08:00 INFO     User, root:0, already created
2022-04-14 13:08:00 INFO     Set owner, root, on iCloud directory, if required
2022-04-14 13:08:00 INFO     Set group, root, on iCloud directory, if required
2022-04-14 13:08:00 INFO     Correct owner on icloudpd temp directory, if required
2022-04-14 13:08:00 INFO     Correct group on icloudpd temp directory, if required
2022-04-14 13:08:00 INFO     Correct owner on config directory, if required
2022-04-14 13:08:00 INFO     Correct group on config directory, if required
2022-04-14 13:08:00 INFO     Correct owner on keyring directory, if required
2022-04-14 13:08:00 INFO     Correct group on keyring directory, if required
2022-04-14 13:08:00 INFO     Set 750 permissions on iCloud directories, if required
2022-04-14 13:08:00 INFO     Set 640 permissions on iCloud files, if required
2022-04-14 13:08:00 INFO     Configure password
2022-04-14 13:08:00 INFO     Adding password to keyring file: /config/python_keyring/keyring_pass.cfg
Enter iCloud password for xxxxxx@: 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

询问你是否保存密码,必须输入y:

2022-04-14 13:08:00 INFO     Configure password
2022-04-14 13:08:00 INFO     Adding password to keyring file: /config/python_keyring/keyring_pass.cfg
Enter iCloud password for xxxxxx@: 
Save password in keyring?  [y/N]: y

  • 1
  • 2
  • 3
  • 4
  • 5

提示让你选择那种验证方式,输入0,这时手机会收到短信验证码,请忽略不管。(此时点击iPhone屏幕上的允许):

2022-04-14 13:08:00 INFO     Configure password
2022-04-14 13:08:00 INFO     Adding password to keyring file: /config/python_keyring/keyring_pass.cfg
Enter iCloud password for xxxxxxx@: 
Save password in keyring?  [y/N]: y
Two-step authentication required. Your trusted devices are:
  0: SMS to *********61
Which device would you like to use? [0]: 0

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

上一步在你iPhone上点击了允许后,手机会弹出6位验证码,在这里输入弹窗验证码,记住Please enter validation code就是让你输入弹窗验证码,不是手机短信验证码:

2022-04-14 13:08:00 INFO     Adding password to keyring file: /config/python_keyring/keyring_pass.cfg
Enter iCloud password for xxxxxxx@: 
Save password in keyring?  [y/N]: y
Two-step authentication required. Your trusted devices are:
  0: SMS to *********61
Which device would you like to use? [0]: 0
Please enter validation code: 668428

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

程序会再次提醒你,选择那种验证方式,需要继续填写0,回车

Save password in keyring?  [y/N]: y
Two-step authentication required. Your trusted devices are:
  0: SMS to *********61
Which device would you like to use? [0]: 0
Please enter validation code: 668428
Failed to verify verification code
2022-04-14 13:10:22 INFO     Correct owner on config directory, if required
2022-04-14 13:10:22 INFO     Correct group on config directory, if required
2022-04-14 13:10:22 INFO     Generate 2FA cookie using password stored in keyring file
  0: SMS to *********61
  1: Enter two-factor authentication code
Please choose an option: [0]: 0

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这时,你的手机会再次收到1条短信验证码,请将短信验证码输入:

2022-04-14 13:10:22 INFO     Correct group on config directory, if required
2022-04-14 13:10:22 INFO     Generate 2FA cookie using password stored in keyring file
  0: SMS to *********61
  1: Enter two-factor authentication code
Please choose an option: [0]: 0
Please enter two-factor authentication code: 934157
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

如果你错误的将弹窗验证码输入,这将会无法成功创建cookies文件,就会出现下面的报错,如果输错,请重新运行初始化脚本:

ERROR    2FA information missing from cookie. Authentication has failed
ERROR     - Was the correct password entered?
ERROR     - Was the 2FA code mistyped?
ERROR     - Are you based in China? You may need to set the icloud_china variable
  • 1
  • 2
  • 3
  • 4

看到这个提示,就是成功获取到cookies了:

Please enter two-factor authentication code: 934157
2022-04-14 13:11:20 INFO     Two factor authentication cookie generated. Sync should now be successful

  • 1
  • 2
  • 3

2.3.6 拷贝与修改cookies文件名

其他人的教程是没有这个步骤的,其他人也没有在OpenWrt下运行docker版icloudpd的,这也是我淌过来的坑。
我不确定这是不是程序的bug,或者可能也是我环境的问题,总之,如果你在执行完上一步,如果看到日志和我下面的一样,仍然提示Keyring file /config/python_keyring/keyring_pass.cfg does not exist,仍然要求你运行初始化脚本,那么你大概率遇到的问题和我一样。我的日志报错如下:

2022-04-14 13:07:18 WARNING  Downloading from  is untested. Please report issues at /boredazfcuk/docker-icloudpd/issues
2022-04-14 13:07:20 INFO     Creating directory: /config/python_keyring/
2022-04-14 13:07:20 INFO     Group, root:0, already created
2022-04-14 13:07:20 INFO     User, root:0, already created
2022-04-14 13:07:20 INFO     Set owner, root, on iCloud directory, if required
2022-04-14 13:07:20 INFO     Set group, root, on iCloud directory, if required
2022-04-14 13:07:20 INFO     Correct owner on icloudpd temp directory, if required
2022-04-14 13:07:20 INFO     Correct group on icloudpd temp directory, if required
2022-04-14 13:07:20 INFO     Correct owner on config directory, if required
2022-04-14 13:07:20 INFO     Correct group on config directory, if required
2022-04-14 13:07:20 INFO     Correct owner on keyring directory, if required
2022-04-14 13:07:20 INFO     Correct group on keyring directory, if required
2022-04-14 13:07:20 INFO     Set 750 permissions on iCloud directories, if required
2022-04-14 13:07:20 INFO     Set 640 permissions on iCloud files, if required
2022-04-14 13:07:20 INFO     Configure password
2022-04-14 13:07:20 ERROR    Keyring file /config/python_keyring/keyring_pass.cfg does not exist
2022-04-14 13:07:20 INFO      - Please add the your password to the system keyring using the --Initialise script command line option
2022-04-14 13:07:20 INFO      - Syntax: docker exec -it <container name>  --Initialise
2022-04-14 13:07:20 INFO      - Example: docker exec -it icloudpd  --Initialise
2022-04-14 13:07:20 INFO     Waiting for keyring file to be created...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

解决办法:
需要手动把上一步获取的cookies拷贝到python_keyring目录下一份,并修改文件名为keyring_pass.cfg,并赋予文件777权限,cookie在你启动从参数中设置的配置文件挂载目录下,我的在/root/icloudpddjz_config目录下。
操作命令如下(请注意修改你的cookies文件名):

root@OpenWrt:~/icloudpddjz_config# ls
DAYS_REMAINING        xxxxxicloudcom  python_keyring
root@OpenWrt:~/icloudpddjz_config# cp -rp xxxxxicloudcom python_keyring/
root@OpenWrt:~/icloudpddjz_config# cd python_keyring/
root@OpenWrt:~/icloudpddjz_config/python_keyring# mv xxxxxicloudcom keyring_pass.cfg
root@OpenWrt:~/icloudpddjz_config/python_keyring# chmod 777 keyring_pass.cfg
root@OpenWrt:~/icloudpddjz_config/python_keyring# ll
drwxr-xr-x    2 root     root          4096 Apr 14 13:13 ./
drwxrwxrwx    3 root     root          4096 Apr 14 13:13 ../
-rwxrwxrwx    1 root     root           838 Apr 14 13:11 keyring_pass.cfg*

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.3.7 检查与验证

当你手动创建好这个keyring_pass.cfg文件的时候,你的程序日志中,就会正常的运行下去,并且开始同步照片了,正常的日志如下:

2022-04-14 13:13:30 INFO     Keyring file exists, continuing
2022-04-14 13:13:30 INFO     Check download directory mounted correctly
2022-04-14 13:13:30 INFO     Failsafe file /home/root/iCloud/.mounted exists, continuing
2022-04-14 13:13:30 INFO     Set owner, root, on iCloud directory, if required
2022-04-14 13:13:30 INFO     Set group, root, on iCloud directory, if required
2022-04-14 13:13:30 INFO     Correct owner on icloudpd temp directory, if required
2022-04-14 13:13:30 INFO     Correct group on icloudpd temp directory, if required
2022-04-14 13:13:30 INFO     Correct owner on config directory, if required
2022-04-14 13:13:30 INFO     Correct group on config directory, if required
2022-04-14 13:13:30 INFO     Correct owner on keyring directory, if required
2022-04-14 13:13:30 INFO     Correct group on keyring directory, if required
2022-04-14 13:13:30 INFO     Set 750 permissions on iCloud directories, if required
2022-04-14 13:13:30 INFO     Set 640 permissions on iCloud files, if required
2022-04-14 13:13:30 INFO     Sync user root
2022-04-14 13:13:30 INFO     Synchronisation starting at 13:13:30
2022-04-14 13:13:30 INFO     Check 2FA Cookie
2022-04-14 13:13:30 INFO     Cookie exists, check expiry date
2022-04-14 13:13:30 INFO     Valid two factor authentication cookie found. Days until expiration: 89
2022-04-14 13:13:30 INFO     Check download directory mounted correctly
2022-04-14 13:13:30 INFO     Failsafe file /home/root/iCloud/.mounted exists, continuing
2022-04-14 13:13:30 INFO     Check for new files using password stored in keyring file
2022-04-14 13:13:30 INFO     Generating list of files in iCloud. This may take a long time if you have a large photo collection. Please be patient. Nothing is being downloaded at this time
/home/root/iCloud/2022/04/IMG_4027.MOV
/home/root/iCloud/2022/04/IMG_4025.MOV
2022-04-14 13:13:41 INFO     Check successful
2022-04-14 13:13:41 INFO     New files detected: 2
2022-04-14 13:13:41 INFO     Starting download of new files for user: root
2022-04-14 13:13:41 INFO     Downloading new files using password stored in keyring file...
2022-04-14 13:13:41 INFO     iCloudPD launch command: /usr/bin/icloudpd --directory /home/root/iCloud --cookie-directory /config --folder-structure {:%Y/%m} --username xxxxxxx@ --auto-delete  2>/tmp/icloudpd/icloudpd_download_error
2022-04-14 13:13:42 DEBUG    Authenticating...
2022-04-14 13:13:51 DEBUG    Looking up all photos and videos from album All Photos...
2022-04-14 13:13:52 INFO     Downloading 2 original photos and videos to /home/root/iCloud ...
2022-04-14 13:13:52 INFO     Downloading /home/root/iCloud/2022/04/IMG_4027.MOV
2022-04-14 13:14:24 INFO     Downloading /home/root/iCloud/2022/04/IMG_4025.MOV
2022-04-14 13:15:23 INFO     All photos have been downloaded!
2022-04-14 13:15:23 INFO     Deleting any files found in 'Recently Deleted'...
2022-04-14 13:15:24 INFO     Synchronisation complete for root
2022-04-14 13:15:24 INFO     Web cookie expires: 2022-06-13 @ 05:10:25
2022-04-14 13:15:24 INFO     Two factor authentication cookie expires: 2022-07-13 @ 05:11:11
2022-04-14 13:15:24 INFO     Days remaining until expiration: 89
2022-04-14 13:15:24 INFO     iCloud login counter = 2
2022-04-14 13:15:24 INFO     Synchronisation ended at 13:15:24
2022-04-14 13:15:24 INFO     Total time taken: 00:01:54
2022-04-14 13:15:24 INFO     Next synchronisation at 01:13:30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

检查一下下载目录,确实已经同步成功了:

root@OpenWrt:~# ls /mnt/sdb1/back_photos/jiangzhuangdeiphone/2022/04/
IMG_4025.MOV  IMG_4027.MOV

  • 1
  • 2
  • 3

三、结束语

我设置的同步间隔是12小时,如果你想手动触发同步,只需要重启容器即可,命令是docker restart <容器名>

OK,大工告成,虽然过程比较波折,但最终还是成功了,实测直接在OpenWrt下reboot系统,重启后icloudpd也是可以正常运行的。

后面有时间的时候,再搞一下PhotoPrism来规整nas上的照片。
enjoying~

FAQ

1、iCloud 空间只有 5G 怎么办?
答:满了后,可以手动删除云端 iCloud 相册(最近删除里也要删除,否则到了同步时间,会自动最近删除列表中读取到也同步删除),这个操作并不会删除 nas 上的已经备份的数据;如果不想花一分钱,只使用5G 的免费空间,无非就是云端删除频繁一些,基本能满足需求;如果是重度用户,开个每个月 6 月 50G 的 iCloud 服务;
2、家人的照片或其他人的照片怎么管理?
答:再开一个容器,登录其他iCloud账号。
3、我没有OpenWrt软路由怎么办?
答:仔细看教程,只要有docker环境和足够大的存储空间,都是可以的。
4、icloudpd的方案有哪些缺点?
答:iCloudpd 每两个月还是三个月需要重新授权访问;不过可以配置提醒服务(我的教程里没有设置,感兴趣的可以自己去作者git上看设置参数,容器创建时加入参数即可);