ChronoFrame非常适合喜欢玩摄影、拍照的用户食用。我觉得这程序的UI设计的是真好看,无论是前台还是后台都好看,非常符合我的审美,没需求的我都想怼几张图片上去挂着了= =

ChronoFrame特性(摘自项目页面)

在线管理照片 – 通过 Web 界面轻松管理和浏览照片

探索地图 – 在地图上浏览照片拍摄位置

智能 EXIF 解析 – 自动提取拍摄时间、地理位置、相机参数等元数据

地理位置识别 – 自动识别(Reverse Geocoding)照片拍摄地点

多格式支持 – 支持 JPEG、PNG、HEIC/HEIF 等主流图片格式

智能缩略图 – 基于 ThumbHash 技术的高效缩略图生成
现代技术栈

Nuxt 4 – 基于最新的 Nuxt 框架,提供 SSR/SSG 支持

TypeScript – 完整的类型安全保障

TailwindCSS – 现代化的 CSS 框架

Drizzle ORM – 类型安全的数据库 ORM
灵活的存储方案

多存储后端 – 支持 S3 兼容存储、本地文件系统

CDN 加速 – 可配置 CDN 地址加速图片访问

安装Docker:

apt -y update
apt -y install curl
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

创建目录新建compose文件:

mkdir /opt/chronoframe && cd /opt/chronoframe && nano docker-compose.yml

写入如下内容:

services:
  chronoframe:
    image: ghcr.io/hoshinosuzumi/chronoframe:latest
    container_name: chronoframe
    restart: unless-stopped
    ports:
      - '127.0.0.1:3000:3000'
    volumes:
      - ./data:/app/data
    env_file:
      - .env

创建.env文件:

nano .env

写入如下内容,自行按注释内容修改:

# 管理员邮箱(必须)
[email protected]
# 管理员用户名(可选,默认ChronoFrame)
CFRAME_ADMIN_NAME=imlala
# 管理员密码(可选,默认 CF1234@!)
CFRAME_ADMIN_PASSWORD=passwd

# 站点信息(全部可选)
NUXT_PUBLIC_APP_TITLE=
NUXT_PUBLIC_APP_SLOGAN=
NUXT_PUBLIC_APP_AUTHOR=
NUXT_PUBLIC_APP_AVATAR_URL=

# 地图提供器 (maplibre/mapbox)
NUXT_PUBLIC_MAP_PROVIDER=maplibre
# 使用MapLibre需要MapTiler的访问令牌
NUXT_PUBLIC_MAP_MAPLIBRE_TOKEN=
# 使用Mapbox需要Mapbox的访问令牌
NUXT_PUBLIC_MAPBOX_ACCESS_TOKEN=

# 存储提供者(支持local/s3/openlist)
NUXT_STORAGE_PROVIDER=local
NUXT_PROVIDER_LOCAL_PATH=/app/data/storage

# 会话密码(必须,32位随机字符串,使用命令生成:openssl rand -base64 32)
NUXT_SESSION_PASSWORD=

若选择使用s3,则将存储部分替换为:

NUXT_STORAGE_PROVIDER=s3
NUXT_PROVIDER_S3_ENDPOINT=
NUXT_PROVIDER_S3_BUCKET=chronoframe
NUXT_PROVIDER_S3_REGION=auto
NUXT_PROVIDER_S3_ACCESS_KEY_ID=
NUXT_PROVIDER_S3_SECRET_ACCESS_KEY=
NUXT_PROVIDER_S3_PREFIX=photos/
NUXT_PROVIDER_S3_CDN_URL=

启动:

docker compose up -d

ChronoFrame建议生产环境使用反向代理,如果您必须使用IP+端口来访问,请在.env文件内添加如下内容:

NUXT_ALLOW_INSECURE_COOKIE=true

以解决类似问题:https://github.com/HoshinoSuzumi/chronoframe/issues/14#issuecomment-3333256569

我这里配置Ferron反向代理:

nano /etc/ferron.kdl

写入如下内容:

chronoframe.example.com {
    proxy "http://127.0.0.1:3000/"
}

重载Ferron:

systemctl reload ferron

前台的效果参考项目页面,我这里放两张后台的效果图: