使用 nginx + certbot 快速將 ssl 整合進自架的 http 網站 (with docker composer)
近期想搞一個用來管理圖片的服務,找到了 immich 這款 self hosted 的圖片管理工具,在 localhost 試用了一小段時間,感覺很不錯,不管是 UI 還是搜尋功能都沒得挑剔,唯一可惜的是搜尋功能沒有整合 OCR。
直到當我想把他放上雲端,方便從外網存取時,才發現一個大問題,這個通過 docker compose 架起來的 server,只支援 http,雪特,這樣我不敢登入 server 的 web 介面耶…,於是開始了這工具的 https 升級之旅。
雖然這是我設定 immich 的記錄,但大部分的 http server 應該都管用。
事前評估
首先做個整理,方便收斂出實際的做法
手上的資源
- 從 gandi 購買,目前由 cloudflare DNS 託管的 domain - sakana.tw。
取得憑證的幾個方法
- 跟 gandi 買萬用憑證,人工塞憑證到 server 上:太貴了
- 從 cloudflare 抓萬用憑證,人工塞憑證到 server 上:可行
- 從 lets encrypt 申請憑證,網路上有一堆自動化更新憑證的教學資源:可行
將 http 的 server 升級成 https
- 掛一個 nginx,將收到的 https 流量導向 http 的 immich server。
要解決 mitm 的問題,這應該算是最簡單的解法,
- 掛一個 nginx,將收到的 https 流量導向 http 的 immich server。
作法簡介
最後我決定試試自動化更新憑證的方式,做法如下
- 掛 nginx
- immich server 的 docker-compose.yml 加入 nginx
- nginx.conf 設定將 https 導向 immich server
- 掛 certbot 自動跟 lets encrypt 申請憑證
- 掛載 share volume 指向 nginx 的 ssl 資料夾以及 certbot 產生憑證的資料夾
- 開始下指令抓憑證下來
步驟
準備 DNS record
這部分每個人應略有不同,個人是使用 cloudflare DNS 託管服務
於 cloudflare DNS 頁面設定 immich.sakana.tw 的 A record 為雲端主機的 ip 即可。
準備相關設定檔
將 nginx 以及 certbot 加入至 ./docker-compose.yml
中
1 | # Definition of immich compoents |
設定 nginx.conf
1 | user nginx; |
執行指令
Step 1: 執行以下指令
1 | # 更新、下載 image |
Step 2: 調整 nginx 設定並重啟服務
1 | # 調整 nginx 設定,將原先註解掉的 https 設定取消註解 |
至此完成 immich 的 https 服務設定了,可喜可賀。
參考資料
- HTTPS using Nginx and Let’s encrypt in Docker
- 基本上是參考這一篇設定的
- Docker 一分鐘完成自動更新 SSL 証書的 nginx-proxy 設置
- 這篇的設定感覺稍微複雜了一點,而且 nginx-proxy 這工具我沒搞很懂,就沒仔細看了。
Comment
GiscusDisqus