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

Rails whenever生成cronjob报PostgreSQL Peer认证失败如何解决?

问题根因

  1. database.yml未显式指定数据库用户名:你的配置文件default段没有配置username参数,Rails连接PostgreSQL时会默认使用当前运行进程的操作系统用户名作为数据库登录用户名。
  2. whenever任务配置不生效:
    • 你自定义了适配rbenv环境的rbenv_rake任务类型,但下方的定时任务没有指定使用该类型,默认调用whenever内置的rake任务,没有加载正确的运行环境,也没有用你预期的用户执行。
    • whenever --user参数仅用于生成crontab条目时指定任务运行用户,执行该命令后如果没有追加--update-crontab参数,不会实际更新系统的crontab规则,修改不会生效。
  3. PostgreSQL peer认证规则限制:Ubuntu默认的PostgreSQL配置中,本地Unix套接字连接使用peer认证,要求操作系统用户名和PostgreSQL用户名完全匹配才允许登录,当cron任务运行用户和你PG中配置的应用用户名不一致时,就会抛出peer认证失败错误。

修复方案

方案1:显式配置数据库用户名(最稳妥,不受运行用户影响)

在database.yml的default段(或对应部署环境的配置段)增加数据库用户名配置,直接固定连接PG使用的用户,避免跟随运行进程用户变化:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: name_of_application # 替换为你实际的PG数据库用户名
  # 按需配置密码,推荐用环境变量读取敏感信息
  password: <%= ENV['APP_DATABASE_PASSWORD'] %>

方案2:修正whenever配置和生成规则

  1. 给定时任务指定你自定义的rbenv_rake任务类型,确保运行环境加载正确:
every 1.day, :at => '00:22 am' do
  rbenv_rake "cleanup:promos", :output => "log/sweep_log.log"
end
  1. 切换到你的部署用户(如deploy)执行命令,重新生成并更新crontab:
bundle exec whenever --user name_of_linux_user --update-crontab

方案3:调整PostgreSQL认证规则(可选,不推荐)

如果确实需要保持现有配置,也可以修改/etc/postgresql/<你的PG版本号>/main/pg_hba.conf,把本地连接的认证规则从peer改为md5,修改后重启PostgreSQL服务即可:

# 找到类似以下的行,将peer替换为md5
local   all             all                                     peer

重启服务命令:sudo systemctl restart postgresql

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:06:03