ChronoFrame
自托管的个人相册应用,支持多存储后端和智能EXIF解析,让摄影师完全掌控照片数据。
智能下载
前往项目主页
该项目暂未提供安装包,请直接访问源代码仓库
自建相册,替代Google Photos,支持地图浏览和EXIF自动提取。
核心功能
- 智能EXIF提取:自动识别拍摄时间、位置、相机参数
- 反向地理编码:根据经纬度自动查找拍摄地点名称
- 交互式地图:在地图上浏览所有照片的地理位置
- 多存储后端:支持本地存储、S3兼容存储和CDN加速
- 高效缩略图:使用ThumbHash技术快速生成预览
避坑指南
- •默认管理员密码弱(CF1234@!),务必在.env中修改。如使用本地存储,注意磁盘空间。地图功能需要MapTiler或Mapbox的Token(免费额度够用)。反向地理编码依赖Mapbox Token,不配置则无法显示地点名称。
适用场景
- 摄影师个人作品展示网站:用自己域名展示作品集
- 家庭照片存档:自建家庭相册,避免依赖云服务
- 旅行照片整理:自动提取拍照地点,在地图上回顾旅程
详细介绍
ChronoFrame 是一款专为摄影师和爱好者打造的现代自托管相册应用。基于 Nuxt 4 + TypeScript + TailwindCSS + Drizzle ORM 构建,它提供了一个流畅的网页界面,用于上传、浏览和管理照片。核心功能包括智能 EXIF 元数据提取(自动识别拍摄时间、地点、相机参数)、反向地理编码(自动标注拍摄位置)、交互式地图浏览以及多存储后端支持(本地文件系统或 S3 兼容存储)。它使用 ThumbHash 高效生成缩略图,并利用 WebGL 实现高质量图片渲染。通过 Docker 一键部署(预构建镜像在 GHCR 和 Docker Hub 上),管理员后台支持批量上传、拖拽上传和自动生成缩略图。还支持 CDN 加速图片分发。相比 Google Photos 或 Flickr 等云服务,ChronoFrame 让你完全掌控自己的照片数据,没有隐私泄露风险,且无需订阅费用。
常见问题与排障 (1)
故障排除I'm not familiar with a product called ChronoFrame specifically, so I can't point to its exact code or a known bug report — but "[object Object]" in a web UI is a classic JavaScript symptom with a well-understood cause, and the debugging pattern is almost always the same.
**What's happening:** Somewhere, an object is being coerced to a string. In JavaScript, converting an object to a string yields "[object Object]". In a setup wizard this typically means:
- The backend returns an object where the frontend expects a plain string — e.g., the site info endpoint returns something like `{"title": {"en": "My Site"}}` (a localized or nested object), and the form binds the whole object to the input instead of one of its properties.
- A config value that used to be a string was migrated to a nested structure, and this one field wasn't updated.
- Stale cached state (localStorage, saved setup progress) holds an object that gets loaded into a text input.
- The fact that the input is also *unlabeled* suggests the same root cause: the field descriptor itself is an object, and the template fails to read both its label and its value correctly.
**How to pin it down:**
1. Open browser dev tools → Network tab, find the request that loads the site info data, and inspect the JSON. Look for a field that's an object where a string should be.
2. Check the Console for framework warnings (Vue, React, and Angular all complain in different ways when objects are bound to text inputs).
3. Clear site data / cached wizard state and retry.
4. If the API payload is wrong, it's a backend serialization issue; if the payload looks correct, it's a frontend binding bug — either way, it's worth filing an issue with the request/response captured.
If you can share the console output or the relevant API response (or a link to ChronoFrame's repo/docs), I can give you a more precise diagnosis.
这是 ChronoFrame 1.0.2 中一个已知的 UI bug。该字段是 socialLinks 应用设置,属于 JSON 类型的设置,默认值为 { links: [] }。安装向导会将所有非 tabs 类型的设置渲染为纯文本输入框,因此该对象会被强制转换为字符串 [object Object]。临时解决方法:直接忽略该字段即可——在其中输入的任何内容都不会被保存(向导提交的 payload 中不包含 socialLinks),因此不存在数据损坏的风险。如需配置社交链接,请完成安装向导后,改用仪表盘设置页面中专门的社交链接编辑器(仪表盘已正确地将 socialLinks 从通用字段中排除)。对于自行打补丁的开发者:请在 apps/self-hosted/server/api/wizard/schema.get.ts 中将 socialLinks(或所有对象/JSON 类型的设置)从向导的 app schema 中过滤掉,并可选择在向导渲染器(apps/self-hosted/app/pages/onboarding/site.vue)中添加一个防护逻辑,确保对象值永远不会被传递给文本输入框。
标签
快速上手
安装软件
双击下载的安装程序,按提示完成安装
步骤1:在服务器上安装Docker和Docker Compose
步骤2:创建.env文件,配置管理员邮箱、密码和存储方式(本地或S3)
步骤3:运行docker compose up -d启动服务
- 步骤1:在服务器上安装Docker和Docker Compose
- 步骤2:创建.env文件,配置管理员邮箱、密码和存储方式(本地或S3)
- 步骤3:运行docker compose up -d启动服务
暂未获取到校验码
该项目暂未在 GitHub Release 页面提供 SHA-256 校验码
SHA256 校验码
暂无校验码
建议从 GitHub Releases 页面直接下载,并自行核对文件完整性
本平台所有 SHA-256 校验码均提取自项目在 GitHub 官方 Release 页面发布的文件,未做任何修改。你可以通过 GitHub Releases 页面自行验证。
开源透明
查看 GitHub 源码卸载说明
停止容器:docker compose down;删除数据:rm -rf ./data 和 docker rmi ghcr.io/hoshinosuzumi/chronoframe
无额外依赖
下载后即可直接使用,无需安装其他运行环境
遇到问题?查看下方 FAQ
1 FAQ