苹果相册大搬家:用 docker-icloudpd 把 iCloud 照片悄悄存进自家硬盘
【免费下载链接】docker-icloudpdAn Alpine Linux container for the iCloud Photos Downloader command line utility项目地址: https://gitcode.com/GitHub_Trending/do/docker-icloudpd
先讲个我自己的血泪故事
去年年底我换了台新手机,旧 iPhone 里攒了六年的照片和视频大概有 40GB。导出的那天晚上,我坐在电脑前,盯着「正在同步」的进度条等了整整三个小时,中途还断了一次,又从头再来。
那一刻我就在想:这些照片明明是我自己的,凭什么取回来要这么费劲?
后来我把照片放进群晖 NAS,日子算是安定了。可我老婆的手机、我爸妈的手机,还各自躺在各自的 iCloud 里。让二老学会「定期导出照片」,比让他们学会用 iPad 还难。
直到我遇到 docker-icloudpd,事情才真正开始变简单。
这个东西到底是什么?一句话说清
docker-icloudpd 是一个跑在 Alpine Linux 上的轻量级 Docker 容器,里面装好了 iCloud Photos Downloader 这个命令行工具。你只要把 Apple ID 给它,它就会按照你定的节奏,自动把 iCloud 里的照片和视频拉到你的服务器或 NAS 上,全程无人值守。
说白了:它像是一个只认你家的 iCloud 专属搬运工,替你盯着云端,来一张搬一张。
它还顺手解决了几个很实际的麻烦——苹果的 HEIC 格式它可以自动转成 JPG;登录凭证它帮你存在系统钥匙环里;相册、共享图库、实况照片都能按需下载。甚至,它连「你家有几个人用 iPhone」这件事都考虑到了,一台机器可以同时伺候多个账号。
跟「手动导出」和「网盘中转」比,它到底强在哪
很多人听到「iCloud 备份」第一反应是:我直接用浏览器下载不就行了?或者干脆把照片转发到百度网盘。我们不妨把这几种路数摆在一起看看:
| 方案 | 要不要人工盯着 | 能否自动增量 | HEIC 兼容 | 数据主权 | 多账号支持 |
|---|---|---|---|---|---|
| 浏览器手动下载 | 要,且断点续传看运气 | 否 | 得自己转格式 | 在你自己手里 | 无 |
| 网盘中转 | 要,还得忍受压缩 | 否 | 会被二次压缩 | 在别人手里 | 无 |
| 手机端「隔空投送」 | 要,几十张就累 | 否 | 部分设备打不开 | 在你自己手里 | 无 |
| docker-icloudpd 定时同步 | 不用 | 是,按小时/天自动拉取 | 自动转 JPG | 完全在自己硬盘里 | 支持,一人一套配置 |
这么一对比就清楚了:这个容器最大的价值不是「能下载」,而是「能自动、安静、持续地下载」,把一件本来要手工反复做的事情,变成了后台的固定日程。
动手前先备好这几样东西
别紧张,门槛真的不高,你需要准备的只有四样:
- 一台装了 Docker 的机器,Linux 服务器、群晖、威联通甚至树莓派都行
- 一个开启了双重认证的 Apple ID
- 至少 1GB 的可用磁盘空间(照片多的建议按你相册体量准备)
- 一个愿意花二十分钟的晚上
有一个前提必须先说清楚:如果你的 iCloud 开启了「高级数据保护」(Advanced Data Protection),这个容器是无法工作的,因为它要求照片在苹果服务器上可被网页访问。动手之前,先去设置里把这个开关关掉。
从零到一:半小时跑通第一张照片
第一步,把「家」先搭起来
我们先在服务器上给照片建一个专门的落脚点。注意,这个目录必须手动放一个名为.mounted的占位文件进去:
mkdir -p /home/你的用户名/iCloud touch /home/你的用户名/iCloud/.mounted别小看这个动作。容器有个「保险丝」设计:它每次干活前都会检查这个文件在不在,如果不在就拒绝下载。这是为了防止你的存储卷没挂好时,它把照片一股脑写进系统盘,把根分区撑爆。所以这个文件是硬性要求,少了它,同步永远不启动。
第二步,用 compose 把容器拉起来
我建议直接复用项目自带的编排模板,它比我见过的很多示例都贴心——一上来就演示了「两个用户怎么共存」:
networks: icloudpd: name: icloudpd driver: bridge volumes: icloudpd_user1_config: name: icloudpd_user1_config icloudpd_user2_config: name: icloudpd_user2_config services: icloudpd_user1: hostname: icloudpd_user1 networks: icloudpd: aliases: - icloudpd_user1 environment: - TZ=Asia/Shanghai - user=user1 image: boredazfcuk/icloudpd healthcheck: test: /usr/local/bin/healthcheck.sh start_period: 30s restart: always volumes: - icloudpd_user1_config:/config - ./iCloud/:/home/user1/iCloud/如果你只有一个人用,把 user2 那一段删掉就行。这里有两个细节值得留意:
/config必须用具名卷,因为登录凭证和 cookie 都存在这里。你要是图省事随便映射了个普通目录,容器一重建就得重新登录。TZ时区建议直接设成Asia/Shanghai,它会影响到照片文件的时间戳计算。
在项目目录下执行:
docker compose up -d第三步,初始化登录,这一步最像「仪式」
容器第一次跑起来后,不会立刻干活,它要等你「授个权」。执行:
docker exec -it icloudpd_user1 sync-icloud.sh --Initialise接下来就是跟着提示走:输入 Apple ID 和密码,选择验证方式,输入手机上收到的六位验证码。搞定之后,密码会存进容器内的系统钥匙环,同时生成一个 MFA 登录 cookie。整个流程走完,你会看到一条Multifactor authentication cookie generated的日志,到这儿,搬运工就正式上岗了。
第四步,认识一下那张「配置总表」
首次启动时,容器会在/config/icloudpd.conf里生成一份默认配置。以后你改配置,都是在改这个文件,容器会自己热加载,大部分情况不用重启。几个最常用的开关我先给你划重点:
| 配置项 | 干什么用的 | 我的建议 |
|---|---|---|
apple_id | 登录哪个账号 | 必填,相当于身份证 |
download_interval | 多久同步一次 | 默认 86400(24小时)就挺好,别小于 12 小时 |
folder_structure | 照片落盘的目录结构 | 默认{:%Y/%m/%d},按年月日归档,强烈建议保持 |
convert_heic_to_jpeg | HEIC 自动转 JPG | 设成true,原文件会保留,额外产出一份 JPG |
jpeg_quality | JPG 压缩质量 | 默认 90,够用 |
photo_size | 下载原图还是缩略图 | 默认original,别动 |
skip_check | 跳过文件清单检查 | 照片超过几千张时设成true,能避免大库卡死 |
icloud_china | 国区账号开关 | 国区用户记得设成true,走 icloud.com.cn |
如果你正好是国区用户,记住一句话:icloud_china和auth_china这两个开关要么都不开,要么一起开,只开一个,容器会自己嘟囔「你是不是搞错了」。
认证书过期了?别慌,有两种姿势都能救
苹果为了「安全」,把 MFA cookie 的有效期从 90 天一路砍到了 30 天。也就是说,每隔一个月左右,容器就会开始提示你该重新认证了。
在家的时候最简单,直接进容器跑一句:
docker exec -it icloudpd_user1 reauth.sh手机会弹出验证码,输进去就完事,比重新初始化快得多。
人在外面也不用干着急——如果你配了 Telegram 通知,直接在聊天窗口里给机器人发一句「你的用户名 auth」,容器会在几分钟内回复你,问你要验证码。你再把「用户名 + 空格 + 六位数字」发回去,它自己就完成了重新认证,全程不用碰命令行。对了,这条功能是作者特意做的,他还在文档里苦口婆心地提醒大家:验证码别随便给人,但你自己信得过自己的容器,那就随意。
官方文档没细说的几个进阶玩法
玩法一:给 Telegram 发个名字,立刻触发同步
默认 24 小时同步一次,听起来有点慢?其实你根本不用等。只要配好了 Telegram,往机器人那儿发一条消息,内容是你在配置里设的user名字,容器收到后会立刻开始一轮同步。周末出去玩拍了一堆照片,回家路上发个消息,到家就能在 NAS 里看到了。
玩法二:让 Nextcloud 替你二次备份
这个容器不止会下载,它还能把下载好的照片继续上传到你的 Nextcloud。打开nextcloud_upload=true,填好地址、用户名、密码和目标目录,之后每一张下载的照片都会自动同步进 Nextcloud。删除了的也会跟着删。相当于给照片上了双保险,一套数据两份存放。
玩法三:用 cron 代替常驻循环
如果你不喜欢容器一直挂着轮询,可以把single_pass=true设上,容器跑完一轮就退出。然后你在宿主机上用 cron 定时拉起它,比如每天凌晨三点跑一次。注意,这时候容器的restart策略必须设成no,不然它会「跑完立刻重启」,跟苹果服务器较劲。
玩法四:给老照片补一张 JPG
早期版本的 HEIC 转换工具有个旋转方向的 bug,导致转出来的 JPG 是歪的。如果你手上有那批历史文件,不用重新下载,直接执行:
docker exec -it icloudpd_user1 sync-icloud.sh --Force-Convert-All-HEICs它会用现在内置的 ImageMagick 把旧文件重新转一遍,把方向纠正过来。类似的命令还有--Convert-All-HEICs(只补缺的)、--Remove-All-JPGs(清掉所有带对应 HEIC 的 JPG)、--List-Albums(看看有哪些相册可下)等,都在sync-icloud.sh里挂着,用--help就能看到。
新手最容易踩的 3 个坑
坑一:忘了建.mounted文件,容器「装死」
这是问得最多的一个。容器启动了、日志也正常,就是不下照片。九成原因都是那个.mounted占位文件没创建。记住:这个文件必须手动建,没有捷径。
坑二:同步间隔设太短,被苹果「关小黑屋」
有人觉得同步越勤越好,直接设成 1 小时。苹果那边会判定你访问太频繁,然后返回ACCESS_DENIED,提示你过几个小时再试。官方建议是 24 小时一次,最多别低于 12 小时。真被限流了,把间隔调回去,容器关掉六到十二小时,等它消气。
坑三:账号开了「高级数据保护」
这个最隐蔽。如果你在 iOS 16.2 之后开了 Advanced Data Protection,照片在苹果服务器上是被端到端加密的,网页端拿不到,容器自然也就下载不了。症状表现为:一切配置正确,但始终同步失败。解决办法就是在 Apple ID 设置里关掉这个功能。
另外还有两个「小提醒」级别的坑:一是树莓派用户如果发现容器行为异常,创建时加上--privileged参数往往能解决;二是如果你要同时下载多个相册,苹果可能会要求你重新走一遍双重认证,这不是 bug,是苹果的机制。
写在最后:让照片真正「属于你」
做完这一切之后,你会发现一个很安心的变化:每天深夜,容器会安静地醒来,把这一天新增的照片从云端搬回你家的硬盘,然后继续睡去。你不用再惦记「要不要备份」,因为备份这件事,已经变成了一条不会忘记的流水线。
照片这东西,真正值钱的从来不是像素,而是它记录的那些日子。与其每年为云存储续费,或者在某次换机时手忙脚乱地导出,不如花上二十分钟,让它们从此踏踏实实地躺进你自己的硬盘里。
如果你也想自己动手编译这个镜像,可以拉取仓库源码研究:
git clone https://gitcode.com/GitHub_Trending/do/docker-icloudpd今晚,就让你家那台闲置的服务器,开始替你守护全家人的回忆吧。
【免费下载链接】docker-icloudpdAn Alpine Linux container for the iCloud Photos Downloader command line utility项目地址: https://gitcode.com/GitHub_Trending/do/docker-icloudpd
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考