You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP Telegraph开发Telegram机器人:PostgreSQL与WebHook冲突问题求助

问题分析

你的问题核心是Docker容器网络互通与Web服务绑定地址的双重冲突:

  1. 当DB_HOST=pgsql时,PHP应用所在容器与PostgreSQL容器不在同一Docker网络,导致容器名无法被DNS解析,数据库连接失败;但此时Web服务绑定了0.0.0.0,ngrok能正常将外部请求转发到应用,所以WebHook可正常工作。
  2. 当DB_HOST=localhost时,若应用运行在Docker容器内,localhost指向容器自身而非宿主机,数据库连接依然失败;同时如果Web服务被设置为仅绑定localhost,ngrok的外部请求会被拒绝,直接导致WebHook失效。
解决步骤

1. 确保应用与PostgreSQL容器在同一Docker网络

从你的.env配置看,大概率使用的是Laravel Sail环境,默认会自动创建专属网络,只需通过标准命令启动容器即可:

sail down -v  # 清除旧容器、卷和网络
sail up -d    # 重新启动,自动将laravel.test与pgsql容器加入同一网络

如果是手动搭建的Docker环境:

  • 创建自定义网络:
    docker network create telegram-bot-network
    
  • 启动PostgreSQL容器时加入该网络:
    docker run --name pgsql --network telegram-bot-network \
      -e POSTGRES_DB=telegram_bot -e POSTGRES_USER=sail -e POSTGRES_PASSWORD=password \
      -p 5432:5432 -d postgres
    
  • 启动PHP应用容器时也加入同一网络:
    docker run --name telegram-bot-app --network telegram-bot-network \
      -p 8000:80 -d your-php-app-image
    

此时保持.env中DB_HOST=pgsql,数据库即可正常解析连接。

2. 确保Web服务绑定到0.0.0.0

WebHook失效的本质是Web服务仅监听localhost,拒绝外部请求:

  • 若使用Laravel内置服务器,启动时指定绑定地址:
    php artisan serve --host=0.0.0.0 --port=8000
    
  • 若使用Nginx/Apache作为Web服务器,修改配置文件监听0.0.0.0:
    比如Nginx配置中,将listen 127.0.0.1:80;改为listen 0.0.0.0:80;或直接listen 80;

3. 验证配置

  1. 重启所有容器后,在应用容器内测试数据库连接:
    # Laravel Sail环境
    sail exec laravel.test psql -h pgsql -U sail -d telegram_bot
    # 手动Docker环境
    docker exec -it telegram-bot-app psql -h pgsql -U sail -d telegram_bot
    
    输入密码后能进入PostgreSQL命令行即为连接成功。
  2. 启动ngrok转发到应用的宿主机端口:
    ngrok http 8000
    
  3. 更新Telegram WebHook地址为ngrok提供的HTTPS地址,测试机器人响应是否正常。
额外排查点
  • 用docker inspect pgsql和docker inspect laravel.test(或你的应用容器名)查看Networks字段,确认两者属于同一网络。
  • 若Laravel Sail环境仍无法解析pgsql,检查sail命令是否正确指向项目的Docker Compose配置。

内容的提问来源于stack exchange,提问作者vladJaava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:37:41