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

Docker部署aiogram Telegram Bot遇Errno 99地址绑定错误求助

解决Docker部署aiogram Webhook时的绑定错误

问题现象

部署基于aiogram的Telegram Bot到Docker Compose环境时,出现以下绑定地址错误:

app_1            | OSError: [Errno 99] error while attempting to bind on address ('::1', 3001, 0, 0): cannot assign requested address

本地非Docker环境运行正常,问题出在Docker容器的网络配置上。

解决方案

1. 修改Web服务绑定地址

在main.py中,将WEBAPP_HOST从localhost改为0.0.0.0:

# webserver settings
WEBAPP_HOST = '0.0.0.0'  # 绑定到容器所有可用网络接口
WEBAPP_PORT = 3001

原因:Docker容器内的localhost仅指向容器自身回环接口,绑定0.0.0.0才能让其他容器(如Nginx)访问到Bot的Web服务。

2. 修正Nginx代理配置

修改nginx.conf中的proxy_pass地址,使用Docker Compose的服务名app而非127.0.0.1,同时匹配Bot服务的端口3001:

server {
    listen 443 ssl;
    server_name MySite.com;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_certificate /etc/letsencrypt/live/Mysite.com/fullchain.pem;    
    ssl_certificate_key /etc/letsencrypt/live/MySite.com/privkey.pem;        

    location / {
        proxy_pass         http://app:3001;  # 使用app服务名和对应端口
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
    }
}

server {
    if ($host = MySite.com) {
        return 301 https://$host$request_uri;
    } 

    listen 80;
    server_name MySite.com;
    return 404; 
}

原因:Docker Compose中各服务通过服务名互相访问,Nginx容器无法直接访问宿主机的127.0.0.1,必须用服务名app访问Bot容器。

3. 修复数据库连接地址

修改Dockerfile中的DB_STRING,将localhost替换为PostgreSQL服务名db:

FROM python
ENV DB_STRING=postgresql+psycopg2://user1:12345@db:5432/db01  # 使用db服务名
RUN apt-get update \
    && apt-get install -y git \
    && git clone https://github.com/...My repository...
WORKDIR /tele/telebot
RUN pip install -r requirements.txt

CMD python3 -u main.py

原因:PostgreSQL运行在db容器中,Bot容器需通过服务名db访问数据库,而非localhost。

4. 调整Docker Compose依赖关系

修改docker-compose.yaml,调整服务依赖顺序(Nginx依赖app,而非app依赖Nginx),并添加必要的配置挂载:

version: '3.3'
services:
  redis:
    image: redis
    restart: always
  app:
    build: .
    restart: always
    depends_on:
      - redis
      - db
    environment:
      - ...
  celery_worker:
    build: .
    restart: always
    depends_on:
      - redis
      - app
      - db
    command: ['celery', '-A', 'celery_app', 'worker', '--loglevel=DEBUG']
    environment:
      - ...
  db:
    image: postgres
    restart: always
    environment:
      - ...
  nginx:
    image: nginx
    restart: always
    depends_on:
      - app  # Nginx需等待app服务启动
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf  # 挂载自定义配置
      - ./ssl:/etc/letsencrypt/live/MySite.com  # 挂载SSL证书(确保本地路径正确)

说明:

  • app服务无需暴露端口,仅Nginx容器内部访问即可
  • 挂载Nginx配置和SSL证书,确保配置生效
  • 调整依赖顺序,避免服务启动时序错误

验证步骤

  1. 重新构建镜像:docker-compose build
  2. 启动服务:docker-compose up -d
  3. 查看日志:docker-compose logs app,确认服务正常启动
  4. 测试Webhook连接,验证Telegram Bot功能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:40:37