Posts

使用 Google Photos 當作圖床

引子

撰寫部落格,沒有圖床怎麼行呢?

目前本站搭建在 Vultr 提供的 VPS 服務上。 基本方案下,這台主機有 25GB 的 SSD 可供使用。 雖然目前可用空間還有 14 GB , 但是時候先想好圖片的儲存方案了, 總不能一直把圖片往這部主機塞。

好在目前我的手機是 PIXEL 5, 享有無限量上傳的 Google Photos 服務。 所以只要能夠接受一點點壓縮圖片的代價, 無限空間的圖床理論上是沒問題。

動手開工

目前部落格的各個頁面是用 Hugo 搭建的。 在每則文章的 markdown 檔案中, 可以使用絕對路徑或相對路徑來指定圖片連結。例如:

![](https://topo.tw/photos/foo.jpg)
![](../../photos/foo.jpg)

但不管怎樣,都要讓 VPS 先有一個 /photos/ 的 path 來提供圖片。 因此,我們會需要有一個圖片的專屬目錄供 Nginx 使用。

要如何把 Google Photos API 轉換為可掛載到檔案系統的目錄呢? 嘿嘿,要把各種雲端儲存服務掛載到檔案系統, 早就有大名鼎鼎的 rclone 可供使用啦。

設定

網路上有關 rclone 的教學資源相當豐富, 官方也有提供 docker image,所以這邊我就不多作贅述了。 只把目前情境下需要的設定紀錄下來:

IMAGE=rclone/rclone:1.58.0

# 使用 docker 執行 rclone
# 進入 config 模式
docker run \
    --rm -it \
    --name rclone \
    --user `id -u`:`id -g` \
    --volume ~/.config/rclone:/config/rclone \
    --volume ~/rclone:/data \
    --network host \
    $IMAGE \
    config
    
# 依照提示,新增一個指向 Google Photos 的 Remote
# 大部分的設定使用預設選項即可
...
    
# 掛載相關的 Remote 到目錄 ~/data/photos/
# 為了不要在檔案權限上太花時間,這邊我們把 /etc/passwd 和 /etc/group 傳進去
# 讓 docker container 內的使用者和目前使用者一模一樣
mkdir -p ~/data/photos
docker run \
    --name rclone \
    --rm --detach \
    --user `id -u`:`id -g` \
    --volume ~/.config/rclone:/config/rclone \
    --volume ~/data:/data:shared \
    --volume /etc/passwd:/etc/passwd:ro --volume /etc/group:/etc/group:ro \
    --device /dev/fuse --cap-add SYS_ADMIN --security-opt apparmor:unconfined \
    $IMAGE \
    mount photos:media/by-day /data/photos --gphotos-read-size --allow-other

值得注意的是:預設情況下,掛載的目錄只可以顯示檔名而無法取得圖片內容

根據官方文件1,這是因為讀取圖片需要知道圖片的 size, 而用 Google Photos API 取得 size 需要額外的 transaction , 會大大拖慢同步的速度。

不過因為我們的目的就是要取得圖片內容,因此參數需要加上 gphotos-read-size。 執行指令後,我們就完成掛載啦。

Google Photos 類型的目錄下有不同的圖片分類方式: 例如 all/, by-year/, by-month/, by-day/等。

因為我們僅掛載 media/by-day,所以目錄結構會長這樣:

~/data/photos/2022
├── 2022-01-01
│   ├── PXL_20220101_055706343.jpg
│   ├── PXL_20220101_060221557.jpg
│   ├── PXL_20220101_060725049.jpg
│   ├── PXL_20220101_064911561.jpg
│   └── PXL_20220101_065919363.MP.jpg

接著,就只要把 Nginx 調整好就完成圖床服務啦!

為 Mutt 加上側邊欄

去年因為某 YouTuber 的慫恿,我便開始學習在 VPS 上自架郵件伺服器,並用自己的域名來收信。 從以前就一直在用的 Gmail 信箱雖然沒有停用,不過目前我在網路上新註冊的服務都是使用[email protected]格式的信箱來收發信件。

身為 tig 的重度用戶,在終端中用鍵盤操作一行行 record 已經成為習慣了。當初就想:「不如收發信件也比照辦理吧!」。 透過 IMAP 協定,在 PC 上我通常使用 Mutt 這個 TUI 軟體來收發信件。 雖然整個流程建立好了,但 Mutt 的預設介面始終沒有像網頁版的 Gmail 一樣稱手。 導致收信時一直都覺很麻煩,連帶影響打開它收信的意願。

前幾天想想不能再這樣下去了,於是開始翻找手冊改進 muttrc 。 讀了一會後,才想到原來是少了側邊欄啊! 難怪在切換不同郵箱時都覺得非常不便利。


開始抄作業

使用 Arch Linux 預設的 pacman 安裝 Mutt 後,有關側邊欄的設定建議可以在
/usr/share/doc/mutt/samples/sample.muttrc-sidebar 中找到。 有了這份指引,要弄出一份堪用的設定就簡單多啦!

經過一番摸索,我的 muttrc 裡面,有關側邊欄的設定如下:

# 打開sidebar
set sidebar_visible = yes

# 選定要追蹤的郵箱,'+'號開頭的字串就被用作分隔線啦
mailboxes =INBOX =mbox "+---------- Watch ----------" =pay =osm =keep "+-------- Processed --------" =Sent =Trash =Drafts

# 讓Mutt取得未讀郵件和總郵件數量
set mail_check_stats

# 郵箱的顯示格式,直接照抄sample文件即可
set sidebar_format = '%B%?F? [%F]?%* %?N?%N/?%S'
set sidebar_short_path = yes

# 綁定快捷鍵,用來切換側邊欄顯示,並選擇郵箱
bind index,pager B sidebar-toggle-visible
bind index,pager \Cp sidebar-prev
bind index,pager \Cn sidebar-next
bind index,pager \Co sidebar-open
bind index,pager <F5> sidebar-prev-new
bind index,pager <F6> sidebar-next-new

# 其它顏色設定
color indicator cyan black
color sidebar_highlight white color8
color sidebar_divider color8 black
color sidebar_flagged red black
color sidebar_new green black

成果如下:

可以看到,若郵箱中含有 important 這類 flag 的郵件,在側邊欄中還會順道標示數量,實用度大增。

接下來嘛,就是養成在 Mutt 收發郵件的習慣。 一邊使用一邊讀手冊,慢慢把 muttrc 改進囉! 我的整份 muttrc 放在 Github , 其中還修改了不少預設的快捷鍵以配合我過去使用 Gmail 的習慣。

home | top | RSS