iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
Odoo

Odoo 部署策略系列 第 23

勘誤:Timeout 設定與資料庫自動初始化邏輯修正

  • 分享至 

  • xImage
  •  

今天要來勘誤之前做錯的部分,今天深處研究時才 root cause 的,原本還在想要不要寫這篇,還是直接回去之前的文章改掉,但一來懶得回去修正,二來這樣今天就沒內容了,就當作 writeup 呈現給大家。


Timeout 設定的勘誤

在我的部屬環境上操作 odoo 時,經常出現網頁提示斷線,幾秒後又恢復正常。觀察開發者工具後,發現有些連線會在 1 秒時報 500 錯誤。

https://ithelp.ithome.com.tw/upload/images/20241016/20168935Vq8bC0MpRd.png

回想一開始設定反向代理時,為了讓後端 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:15docker run -p 8069:8069 --name odoo --link db:db -t odoo,也就是說,在建立資料庫時,設定 POSTGRES_DB=postgres 是必要的步驟。(更多詳情可參考 odoo issue #182551#27447

最後,我發現只要建立好名為「postgres」的資料庫,並在 odoo.conf 中設定資料庫名稱,odoo 就會用跟我們原本的方式一樣效果的自動初始化資料庫。於是,我撤銷了 entrypoint.sh 中所有關於自動建立資料庫的內容。


上一篇
odoo LiveChat 實時更新:使用 Nginx 反向代理處理 WebSocket
下一篇
(重新)自動化 odoo 設定:用 Python 腳本完成資料庫初始化
系列文
Odoo 部署策略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言