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

使用Kamal部署Rails应用时PostgreSQL连接失败求助

排查Kamal部署Rails应用数据库连接失败问题的步骤

1. 验证服务器到数据库主机的网络连通性

  • 在部署服务器上执行以下命令测试端口可达性:
    nc -zv 45.92.9.7 5432
    # 或用telnet
    telnet 45.92.9.7 5432
    
    若不通,重点检查:
    • 数据库主机的防火墙/安全组是否开放5432端口给部署服务器IP
    • 数据库主机pg_hba.conf是否添加了部署服务器IP的访问规则(格式类似host all all <部署服务器IP>/32 scram-sha-256)
    • 数据库主机postgresql.conf的listen_addresses是否设为*或包含部署服务器可访问的IP

2. 检查容器网络与环境变量

  • 验证容器内的网络连通性:
    # 进入问题容器
    docker exec -it <容器ID> /bin/bash
    # 测试数据库主机连通
    ping 45.92.9.7
    # 测试端口
    nc -zv 45.92.9.7 5432
    
  • 确认容器内数据库环境变量是否正确注入:
    docker exec <容器ID> printenv | grep -E 'POSTGRES_|DATABASE_URL'
    
    确保POSTGRES_HOST、POSTGRES_PORT、POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB的值正确,或DATABASE_URL格式无误(如postgres://user:pass@45.92.9.7:5432/dbname)

3. 检查PostgreSQL服务状态

  • 登录数据库主机,确认服务正常运行:
    systemctl status postgresql
    # 或查看进程
    ps aux | grep postgres
    
  • 检查PostgreSQL是否监听5432端口:
    ss -tulpn | grep 5432
    

4. 核对database.yml配置

  • 确保生产环境配置正确读取环境变量,避免硬编码错误:
    production:
      adapter: postgresql
      host: <%= ENV['POSTGRES_HOST'] %>
      port: <%= ENV['POSTGRES_PORT'] || 5432 %>
      database: <%= ENV['POSTGRES_DB'] %>
      username: <%= ENV['POSTGRES_USER'] %>
      password: <%= ENV['POSTGRES_PASSWORD'] %>
      pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
      timeout: 5000
    

5. 检查Kamal部署配置

  • 确认deploy.yml中正确传递了敏感环境变量:
    env:
      secret:
        - POSTGRES_HOST
        - POSTGRES_PORT
        - POSTGRES_USER
        - POSTGRES_PASSWORD
        - POSTGRES_DB
    
  • 若使用自定义环境文件,确保路径正确:
    env_file:
      - .env.production
    

6. 容器内手动测试数据库连接

  • 进入容器后用psql直接测试,获取更精准的错误信息:
    psql -h 45.92.9.7 -p 5432 -U <数据库用户名> -d <数据库名>
    
    根据psql返回的错误(如密码错误、用户无权限、数据库不存在)针对性排查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:55:06