今天要來勘誤之前做錯的部分,今天深處研究時才 root cause 的,原本還在想要不要寫這篇,還是直接回去之前的文章改掉,但一來懶得回去修正,二來這樣今天就沒內容了,就當作 writeup 呈現給大家。
在我的部屬環境上操作 odoo 時,經常出現網頁提示斷線,幾秒後又恢復正常。觀察開發者工具後,發現有些連線會在 1 秒時報 500 錯誤。
回想一開始設定反向代理時,為了讓後端 odoo 未啟動時使用者能快速收到 500 錯誤,我將 proxy_connect_timeout
設定為 1 秒。這導致 odoo 在處理較複雜的請求(如安裝新模組或自動建立新網頁)時,因為時間較長,直接被反向代理報 500:在某些情況下,這似乎不是問題,因為不久後使用者就會看到連線恢復且一切正常;但在某些情況下,例如生成 PDF 檔案,這個超時會在伺服器端造成問題─我測試看到的現象是,使用者點擊產出後,斷線、恢復,之後沒有任何事發生。
經過多次測試和研究 odoo 官方的建議,odoo 文件沒有設定這部分的超時時間,nginx 的預設則是 60 秒。最終我依據指南將其設定為 60 秒,這樣可確保系統有足夠時間處理連接,避免過早超時。
在之前的文章《odoo 建立一步到位:自動化資料庫初始流程》中,我們修改了 entrypoint.sh
來實現資料庫自動初始化,但這個方法有問題,因此我直接撤銷了整個實作。
今天在研究 odoo 的財會系統時,發現資料庫可以設定預設的地區和語言,特別是地區值會使某些模組載入特定的在地化資料;然而,透過 odoo CLI 初始化的方法(也就是我們自動初始化採用的方法)無法選擇這個設定(參考:Select specific Odoo country from command line),因此,最初我想將自動初始化變成可選的,既可以自動初始化資料庫,也可以停在建立資料庫的頁面讓管理員自行建立。沒想到測試時又遇到之前的 "Database not initialized" 錯誤訊息,我原以為在對齊官方的依賴套件後,這個問題已經解決,只好再次研究。
簡短的說:我發現即使沒有傳遞給 odoo 我在 PostgreSQL 容器中建立的資料庫名稱,odoo 的日誌仍會顯示該資料庫的名稱,例如:2024-10-06 15:30:47,615 1 ERROR ? odoo.modules.loading: Database odoo1234567 not initialized, you can force it with -i base
,這很奇怪,讓我朝資料庫名稱的方向研究。
最終發現,如果我使用以下兩個命令來建立官方的 odoo 容器,也會出現相同的錯誤:docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=odoo1234567 --name db postgres:15
和 docker run -p 8069:8069 --name odoo --link db:db -t odoo
,也就是說,在建立資料庫時,設定 POSTGRES_DB=postgres
是必要的步驟。(更多詳情可參考 odoo issue #182551 或 #27447)
最後,我發現只要建立好名為「postgres」的資料庫,並在 odoo.conf
中設定資料庫名稱,odoo 就會用跟我們原本的方式一樣效果的自動初始化資料庫。於是,我撤銷了 entrypoint.sh
中所有關於自動建立資料庫的內容。