Заметил ли кто-нибудь ещё, что REDIS_URL больше не имеет эффекта? Во время (пере)сборки, а также при запуске контейнера, несмотря на то, что REDIS_URL установлен для подключения через UNIX-сокет, система пытается подключиться по адресу redis://localhost:6379.
С одной стороны, это логично, поскольку в Discourse конфигурация учитывает и применяет только хост и порт: discourse/app/models/global_setting.rb at main · discourse/discourse · GitHub
Существует параметр path для определения пути к UNIX-сокету, который должен переопределять хост и порт. Также есть параметр url для указания полного URL, например unix:///shared/redis_data/redis.sock.
Документация Redis-библиотеки указывает, что переменная окружения REDIS_URL должна переопределять любые другие настройки, и до определённой версии Discourse/Redis gem это работало: redis-rb/lib/redis.rb at master · redis/redis-rb · GitHub
Использование UNIX-сокетов перестало работать, когда Discourse перешёл на версию 5 библиотеки Redis: DEV: Upgrade the Redis gem to v5.4 · discourse/discourse@2ed31fe · GitHub
Похоже, что проблема возникла в самой Redis-библиотеке (она больше не переопределяет другие опции), а не в Discourse (где соответствующий код не менялся)?
Скорее всего, это сломал коммит: Use redis-client as transport · redis/redis-rb@08a2100 · GitHub
Стоит ли мне сообщить об этом в репозиторий Redis gem, или кто-то знает, что проблема в реализации Discourse?
Кстати, переменная окружения передаётся корректно. Я оставил её без изменений и лишь настроил Redis так, чтобы он не слушал UNIX-сокет. В результате unicorn запускается нормально, а sidekiq падает с ошибкой, не находя UNIX-сокет
:
Error in demon processes heartbeat check: No such file or directory - connect(2) for /shared/redis_data/redis.sock
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client/ruby_connection.rb:116:in `initialize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client/ruby_connection.rb:116:in `new'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client/ruby_connection.rb:116:in `connect'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client/ruby_connection.rb:51:in `initialize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client.rb:759:in `new'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client.rb:759:in `block in connect'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client/middlewares.rb:12:in `connect'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client.rb:758:in `connect'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client.rb:745:in `raw_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client.rb:705:in `ensure_connected'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client.rb:285:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/redis_client_adapter.rb:36:in `block (2 levels) in <module:CompatMethods>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/api.rb:912:in `block in cleanup'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/config.rb:175:in `block in redis'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/connection_pool-2.5.3/lib/connection_pool.rb:110:in `block (2 levels) in with'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/connection_pool-2.5.3/lib/connection_pool.rb:109:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/connection_pool-2.5.3/lib/connection_pool.rb:109:in `block in with'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/connection_pool-2.5.3/lib/connection_pool.rb:106:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/connection_pool-2.5.3/lib/connection_pool.rb:106:in `with'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/config.rb:172:in `redis'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq.rb:74:in `redis'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/api.rb:912:in `cleanup'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/api.rb:903:in `initialize'
/var/www/discourse/lib/demon/sidekiq.rb:25:in `new'
/var/www/discourse/lib/demon/sidekiq.rb:25:in `heartbeat_check'
config/unicorn.conf.rb:131:in `block (2 levels) in reload'
Это согласуется с тем, что REDIS_URL всё ещё работает, но только если не заданы другие настройки подключения. Судя по трассировке ошибки, global_setting.rb не применяет хост и порт для sidekiq, в отличие от unicorn.