Przychodzą mi do głowy dwie możliwości:
-
Czy coś ustawia
ENV['REDIS_URL']
przed uruchomieniem inicjatora? Na przykład może masz plik.env
plik wpisany do git, który nadpisuje zmienną Heroku? -
Mówisz, że ten kod pochodzi z
redis.rb
. Czy masz plikconfig/initializers/resque.rb
? także? A co zconfig/resque.yml
? ? Każdy z nich może być również próbuje otworzyć połączenie Redis. (Jeśli możesz opublikować cały ślad stosu swojego błędu, możesz to potwierdzić lub wykluczyć.) A może używasz Redis do czegoś innego niż Resque?
Możesz także przeprowadzić debugowanie printf i zmienić inicjator tak, aby mówił:
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
To powinno pomóc ci wyjaśnić, co się dzieje. (Może być konieczne użycie Rails.logger.info
zamiast puts
.)
EDYTUJ: Ten ślad stosu jest bardzo pomocny! Rzeczywiście, Twojego własnego inicjatora w ogóle tam nie ma, ale jest inny kod, który próbuje załadować własne połączenie redis, tutaj:
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)>'
Jeśli spojrzysz na ten klejnot, zobaczysz, że robi to:
require 'resque'
config = ENV.fetch("RAILS_RESQUE_REDIS", "127.0.0.1:6379")
Resque.redis = config
Myślę więc, że odpowiedzią jest ustawienie RAILS_RESQUE_REDIS
dodatkowo na REDIS_URL
. Możesz użyć Heroku config:set
polecenie, aby to zrobić.