我目前在部署 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
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
我去翻了 /app/config/puma.rb 里面有一段是 address 与 port 的环境变数
```rb
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 再将服务重新启动
```docker-compose
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,这样外网一样可以连
修改