/R2-Gallery

个人独立相册,其中图片储存采用 Cloudflare R2 实现。

Primary LanguagePythonMIT LicenseMIT

R2-Gallery

个人独立相册,其中图片储存采用 Cloudflare R2 实现。

注意! 本项目尚未完成,施工中。

关于 Cloudflare R2

Cloudflare R2 是一种云储存服务, 本软件用它来储存图片.

  • 官方网址 https://developers.cloudflare.com/r2/platform/pricing/
  • 方便编程, 注册与设置也简单, 正因为如此, 我才能作出这个软件
  • 储存在 R2 里的文件, 可以公开访问 (因此才能用来做相册)
  • 有一定免费额度, 最重要的的是, 流量免费
  • 内含 10GB 免费容量, 流量免费, 注册时需要信用卡或 PayPal
    (注意: 上传下载等的操作次数超过上限也会产生费用, 详情以 Cloudflare 官方说明为准).

由于本软件采用了 Cloudflare R2, 因此用户不得不麻烦一点自己去注册账号, 以及填写配置信息, 下面我会详细说明如何操作 (详见后文 "准备工作" 部分).

大架构

  • 使用本软件可创建一个或多个图库 (Gallery)
  • 每个图库可包含一个或多个相册 (Album)
  • 每个相册可包含一张或多张图片 (Picture)
  • 每个图库/相册/图片都有对应的 toml 文件, 包含了它们的信息 (例如标题/简介)
  • 使用 r2g render 命令会根据上述 toml 文件生成网页

三种输出

使用 r2g render 命令生成网页时, 有 3 种不同的输出:

  • 本地预览 (文件夹名: output_local):
    浏览该网页不会产生流量, 方便在本地预览效果, 减少云端流量消费.
  • 正常网站 (文件夹名: output_web):
    即使在本地浏览该网页也会产生流量, 通常将这个文件夹内的网页发布到网上 (例如 GitHub Pages).
  • Cloudflare R2:
    直接将网页上传到云端, 通过在 R2 设置的网址即可访问相册.

具体而言, 当执行 r2g render -allr2g render NAME 等命令时, 都会同时输出 本地预览正常网站.

为了节省流量以及避免网络通讯耗费时间, 只有执行 r2g render --to-cloud 命令时才会将网页上传到 Cloudflare R2.

建议本地预览确认网页内容符合自己的期望后, 才执行 r2g render --to-cloud.

正常网站 (文件夹 output_web) 相当于一个静态网站, 你可以采用 GitHub Pages 之类的服务将这个文件夹的内容发布到网上.

Picture

  • 文件名只能使用 0-9, a-z, A-Z, _(下划线), -(短横线), .(点)
  • 文件名包括后缀名, 不包括目录
  • 文件名请尽量不要太长
  • toml 里的文件名不可手动更改
  • 自动获取简单描述的第一行作为图片的标题
  • 简单描述采用纯文本格式, 有字数限制, 建议不要写太长
  • 如果有较长的描述, 可以写在 story 里, 采用 Markdown 格式
  • checksum, 用来判断 notes/story 有无变更

Album

  • 使用命令 r2g album -new NAME 新建相册
  • 每个相册一个文件夹
  • 上述命令里的 NAME 是相册的文件夹名称
    • 只能使用 0-9, a-z, A-Z, _(下划线), -(短横线), .(点)
    • 并且应尽量短
  • 在相册文件夹内有一个 album.toml 文件, 以及 thumbs 和 metadata 文件夹
  • 可在 album.toml 文件里填写相册标题, 相册标题可以使用任何字符
  • 相册简介采用纯文本格式, 第一行是相册标题
  • 如果有较长的描述, 可以写在 story 里, 采用 Markdown 格式
  • ctime, 相册创建时间
  • utime, 相册更新时间 (比如添加图片, 就会更新该时间)
  • r2_html, 相册网页的 R2 地址 (自动获取)
  • checksum, 用来判断 notes/story 有无变更
  • sort_by(排序方法): 按创建时间/按更新时间/由列表指定等共 5 种排序方式
    • 采用 SortBy.List 以外的方式时, Pictures 列表可以为空
    • 采用 SortBy.List 方式时, 必须填写 Pictures 列表
    • 采用 SortBy.List 方式时, 只显示列表中的图片, 未列出的就不会显示 (但图片本身仍可被公开访问, 只是不出现在相册中)
    • 采用 SortBy.List 以外的方式时, 使用命令 r2g album --rewrite-sortby-list -name NAME 可以自动填充 Pictures 列表 (目的是方便后续改为 SortBy.List 方式)
  • Pictures (图片文件名列表), 只在采用 SortBy.List 方式时才生效
  • 添加图片时, 则自动添加到 Pictures 列表头部
  • cover, 指定一个图片文件名作为相册封面, 留空则采用第一张

Gallery

  • author, 图库作者 (必填)
  • notes, 图库简介 (纯文本格式, 第一行是图库标题)
  • 如果有较长的描述, 可以写在 story 里, 采用 Markdown 格式
  • checksum, 用来判断 notes/story 有无变更
  • 相册列表排序: 只能手动排序
  • 相册列表
    • 相册依次排序
    • 不在列表中的相册不会显示在图库网页中 (但相册本身仍可被公开访问)
  • 首页可选择 3 种展示方式
    • 相册列表(封面)
    • 最新单图
    • 相册介绍(notes+story+相册列表)

r2_files.json and waiting.json

  • 等待上传的文件记录在 waiting.json 中.
  • 只有执行 r2g upload 系列命令时才会上传文件到云端.
  • r2_files.json 记录已上传到 R2 的 html/css 等文件的 checksum, 以便判断是否需要更新.
  • 不记录图片的 checksum

准备工作

为了让你的图片能通过互联网访问, 本软件采用的办法是上传图片到 Cloudflare R2. 因此, 需要先开通 Cloudflare R2.

开通 Cloudflare R2

  1. 注册账户 https://www.cloudflare.com/
  2. 启用 R2 服务 https://developers.cloudflare.com/r2/get-started/
    内含 10GB 免费容量, 流量免费, 注册时需要信用卡或 PayPal
    (注意: 上传下载等的操作次数超过上限也会产生费用, 详情以 Cloudflare 官方说明为准).
  3. 从 dashboard 进入 R2 页面,点击 Create bucket 创建一个数据桶。 建议 bucket 的名称设为 my-gallery
  4. 进入新建的 bucket, 点击 Settings, 在 Public Access 栏内点击 Allow Access, 该操作成功后可以看到 Public Bucket URL, 请复制保存, 后续有用.

生成密钥

(如果已经有密钥, 就不需要再生成了.)

  1. 在 R2 页面可以找到 Account ID, 请复制保存, 后续有用.
  2. 在 R2 页面点击 Manage R2 API Tokens
  3. 点击 Create API Token, 权限选择 Edit, 再点击右下角的 Create API Token 按钮, 即可得到 Access Key ID 和 Secret Access Key

注意:
Access Key ID 和 Secret Access Key 只显示一次, 请立即复制保存 (建议保存到密码管理器中)

五个重要信息

经过上述操作后, 一共获得了 5 个重要信息, 请妥善保存这些信息:

  • bucket 名称 (以下称为 bucket_name)
  • Public Bucket URL (以下称为 bucket_url)
  • Account ID (以下称为 accountid)
  • Access Key ID (以下称为 access_key_id)
  • Secret Access Key (以下称为 access_key_secret)

创建一个新图库

安装了 r2g 命令后, 进入任何一个空文件夹内, 执行命令 rg2 init 初始化一个图库.

初始化成功后,在当前文件夹 (以下称为 "图库根目录") 内可以看到:

  • templates (相册网页模板)
  • output_local (本地网站, 图片地址采用相对路径)
  • output_web (正常网站, 图片地址是 R2 公开仓库的网址)
  • gallery.toml (图库作者, 图库简介等)

填写图库信息

如上所述, 创建图库后, 会得到一个 gallery.toml 文件, 请用文本编辑器打开 gallery.toml, 其内容大概像这样:

author = '佚名'
notes = '''
My Gallery
'''
endpoint_url = 'https://<accountid>.r2.cloudflarestorage.com'
aws_access_key_id = '<access_key_id>'
aws_secret_access_key = '<access_key_secret>'
bucket_name = '<bucket_name>'
bucket_url = '<bucket_url>'

其中 <accountid> 等尖括号的位置要填写正确的值, 一共有 5 个尖括号, 这五个值都可以在上文 准备工作 部分找到. (填写时, 不要保留尖括号.)

填写正确的值后保存文件, 配置完成, 可以开始正常使用.

注意 bucket_name

每一个图库, 对应一个 bucket_name, 如果在本地新建第二个图库, 那么在 Cloudflare R2 那边也要建立一个新的 bucket, 并获得其 Public Bucket URL.

全部图库的 accountid, access_key_id, access_key_secret 都是通用的, 而 bucket_name 和 bucket_url 是每个图库独立的.

填写图库作者与简介等

在上述 gallery.toml 中, 有三个项目涉及图库的作者, 标题, 介绍等信息.

  • author: 作者名称, 默认佚名, 请改为你的真名或网名
  • notes (简介):
    • 第一行会被自动提取作为图库的标题
    • 若有更多介绍可从第二行开始写 (参照下面的例子)
    • 有字数限制, 不可超过 512 个字
  • story (故事):
    • story 与 上面的 notes 一样都是对图库的介绍
    • 不同的是, notes 是纯文本, story 采用 Markdown 格式, notes 有字数限制, story 无字数限制
    • 因此, 如果你需要更丰富的格式, 或需要写较多内容, 可以填写 story

示例:

author = '小帅'
notes = '''
小帅的相册

这里主要是我日常拍的, 旅行拍的照片。
'''
story = '''
## 关于我

一般 story 的标题建议从 `h2` 开始,因为图库标题(**即 notes 的第一行**)
已经占用了 h1
'''

创建相册

  • 使用命令 r2g --new-album NAME 新建相册
  • 其中 NAME 是相册文件夹名称
    • 只能使用 0-9, a-z, A-Z, _(下划线), -(短横线), .(点)
    • 相册文件夹名会成为网址的一部分, 因此建议尽量短一点

填写相册信息

使用上述命令创建相册后, 会得到一个新文件夹, 进入该文件夹内, 可以看到一个 album.toml 文件.

  • 请在 album.toml 文件里填写相册简介 (默认为相册文件夹名)
  • 相册简介采用纯文本格式, 第一行是相册标题
  • 如果有较长的描述, 可以写在 story 里, 采用 Markdown 格式
  • story 的标题建议从 h2 开始 (即最大的标题从 ## 开始)

相册排序

  • 新增的相册会被自动添加到 gallery.toml 文件的 albums 列表中
  • 如果想调整相册顺序, 可直接编辑 gallery.toml 文件中的 albums 列表
  • 你也可以删除列表中的相册文件夹名, 不在列表中的相册不会显示在图库网页中 (但相册本身仍可被公开访问)

添加图片

  • 直接复制/剪切图片, 粘贴到相册文件夹中.
  • 图片文件名只能使用 0-9, a-z, A-Z, _(下划线), -(短横线), .(点)
  • 图片文件名会成为网址的一部分, 因此建议尽量短一点
  • 图片的中文名/标题, 或描述, 可在添加图片后写在对应的 toml 文件里.
  • 如果在终端使用 cp 或 mv 命令, 要注意防止覆盖同名文件.
    • 在 Linux 里, 使用 -i 开关, 例如 mv -i src.jpg dest.jpg
    • 在 Windows 里, 使用 -cf 开关, 例如 mv -cf src.jpg dest.jpg

填写图片信息

添加一张或多张图片到一个或多个相册文件夹后, 在图库根目录执行命令 r2g -update 给新增的图片生成同名 toml 文件.

注意: r2g -update 只处理 gallery.toml 中的 albums 列表中的相册.

  • 请在 toml 文件里填写图片简介 (默认为图片文件名)
  • 相册简介采用纯文本格式, 第一行是相册标题
  • 如果有较长的描述, 可以写在 story 里, 采用 Markdown 格式

填写信息后, 执行命令 r2g render NAME (其中 NAME 是相册文件夹名) 或 r2g render -all 更新网页.

三种输出

添加图片并执行 r2g -update 后, 会生成网页, 分成 3 个文件夹:

  • output_local: 这是用来本地预览的, 不消耗网络浏览, 预览相册的效果
  • output_web: 这是一个静态网站, 可以上传到 GitHub Pages 之类的地方, 即可得到一个能在网络上公开访问的网站, 其中图片储存在 Cloudflare R2
  • output_r2: 这是等待上传到 Cloudflare R2 的网页文件, 如果你不想使用 GitHub Pages 之类的服务, 可以直接使用 Cloudflare R2 作为一个能在网络上公开访问的网站 (具体方法件后文 "上传文件" 部分).

图片体积上限

注意, 本软件并非图片备份软件!

本软件是资源敏感的, 涉及网络传输, 使用了云服务, 如果超过免费额度, 就会产生费用.

因此, 建议限制图片的尺寸与体积. 在 gallery.toml 中有三项相关设定:

  • image_width_max: 图片宽度上限, 默认 1000 像素
  • image_height_max: 图片高度上限, 默认 1000 像素
  • image_size_max: 图片体积上限, 默认 2 MB

缩小图片体积

如果添加的图片超过如上所述的体积上限,会报错,此时你可以:

  1. 用文本编辑器打开 gallery.toml 修改上限值。
  2. 自己另行用图片编辑器缩小图片,使其符合上述宽度、高度、体积要求。
  3. 使用命令 r2g --force-resize 让本软件执行缩小图片的操作。

注意, 使用命令 r2g --force-resize 时, 如果缩小尺寸后的图片文件名与 原图的文件名相同, 就会覆盖原图, 如果文件名不同, 则原图与小图共存, 此时, 请检查小图看看有无问题, 如果没问题请手动删除原图.

如上所述, 由于有可能覆盖原图, 因此请先备份原图.

还要注意, 命令 r2g --force-resize 不能正常处理 RAW, NEF 等图片格式.

缩略图

添加照片, 执行 r2g -update 后, 会生成缩略图在 thumbs 文件夹里.

修改 gallery.toml 中的 thumb_size 可设定缩略图的边长 (缩略图总是正方形).

封面

  • 每个相册都必须指定封面。
  • 第一次向相册添加图片时 (复制图片到文件夹内, 然后执行 r2g -update) 会自动指定封面。
  • 若想手动指定封面, 可修改 album.toml 中的 cover 项目, 被指定的封面图片必须存在于该相册内。
  • 另外, 也可以删除 gallery.toml 中的 albums 列表中的相册文件夹名, 不在该列表中的相册可以没有封面。

图片排列顺序

有 3 种排序方法: 按创建时间 / 按创建时间倒序 / 由列表指定

  • 采用 SortBy.List 以外的方式时, album.toml 中的 pictures 列表可以为空
  • 采用 SortBy.List 方式时, 必须填写 album.toml 中的 pictures 列表
  • 采用 SortBy.List 方式时, 只显示列表中的图片, 未列出的就不会显示 (但图片本身仍可被公开访问, 只是不出现在相册中)

上传文件

为了节省网络流量 (同时也有利于减少网络传输时间), 本软件将生成网页与 上传文件拆分为两个命令.

建议操作步骤是:

  1. 先用 r2g -update 生成网页, 进 output_local 文件夹双击 index.html 预览效果.
  2. 执行 r2g upload -pics 上传图片
    • 如果你想利用 Cloudflare R2 作为网站, 此时可以执行 r2g upload -all 同时上传图片与网页
  3. 进 output_web 文件夹双击 index.html 预览效果, 该网页中的图片都是 Cloudflare R2 里的图片
  4. 利用 GitHub pages 之类的服务发布 output_web 文件夹的内容

访问 Cloudflare R2 中的相册

  • 如果你上传文件时执行了 r2g upload -all, 那你就已经获得了一个 可以在网络上公开访问的相册.
  • 使用命令 r2g -info 可以查看 R2 Home Page 网址, 这就是你的相册网址.
  • Cloudflare R2 可以自定义域名, 参考 connect-your-bucket-to-a-custom-domain

删除图片或相册

  • 使用命令 r2g delete NAME 删除图片或相册
  • 例如 r2g delete ./abcd/pic.jpg 删除相册 abcd 中文件名为 pic.jpg 的图片
  • 例如 r2g delete ./abcd 删除文件夹名为 abcd 的相册
  • 删除一张或多张图片后, 还要执行 r2g -update 才会更新 HTML 文件
  • 注意, 删除图片不可恢复, 请小心操作.

重命名

  • 图片、相册的名称 (标题) 可以在对应的 toml 文件里修改.
  • 但图片的文件名, 相册的文件夹名在执行 r2g -update 命令后就无法修改.
  • 因为修改文件名/文件夹名的逻辑太繁琐, 易出错, 我决定宁可缺失该功能.
  • 如果实在需要修改, 就删除然后重新添加吧.

使用代理 (http proxy)

  • 默认不使用代理.
  • 使用命令 r2g --use-proxy true 可设置为使用代理.
    其中 true 也可以是 1(壹) 或 on.
  • 在上面的命令中, 如果输入参数不是 true, 1, on, 而是其它任何文字, 例如 r2g --use-proxy off, 则会设置为不使用代理.
  • 默认代理地址是 http://127.0.0.1:1081, 可使用文本编辑器打开 'gallery.toml, 修改其中的 'http_proxy'.

建议使用终端文本编辑器

本软件的大部分操作都需要在终端输入命令, 有时需要稍稍修改一下 toml, 这种情况下如果切换到文本编辑器去操作, 会感觉优点麻烦, 因此建议使用类似 Vim/Emacs 的终端文本编辑器, 就很方便.

我找到了 micro, 它类似 Vim/Emacs 并且更轻, 也更易学易用, 优点:

  • 启动速度飞快, 感觉非常轻巧.
  • 非常易学易用, 支持鼠标选择, 以及用 Ctrl-C / Ctrl-V 来复制黏贴.
    支持 Ctrl-S 保存 / Ctrl-A 全选等符合现代习惯的快捷键.