部署在Fly.io上的PostgreSQL数据库EF Core连接失败求助
错误信息
Fail: Microsoft.EntityFrameworkCore.Database.Connection[20004].
An error occurred using the connection to database 'db' on server ' '.
当前连接字符串
"DefaultConnection": "Server=dbname.internal;Port=5432;User Id=api;Password=password;Database=db"
排查步骤
验证Fly.io内部DNS访问场景
.internal域名是Fly.io内部网络专用,仅在Fly.io容器环境内可解析。如果是本地开发调试,必须通过端口转发访问:
执行命令:fly proxy 5432:5432 -a <你的PostgreSQL应用名称>
之后将连接字符串的Server改为localhost,再尝试连接。核对PostgreSQL应用名称拼写
连接字符串中的dbname.internal必须与Fly.io上创建的PostgreSQL应用实际名称完全一致。用fly apps list命令查看所有应用,确认名称拼写无错误。检查数据库用户存在性
确认User Id=api是目标PostgreSQL实例中已创建的用户。通过fly pg connect -a <你的PostgreSQL应用名称>进入数据库控制台,执行SELECT usename FROM pg_user;查看用户列表,若不存在需创建对应用户。验证密码准确性
确保连接字符串中的密码与PostgreSQL实例的凭证一致。用fly pg credentials list -a <你的PostgreSQL应用名称>命令查看当前有效凭证,核对密码无误。确认网络区域一致性
你的应用与PostgreSQL实例需处于Fly.io的同一区域,跨区域可能导致网络连通问题。分别执行fly apps info -a <你的应用名称>和fly apps info -a <你的PostgreSQL应用名称>,检查输出中的Region字段是否一致。测试基础连接性
排除EF Core层面的问题,直接在Fly.io应用容器内测试PostgreSQL连接:- 执行
fly ssh console -a <你的应用名称>进入容器 - 运行
psql "host=dbname.internal port=5432 dbname=db user=api password=password"
若此命令无法连接,说明问题出在网络或数据库配置,而非EF Core代码。
- 执行
内容的提问来源于stack exchange,提问作者IOEnthusiast

