200字
「PicImpact」更易用的自托管个人相册&画廊
2025-11-11
2025-11-14

封面PicImpact.png前言

其实很早之前就已经了解到了这个项目,也试用过一段时间,当时这个项目还不够完善,最后还是选择了exif-photo-blog这个项目来作为个人相册。但是现在PicImpact已经迭代的非常出色了,且我在使用exif-photo-blog项目的过程中遇到一些棘手的问题让我决定将个人相册迁移到PicImpact

Exif-Photo-Blog带来的一些问题:

  1. 没有提供docker部署方式,这就让迁移变得困难

  2. 目前只提供了Vercel一键部署方式,但Vercel免费计划提供的额度不足以支撑相册的高频访问

  3. Vercel部署强烈依赖在线数据库,我想要完全私有

  4. Vercel部署的Exif-Photo-Blog在中国访问体验较差

迫于这些问题我在很长一段时间内没有更新个人相册,趁着这段时间较为空闲,加上我购置了新的服务器。于是一不做二不休,干脆把个人相册迁移到PicImpact,以下是我的折腾过程。

准备工作

虽然PicImpact同样支持Vercel一键部署,但我更推荐你使用Docker Compose。你需要提前准备的有:

  1. 一台服务器(该项目占用较少,1C1G足以)

  2. 已经安装了Docker Compose

  3. 已经安装了PostgresSQL

  4. 对象存储(AWS S3,CF R2等)

现在开始

创建配置文件​

  1. 创建一个新的文件夹来存放项目,例如 picimpact​

  2. 在该文件夹中,创建一个名为 docker-compose.yml​ 的文件
    ​docker-compose.yml​ 的内容如下:

    services:
      picimpact:
        container_name: picimpact
        ports:
          - 3000:3000
        environment:
          - DATABASE_URL=postgresql://[用户名]:[密码]@[地址和端口]/[数据库]
          - DIRECT_URL=postgresql://[用户名]:[密码]@[地址和端口]/[数据库]
          - BETTER_AUTH_SECRET=自己运行npx auth secret或一串随机的字符串都行
        image: besscroft/picimpact:latest
    networks: {}
    
  1. 配置环境变量

    • 将 [用户名]​ 替换为您的数据库用户名。

    • 将 [密码]​ 替换为您的数据库密码。

    • 将 [地址和端口]​ 替换为数据库服务器的 IP 地址或域名及端口号(例如 192.168.1.10:5432​ 或 db.example.com:5432​)。

    • 将 [数据库]​ 替换为您要使用的数据库名称。

    • 在您的终端中运行 openssl rand -base64 32​ 生成一个随机字符串,并填入BETTER_AUTH_SECRET​

启动服务

  1. 使用 cd​ 命令进入您创建 docker-compose.yml​ 文件的文件夹

  2. 运行以下命令来启动服务:

    docker-compose up -d
  1. 打开浏览器,访问http://<您的服务器IP>:3000​

  2. 注册并登录

配置对象存储

我选择使用c作为对象存储,如果你有其他选择,请参考官方文档

  1. ​r2_accesskey_id​:Cloudflare AccessKey_ID

  2. ​r2_accesskey_secret​:Cloudflare AccessKey_Secret

  3. ​r2_account_id​:Cloudflare ACCOUNT_ID,也就是 https://<ACCOUNT_ID>.r2.cloudflarestorage.com​

  4. ​r2_bucket​:Cloudflare Bucket 存储桶名称,如:picimpact​

  5. ​r2_storage_folder​:存储文件夹(Cloudflare R2),严格格式,如:picimpact​ 或 picimpact/images​ ,填 /​ 或者不填表示根路径

  6. ​r2_public_domain​:Cloudflare R2 自定义域(公开访问)

修改Cloudflare R2跨域配置

[
  {
    "AllowedOrigins": [
      "*"
    ],
    "AllowedMethods": [
      "GET",
      "PUT",
      "POST",
      "DELETE"
    ],
    "AllowedHeaders": [
      "*"
    ],
    "ExposeHeaders": [],
    "MaxAgeSeconds": 3000
  }
]

压缩图片并上传

为了减轻存储压力,并优化访问速度,我们需要对上传的照片进行压缩处理,我这里使用的是开源图片压缩工具PicSharp,配合TinyPNG的API将图片压缩为WebP进行上传。

「PicImpact」更易用的自托管个人相册&画廊
作者
Liebesfreud
发表于
2025-11-11
License
CC BY-NC-SA 4.0