ruby-on-railspostgresqlcronpsqlwhenever

Rails Whenever rake aborted! PG::ConnectionBad: fe_sendauth: no password supplied


I am using the Whenever gem for Rails to run a rake task checking the Postgres database for updates to entries. Running the rake file while SSH into the server works fine but with the cron job it does not run with the error message.

rake aborted! PG::ConnectionBad: fe_sendauth: no password supplied

My setup is as follows:

database.yml

default: &default
   adapter: postgresql
   host: localhost
   pool: 5
   encoding: utf8
   timeout: 5000
   username: username
   password: password

 development:
   <<: *default
   database: development
   password: password

 test:
   <<: *default
   database: test

 production:
  <<: *default
  database: production
  password: password

script.rake

namespace :user do
  desc "TODO"
  task update_subscription: :environment do
    puts "--- Starting user subscription check at #{DateTime.now} ---"
    User.find_each do | user |
      if user.refresh_date.past?
        user.refresh_date = Date.today + 1.month
        puts "User #{user.id} subscription updated"
      end
    end
  end
end

schedule.rb

every 1.day, :at => '00:01 am' do
  rake "user:update_subscription"
end

crontab -l

1 0 * * *  /bin/bash -l -c 'cd /home/app/app && RAILS_ENV=production bundle exec rake user:update_subscription --silent >> log/cron_log.log 2>&1'

pg_hba.conf

local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                peer
#host    replication     postgres        127.0.0.1/32            md5
#host    replication     postgres        ::1/128                 md5

output in log file

--- Starting user subscription check at 2018-11-23T10:20:05+00:00 ---
rake aborted!
PG::ConnectionBad: fe_sendauth: no password supplied
/home/app/app/lib/tasks/script.rake:5:in `block (2 
levels) in <top (required)>'
/home/app/.rbenv/versions/2.3.8/bin/bundle:22:in `load'
/home/app/.rbenv/versions/2.3.8/bin/bundle:22:in `<main>'
Tasks: TOP => user:update_subscription
(See full trace by running task with --trace)

If I change md5 and peer to trust in pg_hba.conf everything will work but as far as I know this is not good for security in a production environment.


Solution

  • After a lot more research I think I have found out why I was getting this problem. Cron jobs have limited environmental variables from the operating system. This meant the username, password, unix user etc. where not available and thus the error fe_sendauth: no password supplied was returned. Unfortunately I could not find a solution to this that worked in my situation but I changed from using Whenever to Crono which works great on just about the same code.

    If anyone wants to suggest something that may work for the original question please be my guest. Where possible I will try them out incase one works.