iT邦幫忙

1

Postal Mail Server Docker 部署問題:Puma 綁定在 127.0.0.1 而無法透過 0.0.0.0 存取

  • 分享至 

  • xImage

我目前在部署 Postal Mail Server (版本 3.3.4) 時遇到一個奇怪的問題。我是透過 Docker Compose 來啟動 Postal,目的是讓 web 介面在主機的 5000 埠上能夠存取。但實際上,我在容器內部看到 Puma 始終綁定在 127.0.0.1:5000,而不是 0.0.0.0:5000,導致從主機或網路上無法連線到 Postal 的 web 介面,搞了好幾天都還是沒進展,再加上我對網路it這方面知識量非常少,所以用GPT幫我描述了現在的狀況跟問題,有什麼不清楚或是講錯的請各位不吝指教!

目前狀況:
1.配置檔(/opt/postal/config/postal.yml)

version: 2

web:
  bind: "0.0.0.0:5000"
  protocol: http

postal:
  web_hostname: ounimart.net
  web_protocol: https
  smtp_hostname: ounimart.net

# 其他設定略…

2.Docker Compose 配置(/opt/postal/docker-compose.yml):
我已經正確掛載本機的 /opt/postal/config 到容器內的 /config,並映射主機 5000 埠到容器的 5000 埠。嘗試過多種方式指定啟動命令與環境變數,例如:

entrypoint: ["postal"]
command: ["web-server", "--bind=0.0.0.0:5000", "--config", "/config/postal.yml"]

也試過用環境變數 POSTAL_ROLE、WEB_BIND 等,但最終容器內部日誌都顯示Listening on http://127.0.0.1:5000

3.防火牆設定:
sudo ufw allow 5000/tcp 開啟主機 5000 埠,但依然無法存取該介面

4.容器內部測試:
在容器內執行 curl http://127.0.0.1:5000 沒有回應。
從主機使用 curl http://192.168.100.3:5000 也無法連線。

總結來說,無論如何嘗試,Postal 的 Puma 仍舊以預設 127.0.0.1 綁定,導致我無法透過主機 IP 或 0.0.0.0 存取 Web 介面。
請問大家有遇過類似問題嗎?或者有什麼解法可以解決這個 Docker 部署中 Postal 無法正確綁定到 0.0.0.0 的問題?謝謝!

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
Nil
iT邦新手 4 級 ‧ 2025-03-07 09:10:05

啟動容器的時候有沒有做 Port 映射

例如
docker run

docker run -d -p 5000:5000 {image_name}:latest

docker compose up -d

services:
  {container_name}:
    image: {image_name}:latest
    container_name: {container_name}
    ports:
      - "5000:5000"
看更多先前的回應...收起先前的回應...
cashrain iT邦新手 4 級 ‧ 2025-03-07 10:54:38 檢舉

所有設定都是正確的。
我在 docker-compose.yml 中確保了 Postal Web 容器的端口映射("5000:5000")和環境變數都設定為 0.0.0.0:5000,而且郵件配置檔(postal.yml)中的 web.bind 也設成 0.0.0.0:5000。
從 docker ps 輸出可以看到主機的 5000 埠正轉發到容器內的 5000 埠,但 docker-compose logs postal-web 卻顯示 Puma 正在監聽 127.0.0.1:5000。
附上我的配置:

docker-compose.yml

services:
  postal-web:
    image: ghcr.io/postalserver/postal:3.3.4
    ports:
      - "5000:5000"
    volumes:
      - type: bind
        source: /opt/postal/config
        target: /config
        bind:
          create_host_path: true
    depends_on:
      - postal-mariadb
    environment:
      POSTAL_WEB_BIND: "0.0.0.0:5000"
      WEB_BIND: "0.0.0.0:5000"
    entrypoint: ["postal"]
    command: ["web-server","--config", "/config/postal.yml"]

還有postal.yml

web:
  bind: "0.0.0.0:5000"
  protocol: http
cashrain iT邦新手 4 級 ‧ 2025-03-07 11:15:12 檢舉

我已經確認我的配置檔和 docker-compose.yml 都是正確的,都設置了 0.0.0.0:5000,而且掛載路徑也正確(/opt/postal/config 掛載到 /config)。但我做了臨時測試,直接用命令行啟動 Postal 容器

docker run -it --rm -p 5000:5000 -v /opt/postal/config:/config ghcr.io/postalserver/postal:3.3.4 postal web-server --config /config/postal.yml

但容器日誌卻顯示 Puma 正在監聽 http://127.0.0.1:5000
我快吐血了

Nil iT邦新手 4 級 ‧ 2025-03-08 01:55:17 檢舉

Hi 我剛剛去用了你的設定做了一次,確實會沒辦法更換監聽的位置

我去翻了 /app/config/puma.rb 裡面有一段是 address 與 port 的環境變數

bind_address  = ENV.fetch("BIND_ADDRESS", Postal::Config.web_server.default_bind_address)
bind_port     = ENV.fetch("PORT", Postal::Config.web_server.default_port)

於是我去對 docker-compose 去配置 env 再將服務重新啟動

services:
  postal-web:
    image: ghcr.io/postalserver/postal:3.3.4
    ports:
      - "5000:5000"
    environment:
      # ...
      BIND_ADDRESS: 0.0.0.0
      PORT: 5000

Log

docker-postal-web-1  | No secret key was specified in the Postal config file. Using one for just this session
docker-postal-web-1  | * Listening on http://0.0.0.0:5000
docker-postal-web-1  | Use Ctrl-C to stop
docker-postal-web-1  | 172.18.0.1 - - [07/Mar/2025:17:51:16 +0000] "GET / HTTP/1.1" 403 - 0.0005
cashrain iT邦新手 4 級 ‧ 2025-03-10 09:59:16 檢舉

感謝回覆!
我後來是使用cloudflare tunnel來解決被強制綁定到127.0.0.1這個問題,直接透過tunnel將外部流量引到127.0.0.1,這樣外網一樣可以連

我要發表回答

立即登入回答