iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
Odoo

Odoo 部署策略系列 第 8

從網路設計到 docker-compose:搭建 odoo 反向代理的第一步

  • 分享至 

  • xImage
  •  

什麼是反向代理(Reverse Proxy)?

反向代理是一種伺服器,它位於客戶端與應用伺服器(z.B. odoo)之間,負責將客戶端的請求轉發到內部的應用伺服器,並將應用伺服器的回應返回給客戶端。這樣的設計提供了一層額外的間接層,使得應用伺服器本身不直接暴露給客戶端。

在我們的案例中,Nginx 作為反向代理,它會接收來自瀏覽器或 API 客戶端的請求,然後將這些請求轉發給運行 odoo 的內部容器。

為什麼要使用反向代理?

使用反向代理的原因有很多,尤其在多層應用部署中:

  1. 安全性提升

    • 將內部的 odoo 伺服器隱藏在反向代理背後,避免直接暴露 odoo 伺服器的真實 IP 和埠口,減少潛在的攻擊面。
  2. 負載均衡

    • Nginx 可以充當負載均衡器,將多個後端 odoo 伺服器的請求進行分配,從而提高伺服器的可擴展性和穩定性(但我們不會用到)。
  3. SSL/TLS 加密

    • 反向代理可以集中處理 SSL/TLS 加密,為 odoo 提供 HTTPS 支援,避免讓每個 odoo 容器自行處理憑證。
  4. HTTP Request 管理

    • 透過 Nginx 可以對請求進行過濾、路由、重寫 URL 或限流,提供更多靈活的控制和流量管理功能。

docker-compose 設定

我們直接來看看加上 reverse-proxy 後的 docker-compose 設定吧。這個設定檔已經是放在 WebApp-Deployment 中,因此部分路徑與上一章有些不同,大致的檔案結構可以參考第二章:模組、整合與部署:三層 Git Repo 結構的設計思考

services:
  reverse-proxy:
    image: nginx:1.27-alpine  # 使用 Nginx 1.27 的輕量化 Image
    restart: always  # 如果容器崩潰,會自動重啟
    ports:
      - "80:80"  # 將主機的 HTTP 端口 80 映射到容器的 80 端口
      - "443:443"  # 將主機的 HTTPS 端口 443 映射到容器的 443 端口
    volumes:
      - ./reverse-proxy/nginx.conf:/etc/nginx/nginx.conf  # 掛載主機的 Nginx 主設定檔
      - ./reverse-proxy/conf.d:/etc/nginx/conf.d  # 掛載其他 Nginx 設定檔,如虛擬主機配置
      - ./config/certs:/etc/nginx/certs  # 掛載 SSL/TLS 憑證,後面會特別有一章講怎麼處理敏感的設定
      - ./reverse-proxy/html:/usr/share/nginx/html  # 掛載自訂的錯誤頁面
    networks:
      - dev-net  # 使用 `dev-net` 網路來與 odoo 通訊

  postgresql-dev:
    image: postgres:16.4
    restart: always
    networks:
      - dev-net  # 使用 `dev-net` 網路,與 odoo 容器進行通訊
    env_file:
      - ./config/dev.env  # 掛載環境變數文件,後面會特別有一章講怎麼處理敏感的設定
    volumes:
      - db-dev-data:/var/lib/postgresql/data

  odoo-dev:
    build: ./odoo-dev/source  # 從指定的 odoo 原始碼目錄構建 odoo 的 Docker 映像
    restart: always 
    depends_on:
      - postgresql-dev  # 依賴於 PostgreSQL 資料庫,確保在 odoo 啟動前,資料庫已啟動
    networks:
      - dev-net
    env_file:
      - ./config/dev.env  # 掛載環境變數文件,設定 odoo 的連線資料
    volumes:
      - odoo-dev-data:/var/lib/odoo  # 將 odoo 的數據持久化存放在名為 `odoo-dev-data` 的 volume 中

由於篇幅所限這裡僅展示了 odoo-dev 的設定,但基本上 odoo-prod 也會使用相似的設定。

跟上一章最大的差別除了加入了 reverse-proxy 的設定,還有我們把 odoo-dev 跟主機的埠口映射拿掉了,會改由 Nginx 映射出來的 80/443 埠口處理用戶請求,並把跟 odoo-dev 有關的內容透過內部的 dev-net 轉發給 odoo container。


講完 docker-compose 的設定後,為了避免大家對 Docker 和網路不熟悉導致設定看得頭昏眼花,先幫大家畫了一下網路拓樸圖,架構包含兩個獨立的網路:dev-netprod-net,分別負責開發環境與生產環境的網路隔離。reverse-proxy 服務作為主要的入口,透過不同的網域將流量轉發至內部的 odoo 開發環境與生產環境。每個服務都有自己專屬的內部 IP 位址,並透過 Docker 的 DNS (127.0.0.11) 來進行內部解析。
https://ithelp.ithome.com.tw/upload/images/20240922/20168935as5fXvlxuo.jpg

  • postgresql-devodoo-dev:這兩個服務運行在 dev-net,並透過內部網路進行資料庫連接和應用處理。
  • postgresql-prododoo-prod:這是生產環境的服務,位於 prod-net,彼此進行資料庫與應用系統的交互。
  • reverse-proxy:同時連接 dev-netprod-net,負責處理外部請求,並根據不同的網域名稱將流量轉發到對應的 Odoo 容器。

至於 network bridge 怎麼把 reverse-proxy forward 到 host,這部分會根據 host OS 的不同有所差別,但總之 Docker 會幫你處理好,我就先不深入了。


下一篇文章將會專注於 nginx.conf 的詳細設定,我們會介紹如何設定 Nginx 作為反向代理,並確保所有的 HTTP 請求都能正確地重定向到 HTTPS,保護流量的安全。


上一篇
docker-compose 入門:同步啟動 odoo 與 PostgreSQL
下一篇
為 odoo 建立 Nginx 反向代理第二步:nginx.conf 設定實作
系列文
Odoo 部署策略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言