1.9 GB 的 VPS 也跑得動 Odoo 19,前提是先決定它不是正式機

在 1 vCPU、1.9 GB 的 VPS 上架 Odoo 19 Community:記憶體護欄、公開機必關的設定、三個文件沒寫清楚的地方,以及這台機器會輸的地方。

1.9 GB 的 VPS 也跑得動 Odoo 19,前提是先決定它不是正式機

我在一台 1 vCPU、1.9 GB RAM 的 Vultr VPS 上架了 Odoo 19 Community。那台機器本來就在跑 Ghost 部落格、一個 Node 服務和一個通知服務,我沒有另開新機。

架起來之後,Odoo 容器吃 85 MB,PostgreSQL 吃 71 MB,系統可用記憶體從 1,202 MB 掉到 1,068 MB。同機的其他服務全部正常。

這個數字很好看,但它有一個前提要先講清楚:那是空資料庫、還沒裝任何業務模組時的數字。它證明的是「這台機器可以當練習與開發環境」,不是「這台機器可以撐一家公司的 ERP」。這篇記錄的是前者。

從本機沙盒搬到 VPS

Odoo 官方 image 在筆電上跑沒有問題,我一開始也是在本機起了一個 Odoo 19 + PostgreSQL 16 的沙盒。後來改放到 VPS,給它一個有網址、有 HTTPS、之後可以再加其他使用者一起測流程和 API 的環境。

記憶體護欄:先決定誰可以被犧牲

在共用機器上跑 Odoo,最怕的不是 Odoo 慢,是 Odoo 吃光記憶體把同機的部落格拖下水。所以我先用 Docker Compose 的 override 把上限鎖死:

services:
  web:
    ports: !override
      - "127.0.0.1:8069:8069"
    mem_limit: 768m
    memswap_limit: 1536m
  db:
    mem_limit: 256m
    memswap_limit: 512m
    command: ["postgres", "-c", "shared_buffers=64MB", "-c", "max_connections=40"]

Odoo 加 PostgreSQL 的 RAM 合計鎖在 1 GB 內(另外各自允許用到一些 swap)。撞到上限時,先被限制的是 Odoo 自己的容器,這降低了拖垮同機 Ghost 的機率,但不是保證:主機整體記憶體不夠時,其他程序一樣有風險。我的取捨是寧可 Odoo 掛掉重啟,也盡量不要整台機器一起卡死。

Odoo 這邊用 workers = 0(threaded 模式)。多 worker 模式在大機器上效能比較好,但每個 worker 都是獨立進程,記憶體會一份一份疊上去。所以在這台小機器上我選了 threaded,websocket 也由 8069 同一個進程處理:nginx 的 /websocket 一樣要帶 Upgrade header,但指回 8069 就好,不用另外開 8072。

公開機一定要關的三個設定

Odoo 預設是給內網用的。放到公網上,至少要改這幾個:

list_db = False
dbfilter = ^odoo$
proxy_mode = True

list_db = False 關掉資料庫清單與 database manager,不然任何人都能看到你有哪些 DB,還能對 manager 頁面試 master password。dbfilter 鎖定只服務一個 DB。proxy_mode 讓 Odoo 信任 nginx 傳來的 X-Forwarded-*,不然重導向網址和使用者 IP 都會錯。容器只綁 127.0.0.1,對外一律經 nginx + Let's Encrypt。

master password 用 openssl 隨機產生,寫在主機上權限 600 的檔案裡,不進 repo。

三個文件沒寫清楚的地方

登入帳號不是 email。 我在偏好設定把管理員 email 改了,登入還是要用舊帳號。Odoo 的登入帳號是 res_users.login,跟偏好設定裡的 email 是兩個欄位。要改登入,得改使用者表單上的「登入」欄。

在容器裡直接跑 odoo 指令,DB 參數要自己帶。 官方 image 的 entrypoint 會幫你接好 PostgreSQL,但 docker compose exec web odoo ... 繞過了 entrypoint,要手動加 --db_host=db --db_user=odoo --db_password=odoo,不然會連不到資料庫。

Odoo 19 預設不載 demo data。 舊教學寫的 --without-demo=all 在 19 版不是正確寫法,參數改成布林值。我照舊版寫法下參數,結果不如預期;查 19 版的說明才發現參數格式改了。

這台機器會輸的地方

我沒有在這台機器上量過真實負載。裝了銷售、庫存、會計,幾個人同時開報價單、跑排程、印 PDF 之後,768 MB 夠不夠,我不知道。我的判斷是:開發與展示夠用,正式營運不該放在跟部落格共用的 1 vCPU 機器上。

備案已經想好:Vultr 可以原地升級到 2 vCPU / 4 GB,IP 不變,DNS 不用動。正式客戶的環境則會走 Odoo 官方雲端(Odoo.sh)或客戶自己的主機,依需求決定。

小機器跑 Odoo 的重點不是調出最低記憶體,而是把邊界畫清楚:哪些服務可以被犧牲、哪些數字只代表空機、什麼時候該換機器。


千葉熊工作室提供 Odoo 導入與客製開發,從需求盤點、模組客製到上線後維運:www.chiba.tw/odoo/

我是江中喬,專注於 AI Agent Architecture、Memory Governance 與 Cognitive Diversity,持續研究如何打造能夠長期協作、可信任且可治理的 AI 系統。