我目前在部署 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 的问题?谢谢!

1 个回答

0

Nil

iT邦新手 5 级 ‧ 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"

  • 4

看更多先前的...收起先前的...

cashrain

iT邦新手 5 级 ‧
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邦新手 5 级 ‧
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邦新手 5 级 ‧
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邦新手 5 级 ‧
2025-03-10 09:59:16

感谢回覆!
我后来是使用cloudflare tunnel来解决被强制绑定到127.0.0.1这个问题,直接透过tunnel将外部流量引到127.0.0.1,这样外网一样可以连

修改