使用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返回的错误(如密码错误、用户无权限、数据库不存在)针对性排查。psql -h 45.92.9.7 -p 5432 -U <数据库用户名> -d <数据库名>
内容的提问来源于stack exchange,提问作者IbunHabibu Salim
相关产品推荐
相关产品推荐

