Redis Unix-сокет, установка на Ubuntu

Я пытаюсь установить Discourse, настроил свою базу данных, Redis и SMTP. Для PostgreSQL проблем с Unix-сокетом не возникло, но Redis, похоже, жалуется.

Настройки Redis:

sudo sed -i 's/^# unixsocket /unixsocket /' /etc/redis/redis.conf
sudo sed -i 's/^# unixsocketp.*/unixsocketperm 770/' /etc/redis/redis.conf
sudo sed -i 's/^# maxmemory <bytes>/maxmemory 1024mb/' /etc/redis/redis.conf
sudo sed -i 's/^# maxmemory-policy noeviction/maxmemory-policy allkeys-lru/' /etc/redis/redis.conf
sudo cat /etc/redis/redis.conf | grep "^maxmemory\|^unixsocket"

Настройка сокета Redis:
nano /var/www/discourse/config/discourse.conf
redis_host = "/var/run/redis/redis-server.sock"

Во время установки Discourse:

RAILS_ENV=production /root/.rbenv/versions/2.7.2/bin/bundle exec rake db:migrate

Не удалось сообщить об ошибке: Ошибка подключения к Redis на localhost:///var/run/redis/redis-server.sock:6379 (SocketError) 2 Ошибка подключения к Redis на localhost:///var/run/redis/redis-server.sock:6379 (SocketError
) подписка не удалась, повторное подключение через 1 секунду. Стек вызовов ["/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:362:in `rescue in establish_connection'", "/var/www/discourse/vendor/b
undle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:343:in `establish_connection'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:107:in `block in connect'", "/var/www/disc
ourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:308:in `with_reconnect'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:106:in `connect'", "/var/www/disco
urse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:289:in `with_socket_timeout'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:139:in `call_loop'", "/var/www
/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/subscribe.rb:44:in `subscription'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/subscribe.rb:14:in `subscribe'", "/var/
www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:3506:in `_subscription'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:2326:in `block in subscribe'", "/var/www
/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:69:in `block in synchronize'", "/root/.rbenv/versions/2.7.2/lib/ruby/2.7.0/monitor.rb:202:in `synchronize'", "/root/.rbenv/versions/2.7.2/lib/ru
by/2.7.0/monitor.rb:202:in `mon_synchronize'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:69:in `synchronize'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/
redis.rb:2325:in `subscribe'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.1/lib/message_bus/backends/redis.rb:287:in `global_subscribe'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems
/message_bus-3.3.1/lib/message_bus.rb:754:in `global_subscribe_thread'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.1/lib/message_bus.rb:702:in `block in new_subscriber_thread'"]
rake aborted!
Redis::CannotConnectError: Ошибка подключения к Redis на localhost:///var/run/redis/redis-server.sock:6379 (SocketError)
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:362:in `rescue in establish_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:343:in `establish_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:107:in `block in connect'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:308:in `with_reconnect'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:106:in `connect'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:381:in `ensure_connected'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:233:in `block in process'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:320:in `logging'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:232:in `process'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:126:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:557:in `block in del'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:69:in `block in synchronize'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:69:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:556:in `del'
/var/www/discourse/lib/discourse_redis.rb:81:in `block in del'
/var/www/discourse/lib/discourse_redis.rb:29:in `ignore_readonly'
/var/www/discourse/lib/discourse_redis.rb:79:in `del'
/var/www/discourse/lib/cache.rb:73:in `delete'

Если вы хотите установить Discourse для production, используйте официальную стандартную установку Discourse. Если вы хотите установить окружение для разработки, существуют темы для каждой ОС.

Спасибо за ответ.

Только для уточнения: у меня всё полностью запущено и работает, но я был вынужден установить хост Redis как “localhost”, поскольку подключение к Redis через unix-сокет не работало.

Я следовал этому руководству: https://www.linuxbabe.com/ubuntu/install-discourse-ubuntu-18-04-server-without-docker
Поскольку руководство немного устарело, мне пришлось внести несколько корректировок, но я хорошо знаком с Linux, поэтому смог справиться без проблем.

Моя установка выполнена в контейнере LXC Proxmox под управлением Ubuntu 20.04.

В интернете я нашёл мало ссылок об использовании Redis через Unix-сокет. Интересно, возможно, это относительно новая функция для Redis? Я нашёл одну ссылку, но там используется Docker, а у меня его нет, поэтому она не совсем применима: Discourse PR for redis.socketed.template.yml - Discourse System Administration - Unix Linux Community

Тогда вам, скорее всего, придётся действовать в одиночку, так как здесь поддерживается только официальная стандартная установка Discourse.

Думаю, что установка или поддержка рабочей копии без использования Docker будет довольно сложной. Существует ряд тонкостей во взаимодействии между nginx и Discourse, которые будет трудно поддерживать без предоставленного ими Docker-контейнера, но, в принципе, всё возможно.

Да, к счастью, они предоставляют пример конфигурации nginx:

/var/www/discourse/config/nginx.sample.conf

Судя по тому, что я читаю, даже Docker-образ пока не поддерживает Redis через unix-сокет.

Это вряд ли изменится. Если текущий шаблон не поддерживает использование сокета, это означает, что CDCK не использует сокет Redis в своём хостинге или в поддерживаемой установке Docker.

Не уверен, какую проблему вы решаете, отказываясь от поддерживаемой конфигурации ./launcher и docker, но, скорее всего, вы столкнётесь с множеством других проблем.

Не уверен, что вы когда-либо использовали Proxmox, но на мой взгляд это фантастика! Я могу войти в веб-интерфейс и в один клик создать резервную копию, затем внести изменения, и если что-то пойдёт не так, просто выбрать резервную копию и нажать «Восстановить».

Кроме того, вы получаете значительно лучшую производительность от контейнера LXC по сравнению с образом Docker — здесь даже нет сравнения.

Я не говорю, что Docker плох, ведь, как вы правильно заметили, он делает настройку ОЧЕНЬ простой.

Скорее всего, для ваших задач он оказался отличным!

Я почти уверен, что такое сравнение уже проводилось, и что образов Docker работает в 100–1000 раз больше, чем LXC (который я когда-то использовал).

Я не говорю, что Proxmox плох, но если вы хотите, чтобы Discourse было легко настроить и поддерживать, используйте Docker. Для примера: если бы вы попросили помощи в канале Marketplace с бюджетом менее 1000 долларов, я бы не ответил.

Смысл этой ветки заключался в том, чтобы спросить о текущем статусе Unix-сокета Redis. Не в том, чтобы спорить о том, что лучше подходит для Discourse — LXC или Docker. Я лишь упомянул, почему не использую Docker, потому что, казалось, вам это может быть интересно. Для обычного пользователя Docker всегда будет выигрывать, потому что он прост. Это также причина, по которой долгое время так много приложений использовали MySQL вместо PostgreSQL. Но я абсолютно люблю PostgreSQL.

Пока я не столкнусь с какими-то катастрофическими проблемами, я точно буду оставаться на LXC, оно просто отлично работает! Также я полностью согласен: если вы думаете, что вам может понадобиться внешняя поддержка, то лучше придерживаться рекомендованных настроек по умолчанию. У меня самого 20 различных сервисов, каждый в своём собственном контейнере LXC, работающих на одном узле Proxmox, и все они работают отлично. И это всего лишь один узел в кластере Proxmox. Автоматическое резервное копирование, мониторинг, миграция между узлами кластера — всё это замечательные вещи :slight_smile:

Я уже упоминал, что моя установка прошла гладко? Пока я в восторге от Discourse. За исключением необходимости использовать localhost для Redis вместо Unix-сокета, у меня не было никаких проблем. Постараюсь не забыть вернуться через несколько месяцев и сообщить, всё ли ещё так :wink:

Ха! НЕТ! Классно! Рад, что ты всё решил! Похоже, если ты готов мириться с localhost для Redis, то вперёд тебя ждёт жизнь без проблем.

Полагаю, это usermod -aG redis discourse или, в качестве альтернативы, unixsocketperm 777, чтобы у Unicorn были права на доступ к сокету. Также убедитесь, что каталог, в котором должен создаваться сокет, существует и принадлежит пользователю redis. Однако стандартный пакет redis-server, основанный на systemd-сервисе в Ubuntu, гарантирует это.