TechMoon 科技月球
WordPress、SEO 與 AI 工具實測指南
TechMoon 科技月球
WordPress、SEO 與 AI 工具實測指南

ChronoFrame 是 MIT 開源的自架展示型相簿,二十秒起站、繁中介面全譯,上傳自動解析 EXIF、時區與地點。實測確認位置清除開關會連原始檔一起重寫,也找到映像檔版本與儲存設定兩個部署坑。
用 AI 摘要這篇文章:
我在自己的 Mac 上把 ChronoFrame 架起來,丟進一張帶 GPS 座標的測試照片。容器約二十秒後開始回應,再過幾秒照片就出現在首頁,地點欄自動寫出台北 101 旁的松智路,一路列出「西村里、信義區、臺北市」。這是它最迷人的部分,也是這篇要攤開檢查的部分。
先把判斷放前面。ChronoFrame 是一套 MIT 授權、可自架的展示型照片相簿:開發者 Timothy Yin 的作品,GitHub 上約一千九百顆星,介面有完整繁體中文。它適合想把作品集放上自己伺服器的攝影人;拿備份照片庫的期待來用會失望。實測過程我確認了三件事:它真的能快速架起來;部署有兩個坑,一個版本坑、一個設定坑;以及「自架」三個字並不代表照片資料完全不出門,有三條邊界要自己守。
官方部署路徑是 Docker。一個容器、一個掛載卷,資料庫是單檔 SQLite,映射好連接埠就能跑,我這次從拉映像檔到首頁回應約二十秒,映像檔本身約 144 MB。儲存後端有三種選擇:本機檔案系統、S3 相容儲存(官方文件連 Cloudflare R2 的設定範例都寫好了,還可掛 CDN 網址加速)、以及 OpenList(可接個人雲或 NAS)。照片放物件儲存、資料庫放本機,這種配置對流量大的站很合理。
問題出在映像檔來源。README 同時列了 GHCR 與 Docker Hub 兩個倉庫,並把 GHCR 的指令放在前面。我兩邊各架了一台對照,找到根源:latest 這個標籤在兩個倉庫都停在 2025-10-28 的 0.14.1,之後的版本只推在明確的版本號標籤上,2026-08-06 發布的 1.0.0-rc.4 要指名版本才拉得到,而 README 的 pull、run、compose 範例清一色用 latest。照抄的結果,就是裝到十個月前的版本。
差別不是理論。舊版映像檔第一次啟動就自動建立 [email protected]、密碼 CF1234@! 的管理員帳號,我用這組預設值真的登進去了;新版則換成六步安裝精靈,帳號密碼由你自己設。舊版也缺少後來才加入的「清除拍攝位置」功能(後面會驗證它多重要),而且首次啟動時背景工作序列會因資料表還沒建好而反覆報錯,重啟一次才安靜。要架,請指名版本標籤(兩個倉庫都有同步),別信 latest。
設定坑在儲存後端。官方文件的設定表格寫 NUXT_STORAGE_PROVIDER 預設值是 local,但程式裡 nuxt.config.ts 第 73 行的執行預設是 s3。我實測不指定這個變數時,容器以 s3 模式啟動、直接因缺少金鑰而失敗。這個變數必須明寫,文件的預設值靠不住。
新版安裝精靈的六步是:歡迎、管理員帳號、站點資訊、儲存、地圖服務、完成。多數步驟照預設走就行,唯獨地圖服務一定要填 MapTiler 或 Mapbox 的存取權杖,原始碼對這個欄位做了必填驗證,空值過不了關。也就是說,傳第一張照片之前,你得先去一家商業圖資服務註冊帳號。這件事稍後談資料邊界時還會回來。
環境變數還有兩個必填值得記:工作階段密碼要給滿 32 個字元的隨機字串(登入狀態靠它簽名),以及 Open Graph 圖片合成的一組密鑰。管理員帳號也可以用環境變數預先指定好,避免精靈之外還有另一組來源的預設值。GitHub OAuth 登入是選配,預設關閉,打開它的前提是管理員信箱與 GitHub 帳號信箱一致,文件在 FAQ 有提醒這個對應關係。
上傳是把檔案以 HTTP PUT 直接放進儲存後端,之後背景工作序列接手。這個兩段式設計有個實際好處:檔案先落地,處理失敗會自動重試(預設最多三次),上傳頻寬與處理速度脫鉤。容器日誌可以看完整條流程:HEIC 會先轉出一份 JPEG 副本,Sharp 讀出尺寸,接著產生 WebP 縮圖與 ThumbHash 佔點陣(縮圖還沒載入前先用它撐住版面),exiftool 抽出完整 EXIF,然後做地理位置反解,最後檢查 Android 的 motion photo 標記、配對 iPhone 的 Live Photo。

我那張 1600×1000 的測試照,從上傳到處理完成不到十秒。有個細節做得聰明:拍攝時間會自動套上時區,而時區是從 GPS 座標推回來的,資料裡明明白白記著 tz=Asia/Taipei、來源是 GPS 經緯度。出國拍的照,時間軸不用手動調。
處理完的照片頁,訪客看得到的不只圖片。EXIF 裡的相機廠牌、機身與鏡頭型號、拍攝時間、地點名稱都會展示出來,管理者還能補標題、描述與標籤。有趣的是分享卡:每張照片的社群分享預覽圖是伺服器動態合成的,我抓示範站的原始碼來看,og:image 是一張張按照片即時產生的 1200×600 圖,丟到通訊軟體裡不會只剩站名,這個小地方看得出作者是真的在用這套相簿。
iPhone 用戶的 Live Photo 支援完整:HEIC 照片與 MOV 影片只要檔名相同就自動配成一組,上傳順序無關,漏配了也能在管理介面手動重配;Android 的 motion photo 靠 XMP 標記辨識。想在電腦上先整理 Live Photo 的人,可以搭配我們介紹過的 Live Photo 轉檔工具。
管理介面這側,照片用批次與拖曳上傳,可建多本相簿、各自指定封面與排序,訪客互動有八種表情反應可以按。相簿與照片的關聯存成獨立資料表,排序位置是一個數字欄位,手工調整順序的設計頗踏實。

「照片放在我自己的伺服器上」這句話,在 ChronoFrame 上要拆開檢查。把工具搬進自己機器之後資料往哪裡流,是我們看自架工具時固定的問題,從自架微網誌 ech0 到自架履歷產生器 JadeAI 都是同一套問法。實測之下,它至少有三條資料流會離開你的機器。
最隱形的一條是座標外送。上傳的照片若帶 GPS,伺服器會立刻把經緯度送去反地理編碼服務,換回人類可讀的地點名稱。原始碼裡的規則是:有設 Mapbox 權杖就走 Mapbox Search API,沒設就退回 OpenStreetMap 的公共服務 nominatim.openstreetmap.org。換句話說,預設安裝下每張照片的拍攝座標都會送到位於國外的公共伺服器。官方文件對此很誠實,直接說明預設行為,也給了兩條調整路:把反解服務指向自架的反向代理,或改用 Mapbox(文件特別註明這在大陸伺服器連不上 Nominatim 時有用)。完全離線的選項則沒有。
地圖本身是第二條。探索地圖與照片頁的小地圖,圖資都來自 MapTiler 或 Mapbox 的商業服務,安裝精靈強制填權杖的原因就在這。兩家取向略有不同:MapLibre 搭配 MapTiler 是開源組合、可換自訂圖面樣式;Mapbox 的渲染器較強、免費額度也夠個人站用,但終究是商業服務。訪客瀏覽你的地圖時,圖磚請求是從訪客瀏覽器直接打到圖資服務的,用量記在你的權杖上,這層依賴要認得。

最需要想清楚的一條,其實是原始檔預設公開。ChronoFrame 的相簿是分享取向,照片只要不在「隱藏相簿」裡,任何人不必登入就能瀏覽,而原始檔網址可以直接下載。我在測試站上驗證了這件事:登出狀態抓原始檔,HTTP 200,抓回來的檔案餵給 EXIF 工具,GPS 座標原封不動在裡面。也就是說,預設行為下任何訪客都能把你每張照片的精確拍攝位置帶走。這與漏洞無關,作者的示範站本身就是公開的,這是產品定位;但若你打算當私有相簿用,這條邊界要自己處理。照片位置一旦外流能做什麼,我們在 GeoSpy 這類從單張照片反推拍攝地的工具介紹裡展示過,對照著看會更有感。
還有個小邊界:訪客按表情反應時,資料庫記的是訪客指紋而非單純計數,schema 裡另外留了 IP 與瀏覽器欄位。設計註解寫明用指紋是為了支援匿名訪客重複按,屬於合理的工程選擇,但公開站的站長對這類訪客紀錄仍有保管責任。
好消息是開發者在這件事上沒有敷衍。上傳時可以逐張勾選清除位置,系統設定裡也有「上傳後自動清除位置」的總開關,預設關閉。
我用同一張照片做對照。正常上傳的那份,資料庫記了座標,地點欄顯示到松智路,原始檔 41,991 bytes、GPS 完整;勾了清除位置的那份,資料庫裡座標與地點全空,連反地理編碼都沒觸發,最關鍵的是原始檔本身被重寫成 41,873 bytes,GPS 標籤整組消失。這個開關清的是檔案本體,之後訪客下載也拿不到位置,做得很徹底。
要注意版本。這個行為在 1.0.0-rc.4 上驗證成立,但前面那份十個月前的舊映像檔完全沒有這個功能,上傳參數會被直接忽略、位置照留。這又多一個別用 latest 標籤的理由。
GitHub 的專案自述寫得明白:self-hosted personal gallery,並註明受靜態相簿專案 Afilmory 啟發。它的功能取捨都圍繞展示:沒有備份客戶端、沒有人臉辨識、沒有手機自動同步,帳號以單一管理員為中心,可選打開 GitHub OAuth 登入。文件的完整度倒是超出這類個人專案的平均水準:快速開始、配置、儲存與地圖服務、升級指南、API 文件一應俱全,而且有簡體中文版,對照著環境變數表照抄就能架起來。討論區有人請求整合 Immich(issue #154),這恰好說明使用者自己也把兩者當互補:一個管備份歸檔,一個管對外展示。
所以選擇題是這樣。你已經有整理好的作品,想要一個自己掌控、有地圖軸、能原味呈現 Live Photo 的公開站,ChronoFrame 值得一架;你要的是全家照片的自動備份、人臉搜尋與私密共享,那它現在給不了,也沒打算往那個方向長。
既有照片匯不進來。FAQ 明言目前不支援掃描儲存空間裡已有的照片,issue #213 與 #305 都在等這件事。相簿要從第一次上傳開始養。
沒有伺服器端分頁,issue #303 還開著,照片一多之後前端怎麼吃還沒驗證,我實測的量級只在個位數張。盜鏈防護也還沒有,issue #179 的結論是要自己在反向代理層處理,公開站要有心理準備。Android 端拿不到原圖,issue #192 回報下載原圖的按鈕在 Android 上缺席。
版本還在候選階段。1.0.0 系列至今全部是候選版,最新是 2026-08-06 的 1.0.0-rc.4,最後一個穩定版停在 2025 年 10 月的 0.14.1;不過開發本身是活的,commits 到 2026-08-18 仍有紀錄,討論區開著四十多個議題與合併請求。正式 1.0 之前,設定項與行為有可能調整。
一句話定位:ChronoFrame 把「自架照片站」做輕了,一份映像檔、一個 SQLite、一張地圖 token,二十秒就能有個像樣的作品集網站,繁中介面全譯、位置隱私開關真的會改寫檔案。代價是你得認清它的幾條外部邊界,部署清單上也有該自己做的決定:指名版本標籤拉映像檔、明寫儲存後端變數、想清楚要不要打開自動清除位置。作品集導向的攝影人會用得很順;要備份庫的人,等 Immich 整合或直接去用 Immich 更實在。
可以完全離線自架嗎?
照片檔與資料庫可以完全自架。地點反解與地圖圖資依賴外部服務:反解可指向自架的 Nominatim 反向代理,地圖圖資則沒有自架選項。
已經放在 S3 或硬碟裡的幾萬張照片,能直接接上來嗎?
目前不能,只能透過網頁或 API 上傳,掃描既有檔案的功能仍在規劃中。
可以只給特定的人看嗎?
有隱藏相簿功能,不在裡面的照片預設公開。嚴謹的做法是在反向代理加一層認證,再開放對外。
iPhone 的 Live Photo 上傳後會被拆開嗎?
HEIC 與 MOV 檔名相同就自動配對,網頁上照樣能播放動態版本,不會只剩靜態圖。
MIT 授權,原始碼與文件齊全。作者 Timothy Yin(GitHub 帳號 HoshinoSuzumi),專案建立於 2025-08-21,一年後的今天約 1,909 顆星、136 個 fork。文件站在 chronoframe.bh8.ga,示範站 lens.bh8.ga 就是作者自己的相簿,另有 Discord 社群。介面提供六種語言,繁體台灣版 953 個語系鍵全數完成,對中文站長來說是開箱即用。