Jag kan tänka mig två möjligheter:
-
Är något som ställer in
ENV['REDIS_URL']
innan initialiseraren körs? Till exempel kanske du har en.env
fil checkas in i git som åsidosätter Heroku-variabeln? -
Du säger att den här koden är från
redis.rb
. Har du enconfig/initializers/resque.rb
också? Vad sägs omconfig/resque.yml
? Båda av dessa kan också vara försöker öppna en Redis-anslutning. (Om du kunde lägga upp hela stackspårningen av ditt fel kan du bekräfta detta eller utesluta det.) Eller använder du Redis för något annat än Resque?
Du kan också göra lite printf-felsökning och ändra din initialiserare till att säga:
if Rails.env.production?
puts "production: #{ENV['REDIS_URL']}"
uri = URI.parse(ENV["REDIS_URL"])
else
puts "not production"
uri = URI.parse("redis://localhost:6379")
end
Det borde hjälpa dig att klargöra vad som händer. (Du kan behöva använda Rails.logger.info
istället för puts
.)
EDIT: Den där stackspårningen är till stor hjälp! Visst, din egen initialiserare finns inte alls där, men det finns annan kod som försöker ladda sin egen redis-anslutning, här:
remote: /tmp/build_329306a238b046dda86a54d29db48f4c/vendor/bundle/ruby/2.4.0/gems/resque-web-0.0.9/config/initializers/resque_config.rb:4:in `<top (required)>'
Om du slår upp den pärlan kan du se att den gör så här:
require 'resque'
config = ENV.fetch("RAILS_RESQUE_REDIS", "127.0.0.1:6379")
Resque.redis = config
Så jag tror att svaret är att ställa in RAILS_RESQUE_REDIS
utöver till REDIS_URL
. Du kan använda Heroku config:set
kommando för att göra det.