分享到微信

当前解读页的微信分享二维码

用微信扫一扫打开,点击右上角「···」分享给朋友或朋友圈。

手机上可截屏后,在微信扫一扫中从相册识别二维码。

ashayas/icloud-s3

数据

一个恶搞的 S3 兼容对象存储,把文件字节藏进 iCloud 共享相簿里的 PNG 照片。

197
13
Rust
今天创建

icloud-s3 是一个 Rust 服务端,实现了 S3 XML REST 协议中足够多的部分,使 AWS CLI、boto3、rclone、s5cmd 这类工具能够读写 bucket 和对象。它不把字节存进常规对象存储,而是把每个对象编码进 iCloud 共享相簿中无损 PNG 图片的 RGB 像素里,利用 Apple「共享相簿媒体不计入 iCloud 存储」的政策。作者明确标注这是玩笑项目,与 Apple 和 AWS 无关,不适合生产环境或敏感数据。

映射方式

一个 S3 bucket 对应一个共享相簿,一个对象对应一张不超过 2048×2048 px 的 24 位 RGB PNG,大对象则拆成若干编号帧,按 chunk_index 重新拼装。元数据和 64 像素高的 HUD 横幅会被烧进每张载体图顶部,方便在 Photos.app 里认出文件。完整性方面,每帧对 RGB 像素流计算 CRC32,整个对象再算 SHA-256 和 MD5;冷启动时,服务端通过扫描并解码 PNG 文件重建状态。

几种运行方式

  • 纯本地:icloud-s3 serve --dry-run 使用内存相簿,不需要连接 iCloud;配合 --album-dir 则把每个 bucket 持久化成磁盘上的 PNG 帧目录。
  • 导入 Photos.app:--sync-photos-app 会额外通过 AppleScript 把每个写入的帧导入 macOS Photos.app,因此这条路径需要 macOS。
  • 不跑服务端:icloud-s3 encode 和 decode 可以直接在命令行把单个文件与载体 PNG 相互转换。
  • 查看:任意对象都能用 ?format=png 取回原始载体 PNG,icloud-s3 bench 会在终端显示实时基准测试。

支持的操作用包括 bucket 的创建/删除/head/列举,对象的 put/get/head/删除和批量删除,以及带 prefix、delimiter、max-keys 的 list v2。作者的 10 项评测报告全部通过,覆盖零字节对象、元数据保留、乱序帧重组、单比特损坏检测、覆盖压缩和冷启动重建,其中包含一次未修改的 aws s3 往返测试。

需要注意的限制

Apple 公布的共享相簿上限是:每位所有者最多 200 个相簿、每个相簿 5,000 个项目、每小时 1,000 次上传、每天 10,000 次,长边不超过 2048 像素。作者给出的约 1,000,000 个对象、约 12 TB 的容量估算依赖这些上限,并且要求每张载体始终保持无损 PNG。更重要的是,作者警告:如果 Apple 的服务端流水线在下游设备把素材转码成有损 JPEG/HEIC,像素位会变化,解码会以 ChecksumMismatch 直接失败,因此只有本地保持位精确的 PNG 才是安全情况。吞吐和延迟数字是 Apple Silicon 上本地 album 目录的测量;Cloudflare R2 的对比是拿本地文件与远程 bucket 比较,所谓加速主要反映本地与网络访问的差异,并不是持久性承诺。提供的仓库信息里没有声明许可证,因此在再分发或基于代码开发前应先确认授权条款。

HotRepo 点评

在 2026-10-31 的 Rust 新项目榜上,该项目共 113 颗星(第 7 名);这只是单次快照,不是单日增长数据,样本也不足以说明任何趋势。考虑到作者的恶搞声明,更应把它当作展示 S3 协议和像素编码技巧的演示或教学工具,而不是存储基础设施。

项目源码与说明

本文由 AI 根据项目 README 生成,更新于 2026年10月31日,以项目官方文档为准。