Rails部署访问报fe_sendauth无密码但rails console可正常连库怎么办
问题根源
该问题的核心原因是Puma运行环境未读取到APP_DATABASE_PASSWORD环境变量,具体逻辑如下:
- 登录服务器执行
bin/rails console时,交互式会话会自动加载/etc/environment、当前用户shell配置文件中的环境变量,因此可以正常读取数据库密码,连接无异常 - 你的
database.yml配置指定了host: localhost,PostgreSQL会走TCP连接而非Unix域套接字,pg_hba.conf中对127.0.0.1的TCP连接要求scram-sha-256密码认证,密码为空就会触发fe_sendauth: no password supplied报错 - 通过Capistrano部署的Puma属于后台服务进程,默认不会加载
/etc/environment中的变量,导致ENV['APP_DATABASE_PASSWORD']返回空值,数据库连接请求没有携带密码。
解决方法
你可以任选以下一种方案修复:
- 方案1:修改Puma服务配置加载环境变量
如果Puma由systemd管理,直接在puma.service的[Service]段添加配置:
执行EnvironmentFile=/etc/environmentsystemctl daemon-reload && systemctl restart puma即可生效。 - 方案2:使用dotenv管理生产环境变量
项目中引入dotenv-railsgem,在部署服务器的项目shared目录下创建.env.production文件,写入APP_DATABASE_PASSWORD=你的实际数据库密码,配置Capistrano部署时将该文件软链到当前版本根目录,Puma启动时会自动读取文件内的变量。 - 方案3:调整数据库连接方式绕过密码认证
删除database.yml中default段的host: localhost配置,PostgreSQL会默认走Unix域套接字连接,匹配pg_hba.conf中的local规则使用peer认证,只要运行Puma的系统用户名和数据库用户名app一致,无需密码即可正常连接。 - 方案4:修改PostgreSQL本地认证规则(仅测试环境可用)
将pg_hba.conf中本地IPv4连接的规则从scram-sha-256改为trust,重启PostgreSQL服务后本地TCP连接无需密码即可访问,该方案安全性极低,生产环境禁止使用。
内容的提问来源于stack exchange,提问作者Marcin Doliwa
相关产品推荐
相关产品推荐

