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

从Heroku迁移至Fly.io+Supabase遇“分配不健康导致部署失败”问题

解决Fly.io应用连接Supabase数据库时的部署健康检查失败问题

以下是针对问题的排查和解决步骤:

1. 定位具体错误原因

部署提示「unhealthy allocations」仅为表面现象,需查看Fly.io部署日志获取根因:

fly logs --deployment

重点关注健康检查阶段的报错,比如数据库连接超时、认证失败、权限不足等信息,这是后续排查的核心依据。

2. 检查Supabase的IP白名单设置

若日志显示「connection timed out」,大概率是Fly.io实例IP未在Supabase允许访问列表中:

  • 登录Supabase控制台,进入「Database > Settings > Network Access」
  • 添加Fly.io实例的IP段,或临时设置为0.0.0.0/0(允许所有IP访问)测试,确认是否为IP限制导致的问题。

3. 修正DATABASE_URL的URL编码

本地psql命令无需对密码特殊字符编码,但DATABASE_URL作为URL格式环境变量必须编码(比如密码中的@、:、/等字符):

  • 用工具对密码进行URL编码,例如Python:
    import urllib.parse
    print(urllib.parse.quote_plus("你的原始密码"))
    
  • 将编码后的密码替换到DATABASE_URL中,重新设置secret:
    fly secrets set DATABASE_URL="postgres://[USER]:[编码后的密码]@[SERVER]:6543/[DBNAME]"
    

4. 测试Fly.io实例内的数据库连通性

通过Fly.io SSH控制台直接测试数据库连接,排除应用框架层面问题:

fly ssh console
# 在实例内执行psql连接命令
psql postgres://[USER]:[密码]@[SERVER]:6543/[DBNAME]

若连接失败,说明是网络或数据库配置问题;若连接成功,再排查应用的健康检查逻辑或数据库连接配置。

5. 调整Supabase PgBouncer配置

如果使用Supabase连接池(PgBouncer),检查以下配置:

  • 连接池模式:默认是transaction模式,适合短连接场景。若应用依赖长连接,改为session模式(在「Database > Connection Pooling」中调整)。
  • 最大连接数:查看PgBouncer连接数统计,若当前连接数接近上限,适当调高最大连接数。

6. 排查Fly.io健康检查配置

检查fly.toml中的健康检查规则,确认健康检查请求是否依赖数据库连接:

  • 如果健康检查接口需要查询数据库,数据库连接失败会直接导致健康检查不通过。可临时修改健康检查为不依赖数据库的接口,测试应用是否能正常启动,以此区分是数据库问题还是健康检查逻辑问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:31:06