在 Fly.io 部署 Ente 端到端加密相册

注意:本文最后编辑于 2024/09/18,请自行辨别文章中内容是否过时。

Ente 相较于其他相册的方案,最大的优势在于其是端到端加密的,你可以在这里找到它们的技术架构。相较于商业化产品云盘产品等,端到端加密可以更好的保护隐私。而相较于已有的开源方案如immichphotoprisma暂不支持云存储,Ente 能够使用S3等对象存储作为存储后端也是一个很好的特性。而且 Ente 不需要服务端来代理文件,而是由客户端直接请求对象存储中的文件,服务端不需要多少性能和带宽即可部署,官方描述为“应该可以在任何合理的设备上运行”。

There aren't any "minimum" system requirements as such, the server process is very light weight - it's just a single go binary, and it doesn't do any server side ML, so I feel it should be able to run on anything reasonable.

要部署这个需要准备:

  • Ente 服务端
  • Postgres 数据库
  • S3 对象存储

这里我使用了来自 Fly.io 的服务器,Neon 的 Postgres 数据库和 BackBlaze B2 作为对象存储。

设置服务端

这部分参见官方文档 https://help.ente.io/self-hosting/guides/external-s3

使用镜像ghcr.io/ente-io/server作为服务端, 需要配置credentials.yaml并挂载到容器中museum可执行文件的同级目录或者使用环境变量配置相关的配置,比如以下配置文件中s3.b2-eu-cen.secret对应的环境变量为ENTE_S3_B2-EU-CEN_SECRET

// 配置文件 credentials.yaml
// from https://github.com/ente-io/ente/blob/main/server/scripts/compose/credentials.yaml
db:
    host: postgres
    port: 5432
    name: ente_db
    user: pguser
    password: pgpass

s3:
    are_local_buckets: true
    b2-eu-cen:
        key: test
        secret: testtest
        endpoint: localhost:3200
        region: eu-central-2
        bucket: b2-eu-cen
    wasabi-eu-central-2-v3:
        key: test
        secret: testtest
        endpoint: localhost:3200
        region: eu-central-2
        bucket: wasabi-eu-central-2-v3
        compliance: false
    scw-eu-fr-v3:
        key: test
        secret: testtest
        endpoint: localhost:3200
        region: eu-central-2
        bucket: scw-eu-fr-v3

在这里需要配置好对应的 postgres 数据库和 s3 存储。

如果使用 Neon 作为 Postgres 数据库,会遇到The endpoint ID is not specifie错误,需要设置ENTE_DB_SSLMODE=verify-full环境变量,或者参考Neon 文档中的其他方法。

设置 CORS

除此之外,你还需要设置 S3 存储的 CORS 策略,否则可能会导致在 Windows 客户端上无法显示文件等问题,官方文档中给出了使用 AWS S3 的配置方案。如果像我一样使用 BackBlaze B2 作为存储后端,则需要参考这个讨论设置对应的 CORS 策略。以下我简单复述以下设置的过程:

首先需要安装 b2 的 CLI 工具,然后执行以下命令,该命令会提示需要输入在网页端生成的 Master Key ID 和 Master Key 以授权 CLI 访问账户中的资源。

b2 account authorize

再在当前目录编辑一个cors.json文件,内容为:

[
  {
    "corsRuleName": "entephotos",
    "allowedOrigins": [
      "*"
    ],
    "allowedHeaders": [
      "*"
    ],
    "allowedOperations": [
      "b2_download_file_by_id",
      "b2_download_file_by_name",
      "b2_upload_file",
      "b2_upload_part",
      "s3_get",
      "s3_post",
      "s3_put",
      "s3_head"
    ],
    "exposeHeaders": [
      "X-Amz-Request-Id",
      "X-Amz-Id-2",
      "ETag"
    ],
    "maxAgeSeconds": 3600
  }
]

再执行以下命令:

b2 bucket update --cors-rules "$(<./cors.json)" <bucket-name> allPrivate

其中的<bucket-name>需要替换为实际存储数据的 Bucket。

注册账户

如果以上操作都完成并且成功启动,在绑定了域名之后就可以使用域名连接到自部署的服务器上了。在 Ente 的 Windows 客户端、iOS 客户端、Android 客户端都可以在欢迎界面多次点击来设置自己的服务端地址,在这里输入部署好的服务端地址即可开始使用。

如果尝试注册账户,会在注册的过程中需要输入激活邮件的验证码,由于我们并没有设置邮件服务器,所以并不会有验证邮件的激活码,但是我们可以在服务端的日志中查看到类似于这条的输出,所以我们可以拿到验证码用于账户验证。

userauth.go:157 verifyEmailOtt Valid ott (app: photos) for 3YrPtnReer12NR2Ze2Z2NIl4erz12NfddGO2ZiHyAsdf0= are 635129

默认情况下注册的第一个账户为管理员账户,但是你也可以通过服务端的一些设置来添加管理员账户。

增加存储空间

默认情况下注册的账户只有 5GB 的存储空间,Ente 有一个用于管理服务端的 CLI 工具 ente-cli,可以通过这个工具增加我们账户的存储空间,以下部分参照自文档

首先需要下载 CLI 工具,然后在同级目录设置一个config.yaml文件,文件内容如下:

endpoint:
    api: "http://localhost:8080"

其中api字段需要更换为自己的服务端地址。

然后通过以下命令添加一个管理员账户:

./ente account add

按照 CLI 中的提示输入账户和密码即可。

然后输入

./ente admin update-subscription -u <[email protected]m> --no-limit true

其中<[email protected]>要设置成需要设置的账户的邮件地址。执行成功后,即可获得无限大小(100TB)的存储空间。