Redis Unix Socket, Instalação no Ubuntu

Estou tentando instalar o Discourse. Configurei meu banco de dados, Redis e SMTP. Para o PostgreSQL, não houve problema com o socket Unix, mas o Redis parece estar reclamando.

Configurações do 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"

Configurar o socket do Redis:
nano /var/www/discourse/config/discourse.conf
redis_host = "/var/run/redis/redis-server.sock"

Durante a instalação do Discourse:

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

Falha ao relatar erro: Erro ao conectar ao Redis em localhost:///var/run/redis/redis-server.sock:6379 (SocketError) 2 Erro ao conectar ao Redis em localhost:///var/run/redis/redis-server.sock:6379 (SocketError
) assinatura falhou, reconectando em 1 segundo. Pilha de chamada ["/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: Erro ao conectar ao Redis em 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'

Se você deseja instalar o Discourse para produção, deve usar a Instalação Padrão Oficial do Discourse. Se deseja instalar um ambiente de desenvolvimento, há tópicos para cada sistema operacional.

1 curtida

Obrigado pela resposta.

Apenas para esclarecer, estou totalmente operacional e tudo está funcionando, mas precisei definir o host do Redis como “localhost”, pois a conexão via socket Unix não funcionou.

Segui este guia: Install Discourse Forum on Ubuntu 18.04 Without Docker
Como o guia está um pouco desatualizado, precisei fazer alguns ajustes aqui e ali, mas como tenho bastante familiaridade com Linux, consegui resolver sem problemas.

Minha instalação está em um container LXC do Proxmox rodando Ubuntu 20.04.

Não encontrei muitas referências online sobre o uso do Redis via UnixSocket. Estou me perguntando se isso pode ser algo relativamente novo para o Redis. Encontrei um link, mas parece que eles estão usando Docker, e eu não estou, então não é diretamente aplicável: Discourse PR for redis.socketed.template.yml - Discourse System Administration - Unix Linux Community

1 curtida

Nesse caso, você estará principalmente por conta própria, pois apenas a Instalação Padrão Oficial do Discourse é suportada aqui.

Acho que será bastante difícil instalar ou manter uma instância de produção que não use Docker. Existem vários pontos complicados na interação entre o nginx e o Discourse que serão difíceis de manter sem o contêiner Docker que eles fornecem, mas, suponho, tudo é possível.

Sim, por sorte eles fornecem um exemplo de configuração do nginx:

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

Pelo que estou lendo, nem mesmo a imagem do Docker suporta o Redis via socket Unix ainda.

Isso dificilmente vai mudar. Se o modelo atual não suporta o uso de um socket, isso significa que o CDCK não utiliza um socket Redis em sua hospedagem ou em sua instalação Docker suportada.

Não tenho certeza de qual problema você está tentando resolver ao não usar a configuração suportada ./launcher e docker, mas é provável que você encontre vários outros problemas também.

Não tenho certeza se você já usou o Proxmox, mas, na minha opinião, ele é fantástico! Posso acessar a interface web e, com um único clique, criar um backup. Depois, posso fazer alterações e, se algo der errado, basta selecionar o backup e clicar em restaurar.

Além disso, você obtém desempenho muito melhor com um contêiner LXC do que com uma imagem Docker; não há comparação.

Não estou dizendo que o Docker é ruim, pois, como você mesmo destacou, ele torna a configuração extremamente fácil.

Aposto que, para as coisas que você o usou, ele foi ótimo!

Tenho quase certeza de que as pessoas já fizeram essa comparação e que há 100 a 1.000 vezes mais imagens rodando no Docker do que no LXC (que eu usei, em tempos idos).

Não estou dizendo que o Proxmox seja ruim, mas se você quer que o Discourse seja fácil de configurar e manter, você usará o Docker. Como referência, se você pedisse ajuda no Marketplace com um orçamento inferior a US$ 1.000, eu não responderia.

O objetivo do tópico era perguntar sobre o status atual do socket Unix do Redis. Não era para debater se LXC ou Docker são mais adequados para o Discourse. Eu apenas mencionei por que não estou usando Docker porque parecia que você poderia ter curiosidade sobre isso. Para a pessoa comum, o Docker vence sempre, porque é simples. Esse é também o motivo pelo qual, por muito tempo, tantos aplicativos usavam MySQL em vez de PostgreSQL. Mas eu absolutamente amo o PostgreSQL.

Até encontrar algum tipo de problema devastador, vou definitivamente continuar com o LXC, ele simplesmente tem um desempenho excelente! Também não poderia concordar mais que, se você acha que pode precisar de suporte externo, provavelmente deve se ater ao que são as configurações padrão recomendadas. Eu mesmo tenho 20 serviços diferentes, cada um em seus próprios contêineres LXC, rodando em um único nó Proxmox, e todos estão funcionando perfeitamente, e isso é apenas um único nó em um cluster Proxmox. Backups automatizados, monitoramento, migração entre nós do cluster, tudo isso são coisas ótimas :slight_smile:

Já mencionei que minha instalação ocorreu sem problemas? Até agora, adoro o Discourse. Fora a necessidade de usar localhost para o Redis em vez do socket Unix, não tive nenhum problema. Vou tentar lembrar de voltar a postar daqui a alguns meses para avisar se isso ainda for o caso :wink:

2 curtidas

Ha! NÃO! Incrível! Fico feliz que você tenha resolvido! Parece que, se você estiver disposto a usar localhost para o Redis, estará livre de problemas daqui para frente.

Eu acho que é usermod -aG redis discourse ou alternativamente unixsocketperm 777 para que o unicorn tenha permissões para acessar o socket. Certifique-se também de que o diretório onde o socket será criado existe e tem o usuário redis como proprietário. No entanto, o pacote comum redis-server baseado em serviço systemd no Ubuntu garante isso.