1. 前言

1.1 寻找合适的摄影相册

当你使用相机拍下了足够多的照片后,你不免产生新的念头,想要一个合适的相册来存放那些珍贵的瞬间,以便于随时随地分享和回味,不至于让它们在硬盘深处蒙上一层灰。我曾经会在微信朋友圈和500px上传我的摄影照片,前者更适合小范围的分享且和生活日常会混杂在一起,而后者的用户大多集中在摄影师之间,而且它们共同的缺点就是无法保存高质量的照片,你的照片会被第三方平台随意的压缩。

那么?我的需求逐渐明晰,我需要一个便于分享、能够保存高质量照片、最好还是能够自托管的相册。拥有这样需求的人不在少数,也有十分优秀的项目例如PicImpact或是exif-gallery-nuxt,那么在体验过一段时间后,我最终选择exif-photo-blog这个项目。

1.2 为什么选择它

选择EXIF Photo Blog这个项目的原因无外乎是它具有独特的内容呈现形式,能够显示Exif信息和富士胶片模拟信息,丰富的自定义选项,以及可以使用Vercel进行一键部署,不需要依赖服务器,1个域名,1个免费的Cloudflare R2对象存储,就能帮助你快速的部署属于你的摄影相册。

官方Demo:photos.sambecker.com

个人演示Demo:pic.liebesfreud.me

2. 在Vercel上部署

2.1 一键部署

项目主页提供了在Vercel上一键部署的按钮,你也可以fork项目后在Vercel手动部署,点此直达Vercel新建项目,部署时无需任何改动,在等待大约两分钟后即可部署完毕。

2.2 链接数据库

此时你已经可以通过Vercel提供的域名访问你的相册了,你大概会进入这样的界面,当你配置完Storage(数据库和对象存储)、Authentication后,会在对应的条件前打勾:

在项目界面中打开Storage选项卡,开始创建并链接你的数据库吧。我建议你使用Vercel提供的Neon或Supabase,它们都有一定的免费额度,对于一个个人使用的相册而言绰绰有余。

以Neon为例,选择合适的地区并创建,完成后,你可以很轻松的将其链接到项目:

在完成这一步后,记得回头检查相册网站中的检查项!

2.3 绑定你的域名

Vercel为你提供的域名难以记忆,且在中国大陆访问受限,建议绑定一个自己的域名,跟随步骤在你域名DNS中添加CNAME记录:

3. 配置对象存储 以R2为例

3.1 建立存储桶

在Cloudflare中创建一个R2存储桶,选项皆为默认,无需更改。

3.2 修改CORS策略

将R2的CORS策略修改为如下:

[{
    "AllowedHeaders": ["*"],
    "AllowedMethods": [
      "GET",
      "PUT"
    ],
    "AllowedOrigins": [
       "http://localhost:3000",
       "vercel域名",
       "你的域名"
    ]
}]

3.3 启用公共托管

可以通过以下两种方式之一设置公有存储桶:

将您的存储桶公开为受您控制的自定义域(在设置-自定义域中增加自己的域名)

使用 Cloudflare 托管的 https://r2.dev 子域为非生产使用案例公开您的存储桶。

3.4 创建API并配置环境变量

通过选择“Manage R2 API Tokens”并单击“Create API Token”来创建 API 令牌。

选择“对象读写”,选择“仅应用于特定存储桶”,然后选择创建的存储桶。

在Vercel中增加对象存储环境变量并重新部署。

AUTH_SECRET生成 auth secret

ADMIN_EMAIL:用户邮箱

ADMIN_PASSWORD:用户密码

CLOUDFLARE_R2_ACCESS_KEY:API

CLOUDFLARE_R2_SECRET_ACCESS_KEY:API密匙

NEXT_PUBLIC_CLOUDFLARE_R2_BUCKET :存储桶名称

NEXT_PUBLIC_CLOUDFLARE_R2_ACCOUNT_ID :账户 ID(位于 R2 概述页面上)

NEXT_PUBLIC_CLOUDFLARE_R2_PUBLIC_DOMAIN : “your-custom-domain.com” 或 “pub-jf90908...s0d9f8s0s9df.r2.dev”

随后访问 Vercel 上的项目,导航到“部署”选项卡,单击最近部署旁边的 ••• 按钮,然后选择“重新部署”

4. 上传你的第一张照片

登录到相册后台,在your-domain.com/admin/configuration路径中看到如下,恭喜你!你成功部署了EXIF Photo Blog,上传你的第一张照片吧: