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
前台的效果参考项目页面,我这里放两张后台的效果图:

