如何使用 JuiceFS 建立 WebDAV 共享

JuiceFS發表於2023-02-01

WebDAV 是一種基於 HTTP 的檔案共享協議,最初被設計用於多使用者文件協作編輯的場景,也被廣泛應用在基於網際網路的檔案儲存、資料同步等網盤類應用場景。

手機端和 PC 端有大量的應用內建了對 WebDAV 的支援,比如知名的文獻管理工具 Zotero、iPad 上流行的筆記工具 Notability、國產辦公軟體 WPS、跨平臺 Markdown 筆記工具 Joplin、ES 檔案管理器等等,這就意味著,只要擁有自己的 WebDAV 儲存,就可以使用 WebDAV 來儲存我們在這些軟體上產生的文件資料。

為了避免混淆,有必要先釐清 WebDAV 相關的概念,如下圖所示,WebDAV 分為伺服器和客戶端兩個部分:

  • WebDAV 伺服器:藍色雲朵代表 WebDAV 伺服器,用來響應客戶端的連線和讀寫請求,儲存資料。
  • WebDAV 客戶端:各種內建了 WebDAV 客戶端的程式,執行在手機、平板或電腦中。

明白了 WebDAV 的架構組成,我們要做的就是配置一套屬於自己的 WebDAV 伺服器了,其實我們也可以把它叫做 WebDAV 共享,總之,我們要做的就是架構圖中“藍色雲朵”的部分。

在過去,配置 WebDAV 共享通常要使用 Apache HTTP 服務或 Nginx 等 Web 伺服器軟體,由於不是開箱即用,需要額外載入或手動編譯 WebDAV 模組,這在一定程度上增加了配置 WebDAV 的複雜度。

雖然一些 NAS 作業系統也會提供 WebDAV 共享配置功能,但受限於內網環境,配置的 WebDAV 共享難以發揮它基於網際網路提供服務的優勢。

如果你目前正在尋找更通用、更有效、更簡單的 WebDAV 共享服務配置方案,JuiceFS 也許是你值得嘗試的一種方案。

JuiceFS 是面向雲的開源分散式檔案系統,依託於物件儲存和資料庫,可以快速搭建一個具有彈性容量的高效能儲存系統。JuiceFS 提供 POSIX、S3 API、HDFS API、Kubernetes CSI 驅動、Docker Volume Plugin、WebDAV 等豐富的訪問介面,可以輕鬆接入各種應用。

接下來就為大家分享如何使用 JuiceFS 簡單、快速的配置一個兼具空間彈性、安全性和實用性的 WebDAV 服務。

準備工作

本文介紹的 WebDAV 共享是 JuiceFS 提供的一種訪問介面,是建立在 JuiceFS 檔案系統之上的。因此在配置之前,需要先建立一個 JuiceFS 檔案系統。

JuiceFS 檔案系統由資料儲存和後設資料引擎兩部分組成,其中,資料儲存可以是各種雲端計算平臺提供的物件儲存服務,也可以是自建的 MinIO 或本地磁碟。後設資料引擎用來儲存檔案的後設資料資訊,可以使用 Redis、MySQL、PostgreSQL 等基於網路的資料庫,也可以使用 SQLite 或 BadgerDB 這種單機資料庫。

為了讓 WebDAV 共享能夠透過網際網路訪問,接下來我們會在一臺擁有固定公網 IPv4 地址的雲伺服器上進行建立。因為 WebDAV 是一處建立,即可透過 IP 地址或域名實現處處訪問。因此,組成 JuiceFS 的資料儲存和後設資料引擎可以更加靈活的搭配,比如:

  1. 本地磁碟 + 單機資料庫:當雲伺服器的本地磁碟可用空間足夠時。
  2. 物件儲存 + 單機資料庫:需要更大容量儲存空間時。
  3. 物件儲存 + 網路資料庫:既需要更大的儲存空間,又有其他主機需要同時訪問 JuiceFS 時。

雲伺服器

假設我們擁有一臺配置如下的雲服務:

  • 系統:Ubuntu Server 22.04 AMD64
  • CPU:1 核
  • 記憶體:1 GB
  • 硬碟:25 GB
  • IP 地址:120.118.8.10(此為演示目的隨機編寫的 FAKE IP)

對於本文介紹的場景,任意一個雲平臺的入門級的雲伺服器即可滿足需要,重點在於要有公網 IPv4 地址。

物件儲存

假設我們準備了以下 Bucket:

對於本文介紹的場景,物件儲存並不是必須的,如果雲伺服器的硬碟空間足夠,完全可以使用硬碟作為 JuiceFS 的物件儲存來使用。

資料庫

對於本文介紹的場景,單機版資料庫是最為簡單易行的選擇,這裡我們使用單檔案 SQLite 資料庫。無需提前準備,在建立 JuiceFS 檔案系統時會自動生成。

如果有需要,你也可以參照文件《如何設定後設資料引擎》使用其他型別的資料庫。

建立 JuiceFS 檔案系統

  1. 安裝客戶端
curl -sSL https://d.juicefs.com/install | sh -
  1. 建立檔案系統

以下是建立檔案系統的兩種方式,根據實際需要任選一種即可:

方式一:使用本地硬碟作為物件儲存

juicefs format sqlite3://myjfs.db myjfs

方式二:使用物件儲存服務(資料儲存在物件儲存)

juicefs format --storage oss \
--bucket https://myjfs.oss-cn-shanghai.aliyuncs.com \
--access-key abcdefg \
--secret-key gfedcba \
sqlite3://myjfs.db myjfs

部署 WebDAV 服務

準備好 JuiceFS 檔案系統就可以開始配置 WebDAV 共享了,最簡單的方式是不做任何設定,直接將 JuiceFS 儲存以 WebDAV 介面形式開放出去。

sudo juicefs webdav sqlite3://myjfs.db 120.118.8.10:80

使用任何內建 WebDAV 客戶端的軟體訪問 http://120.118.8.10 即可連線訪問。

雖然很方便,但不難看出這種匿名訪問的方式存在極大的安全隱患,首先,沒有身份認證使得任何知道這個 IP 地址的人都可以直接透過 WebDAV 客戶端讀寫我們的檔案;其次,使用未加密的 HTTP 協議,通訊過程很容易被竊聽和攻擊。我們非常有必要完善這兩方面的缺陷,其實也很簡單,解決第一個問題只需要為 WebDAV 設定身份認證,第二個問題只需要配置 SSL 證照啟用 HTTPS 加密連線支援。

設定身份認證

JuiceFS v1.1(截至本文發表,此版本還未正式釋出)及以上版本開始支援 WebDAV 身份認證和 SSL 證照功能,設定之前請先確認你的客戶端版本,建議參考《手動編譯 JuiceFS 客戶端》自行編譯 GitHub 倉庫的 main 分支。

為 WebDAV 設定訪問的使用者名稱和密碼非常簡單,只需設定相應的環境變數即可:

export WEBDAV_USER=user
export WEBDAV_PASSWORD=mypassword

SSL 證照

為 WebDAV 啟用 HTTPS 加密連線需要使用 SSL 證照,既可以使用 CA 機構簽發的受信任的證照,也可以使用 OpenSSL 簽發自簽名證照。

CA 機構通常只為域名簽發證照,因此你需要擁有域名並繫結到伺服器 IP,免費證照籤發工具有 certbot、acme.sh 等,使用這些工具向即可申請免費的 SSL 證照。

透過第三方 CA 證照機構申請簽發證照是另外一個話題,這裡簡單起見,使用自簽名證照來實現這個功能。

  1. 生成伺服器私鑰
openssl genrsa -out private.key 4096
  1. 生成證照籤名請求(CSR)
    這一步需要互動式的提供一系列資訊。
openssl req -new -key private.key -out client.csr
  1. 使用 CSR 簽發證照
openssl x509 -req -days 365 -in client.csr -signkey private.key -out client.crt
  1. 執行清理
rm client.csr

經過上述幾個步驟,在當前目錄中就有了 private.key 和 client.crt 這兩個檔案,接下來用它們執行 WebDAV 服務。

正式執行 WeDAV 服務

現在就可以結合上面的內容,執行帶有基本身份認證功能,且具有 HTTPS 加密連線的 WebDAV 服務:

export WEBDAV_USER=user
export WEBDAV_PASSWORD=mypassword
sudo juicefs webdav --cert-file ./client.crt --key-file ./private.key sqlite3://myjfs.db 120.118.8.10:443

此時我們已經啟用了 HTTPS 加密連線,在訪問 WebDAV 時也要改用帶有 https 的地址 https://120.118.8.10 ,同時,需要輸入使用者名稱和密碼才能成功連線。

另外,由於這裡使用的是自簽名證照,在訪問時一些客戶端可能會發出證照不可信的警告,忽略即可。

如果你已經為伺服器繫結了域名,並且已經申請到了 SSL 證照,部署 WebDAV 的命令則應該做如下調整:

export WEBDAV_USER=user
export WEBDAV_PASSWORD=mypassword
sudo juicefs webdav --cert-file ./your-domain.crt --key-file ./your-domain.key sqlite3://myjfs.db www.your-domain.com:443

相應地,訪問地址應也應該改成你的域名,例如:https://www.your-domain.com 。使用 CA 機構簽發的證照,各種 WebDAV 客戶端訪問則不會發出警告,可以有效解決部分應用無法連線 WebDAV 服務的問題。

應用示例

以 ES 檔案瀏覽器、Joplin 為例介紹如何配置使用自建的 WebDAV 服務同步文件資料。

注意:在某些應用中設定 WebDAV 時,如果確認地址和身份認證資訊輸入無誤的情況下,程式仍然報告無法連線 WebDAV,這可能是因為程式不支援自簽名證照,可以透過改用 CA 機構簽發的可信證照來配置 WebDAV 服務來解決該問題。

ES 檔案瀏覽器

ES 檔案瀏覽器是移動端常用的第三方檔案管理器,除了能夠管理手機中的檔案,還支援新增很多第三方的儲存服務,其中就包括 WebDAV 儲存。

只需在服務選單中新增 WebDAV 型別的儲存,參照下圖填寫地址、使用者名稱和密碼即可。

Joplin

Joplin 是開源的 Markdown 筆記軟體,支援使用 WebDAV 同步文件。只需在同步設定中輸入 WebDAV 的連結、使用者名稱和密碼即可。

需要注意的是,這裡我們使用的是自簽名證照,檢查同步配置時 Joplin 會因此而報錯。解決方法是展開高階選項,勾選“忽略 TLS 證照錯誤“,應用設定在嘗試檢查即可透過驗證。

寫在最後

與 FTP 類似,WebDAV 也是相對比較古老的檔案共享協議,但它們至今仍被廣泛的應用。資訊科技領域永遠沒有最好的工具,只有最合適的工具。從功能上來說,WebDAV 可能沒有專用的網盤客戶端來的功能豐富,但 WebDAV 協議更通用和開放,可以直接在大量內建支援的應用程式上使用,不但可以保護自己的隱私,還能避免被特定的平臺捆綁。

WebDAV 只是 JuiceFS 支援的眾多訪問介面中的一種,大家有興趣可以進一步探索其他訪問介面,比如以本地磁碟形式訪問的 POSIX,以 S3 API 形式訪問的 S3 閘道器,以及容器化訪問方式的 Docker Volume Plugin、Kubernetes CSI 驅動等等。靈活搭配使用這些訪問方式,可實現更加高效、靈活的雲端儲存管理能力,相關的內容我們會在後續的文章中為大家做更多的分享。

如有幫助的話歡迎關注我們專案 Juicedata/JuiceFS 喲! (0ᴗ0✿)

相關文章