Socket Unix de Redis, Instalación en Ubuntu

Estoy intentando instalar Discourse. He configurado mi base de datos, Redis y SMTP. Para la base de datos PostgreSQL no hubo problemas con el socket Unix, pero parece que Redis está dando problemas.

Configuración de 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 el socket de Redis:
nano /var/www/discourse/config/discourse.conf
redis_host = "/var/run/redis/redis-server.sock"

Durante la instalación de Discourse:

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

Error al reportar el error: Error al conectar con Redis en localhost:///var/run/redis/redis-server.sock:6379 (SocketError) 2 Error al conectar con Redis en localhost:///var/run/redis/redis-server.sock:6379 (SocketError
) suscripción fallida, reconectando en 1 segundo. Pila de llamadas ["/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: Error al conectar con Redis en 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'

Si deseas instalar Discourse para producción, debes utilizar la Instalación Estándar Oficial de Discourse. Si deseas instalar un entorno de desarrollo, hay temas para cada sistema operativo.

Gracias por la respuesta.

Solo para aclarar, ya tengo todo funcionando correctamente, pero tuve que configurar el host de Redis como “localhost” porque la conexión a Redis mediante un socket Unix no funcionaba.

Seguí esta guía: Install Discourse Forum on Ubuntu 18.04 Without Docker
Dado que la guía está un poco desactualizada, tuve que hacer algunos ajustes aquí y allá, pero como tengo mucha experiencia con Linux, pude resolverlo sin problemas.

Mi instalación se ejecuta en un contenedor LXC de Proxmox con Ubuntu 20.04.

No encuentro muchas referencias en línea sobre el uso de Redis mediante un socket Unix. Me pregunto si eso podría ser algo relativamente nuevo para Redis. Encontré un enlace, pero parece que utilizan Docker, y yo no, por lo que no es directamente aplicable: Discourse PR for redis.socketed.template.yml - Discourse System Administration - Unix Linux Community

Entonces, en gran parte tendrás que valerte por ti mismo, ya que aquí solo se admite la instalación estándar oficial de Discourse.

Creo que será bastante difícil instalar o mantener una instancia de producción que no utilice Docker. Hay varios aspectos delicados en la interacción entre nginx y Discourse que resultarán complicados de mantener sin el contenedor Docker que ellos proporcionan, pero supongo que todo es posible.

Sí, por suerte proporcionan una configuración de ejemplo de nginx

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

Por lo que he leído, ni siquiera la imagen de Docker soporta Redis a través de un socket Unix todavía.

Eso probablemente no va a cambiar. Si la plantilla actual no admite el uso de un socket, eso significa que CDCK no utiliza un socket de Redis en su alojamiento ni en su instalación de Docker soportada.

No estoy seguro de qué problema estás resolviendo al no utilizar la configuración soportada de ./launcher y docker, pero es probable que también encuentres muchos otros problemas.

No estoy seguro de si alguna vez has usado Proxmox, pero en mi opinión es fantástico. Puedo iniciar sesión en la interfaz web y con un solo clic crear una copia de seguridad. Luego puedo hacer cambios y, si algo sale mal, simplemente selecciono la copia de seguridad y hago clic en restaurar.

Además de eso, obtienes un rendimiento mucho mejor con un contenedor LXC que con una imagen de Docker; no hay comparación.

No digo que Docker sea malo, porque, como has señalado, hace que la configuración sea MUY sencilla.

¡Apuesto a que, para lo que lo has usado, ha sido genial!

Estoy bastante seguro de que alguien ha hecho esa comparación y que hay entre 100 y 1000 veces más imágenes ejecutándose en Docker que en LXC (yo lo usé, hace mucho tiempo).

No estoy diciendo que Proxmox sea malo, pero si quieres que Discourse sea fácil de configurar y mantener, usarás Docker. Como referencia, si pidieras ayuda en Marketplace con un presupuesto inferior a 1.000 dólares, no respondería.

El propósito del hilo era preguntar sobre el estado actual del socket Unix de Redis. No se trataba de debatir si LXC o Docker son más adecuados para Discourse. Solo mencioné por qué no estoy usando Docker porque parecía que podrías tener curiosidad al respecto. Para la persona promedio, Docker siempre ganará porque es sencillo. Esa es también la razón por la que, durante mucho tiempo, tantas aplicaciones usaron MySQL en lugar de PostgreSQL. Pero a mí me encanta PostgreSQL.

Hasta que me encuentre con algún problema devastador, definitivamente me quedaré con LXC, ¡simplemente funciona de maravilla! También estoy totalmente de acuerdo en que, si crees que podrías necesitar soporte externo, probablemente debas mantenerte con los valores predeterminados recomendados. Yo mismo tengo 20 servicios diferentes, cada uno en su propio contenedor LXC, ejecutándose en un único nodo Proxmox, y todos funcionan perfectamente, y eso es solo un nodo en un clúster de Proxmox. Copias de seguridad automatizadas, monitoreo, migración entre nodos del clúster; ¡todo esto es excelente! :slight_smile:

¿Mencioné que mi instalación fue fluida? Hasta ahora, me encanta Discourse. Aparte de tener que usar localhost para Redis en lugar del socket Unix, no he tenido ningún problema. Intentaré recordar volver a publicar en unos meses para decirles si sigue siendo así :wink:

¡Jaja! ¡NO! ¡Genial! ¡Me alegra que lo hayas solucionado! Parece que, si estás dispuesto a usar localhost para Redis, no tendrás problemas en el futuro.

Supongo que es usermod -aG redis discourse o, alternativamente, unixsocketperm 777 para que unicorn tenga permisos para acceder al socket. Asegúrate también de que el directorio donde se va a crear el socket exista y tenga al usuario redis como propietario. Sin embargo, el paquete redis-server común basado en el servicio systemd en Ubuntu lo asegura.