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.
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.