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

如何解决DigitalOcean上FastAPI与PostgreSQL的连接问题

排查FastAPI连接DigitalOcean托管PostgreSQL失败问题

首先明确:你遇到的socket.gaierror: [Errno -2] Name or service not known错误本质是数据库主机名解析失败,和SSL证书无关——你之前查到的SSL相关信息是误导方向。

下面是具体排查步骤:

  1. 确认DB_HOST环境变量是否正确
    你删除了原Primary数据库后,新恢复的数据库集群的主机地址已经变更。请检查Docker容器内的DB_HOST环境变量值:

    • 进入容器执行:docker exec -it 2a7b5654b16b echo $DB_HOST
    • 对比DigitalOcean控制台中新数据库集群的主机名(格式通常为db-postgresql-xxx-xxxx-do-user-xxxxxx-0.b.db.ondigitalocean.com),确认是否还在使用已删除数据库的旧主机名。
  2. 验证主机名解析能力
    在运行Docker的Ubuntu Droplet上,或者直接在容器内,执行解析命令测试:

    nslookup <你的DB_HOST值>
    # 或者用ping测试(按Ctrl+C终止)
    ping <你的DB_HOST值>
    

    如果返回"Name or service not known",说明主机名完全错误,直接替换为新集群的正确主机名即可。

  3. 核对所有数据库连接参数
    除了主机名,还要同步检查环境变量中的DB_PORT、DB_USER、DB_PASSWORD、DB_DATABASE是否与新集群的配置一致:

    • 新集群的端口通常还是5432,但如果有变更需同步
    • 注意DigitalOcean托管库默认用户名是doadmin,而非代码中默认的postgres,恢复备份后需确认实际用户名
  4. 修复SSL连接配置(建议补充)
    DigitalOcean托管PostgreSQL默认强制要求SSL连接,即使你的代码中DB_SSL=None,后续仍可能出现SSL相关错误。建议修改DSN添加SSL参数:

    DB_DSN: Final[str] = f"{DB_DRIVER}://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_DATABASE}?sslmode=require"
    

    或者在create_async_engine中补充连接参数:

    db_engine = create_async_engine(
        Settings.DB_DSN,
        pool_size=10,
        max_overflow=10,
        echo=Settings.DB_ECHO,
        json_deserializer=orjson.loads,
        json_serializer=lambda j: orjson.dumps(j).decode("utf-8"),
        pool_pre_ping=True,
        pool_recycle=60,
        future=True,
        connect_args={"ssl": {"sslmode": "require"}}
    )
    

更新环境变量后重启FastAPI容器,测试连接是否恢复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:23:28