我目前在部署 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 的問題?謝謝!
啟動容器的時候有沒有做 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"
所有設定都是正確的。
我在 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
我已經確認我的配置檔和 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
我快吐血了
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
感謝回覆!
我後來是使用cloudflare tunnel來解決被強制綁定到127.0.0.1這個問題,直接透過tunnel將外部流量引到127.0.0.1,這樣外網一樣可以連