sujingjhong.com


除錯日記#3 ONLYOFFICE + NodeJS

這兩天都在和 onlyoffice 奮鬥,簡單介紹 onlyoffice 是一款開放原始碼版 Office,它提供 Word, Excel, PowerPoint 等替代版,並且是支援線上協作的。

所以更正一下,應該是開放原始碼版的 Office 365。

如果要安裝社群版的 onlyoffice 可以參考以下網址:

它有提供 docker 版本,所以本篇介紹就是我怎麼把這個 docker 版拉起來的血淚。

一開始先用 docker compose 版 ,他會需要 postgres+rabbitmq。

拉起來後輸入歡迎頁面的 Testing before integration 底下這行測試用,每個人應該都不太一樣。

docker exec 5156f486155f sudo supervisorctl start ds:example

輸入完就可以點 GO TO TEST EXAMPLE,會很興奮地看到下一頁:

再來點選左上方的,就會:

經典的 Download failed 出現了,關掉後就回到列表頁。

在網路上搜尋這個錯誤訊息,會看到一堆提問 。官方文件也有提到,它只有輕描淡寫提到:

The “Download failed” message is displayed at the editors loading process. The Document editing service cannot upload the file for editing. Check if the link to the file specified in the document.url  is correct. The link must be accessible from the document editing service.

OK,我知道他不能上傳到伺服器,所以?另一個提問則是,我是用官方範例架起來,為何還有這錯誤訊息?為什麼?

探尋過程就不多著墨,這裡直接講結論。我後來是用 docker 版架起來測試

docker run -it -d -p 8888:80 --restart=always -e JWT_SECRET=my_jwt_secret onlyoffice/documentserver

再搭配他的 example server,另外這裡說一下,這連結裡面的範例是可行的但另一個完整 Github repo 拉起來會和你說少檔案,為何範例檔案會少檔案?沒關係,我也不想探討了。

接著在 step 2 他會和你說要去 config/default.json 設定編輯器伺服器(siteUrl)位置,以及檔案儲存位置(storageFolder/storagePath),但它文件和範例還漏說明了一個很重要參數: exampleUrl

設定錯誤的附帶症狀會是:

  • File download failed
  • ECONNREFUSED

接著你翻遍文件和討論區依然找不到所以然,拉起來服務依然會給你跳上面的問題。

我最後是由他的 docker log 看出端倪,簡單而言他的架構和參數互動是這樣的:

sequenceDiagram
	server->>documentServer: siteUrl
	documentServer->>server: exampleUrl

設定上:

  • siteUrl 要從剛剛那個 NodeJS 伺服器角度去看,他要怎麼連線到 documentServer。這裡是「前端」要麼連線到 documentServer。
  • exampleUrl 要從 documentServer,就是剛剛那台用 docker 拉起來的服務,要從他的角度看,要怎麼連線到 NodeJS 伺服器的「後端」。

這就取決於你的網路架構,所以像是我是用 WSL2 架設測試,可以在 server「前端」用 localhost 連線到 documentServer,我後來就是設定 localhost:8888

但 documentServer 因為在 wsl2 的 docker 內,所以要先找到他本地端的 docker ip 為何,再設定位置。比方說最後我的內網 NodeJS server 位置是 172.26.141.114:3000,最後參考設定就是:

siteUrl: http://localhost:8888/
exampleUrl: http://172.26.141.114:3000

順帶一提,在他的範例伺服器裡面,它組網址路徑相當簡單,就是兩個字串相加,所以 siteUrl 會需要尾斜線(trailing slash):但是呢,在 documentServer 看起來組網址方式又不一樣,如果送尾斜線進去,它會有雙斜線(double slash)問題。

最後為何那個明明是回呼函式網址要叫做 exampleUrl 呢?我猜很單純是因為他是範例伺服器,所以很直覺地用 exampleUrl