Error de Redis después de la actualización

Hola,

Después de actualizar a través de la interfaz web, ya no puedo acceder a mi sitio. No he cambiado nada, solo hice clic en el botón de actualización. Los errores sugieren problemas de conexión con Redis. He buscado mucho pero aún no he encontrado nada que me ayude. production.log está vacío. Se está ejecutando en Ubuntu en Digital Ocean. Ha funcionado sin problemas durante 18 meses, sin errores excepto cuando me quedé sin espacio en disco hace 6 meses, momento en el que lo amplié con éxito.

El espacio en disco está bien:

Filesystem      Size  Used Avail Use% Mounted on
overlay          49G   25G   24G  52% /
tmpfs            64M     0   64M   0% /dev
tmpfs          1001M     0 1001M   0% /sys/fs/cgroup
shm             512M  8.0K  512M   1% /dev/shm
/dev/vda1        49G   25G   24G  52% /shared
tmpfs          1001M     0 1001M   0% /proc/acpi
tmpfs          1001M     0 1001M   0% /proc/scsi
tmpfs          1001M     0 1001M   0% /sys/firmware

El archivo unicorn.stdout.log muestra:

> 2020-06-03T06:29:28.352Z pid=715 tid=osk2fuo0n ERROR: Error fetching job: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)
> 2020-06-03T06:29:28.353Z pid=715 tid=osk2fszrb ERROR: Error fetching job: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)
> 2020-06-03T06:29:28.354Z pid=715 tid=osk2fsjw3 ERROR: Error fetching job: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)
> 2020-06-03T06:29:28.354Z pid=715 tid=osk2ftlhz ERROR: Error fetching job: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)
> 2020-06-03T06:29:28.355Z pid=715 tid=osk2ftr43 ERROR: Error fetching job: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)
> Starting up 1 supervised sidekiqs
> Loading Sidekiq in process id 725

Primero intenté reconstruir manualmente la aplicación.

Luego intenté apt upgrade docker, reinicié el servidor con reboot y reconstruí usando ./launcher rebuild app.

redis-cli ping devuelve una respuesta PONG.

ss -t
State      Recv-Q Send-Q Local Address:Port                 Peer Address:Port   
ESTAB      0      0      104.248.166.162:ssh                  5.81.114.19:56270 
ESTAB      0      0      104.248.166.162:ssh                  5.81.114.19:56211 

ps -axf muestra que está en ejecución:

  PID TTY      STAT   TIME COMMAND
 2378 pts/1    Ss     0:00 /bin/bash --login
 2849 pts/1    R+     0:00  \_ ps -axf
    1 pts/0    Ss+    0:00 /bin/bash /sbin/boot
  627 pts/0    S+     0:00 /usr/bin/runsvdir -P /etc/service
  628 ?        Ss     0:00  \_ runsv rsyslog
  641 ?        Sl     0:00  |   \_ rsyslogd -n
  629 ?        Ss     0:00  \_ runsv cron
  640 ?        S      0:00  |   \_ cron -f
  630 ?        Ss     0:00  \_ runsv unicorn
  639 ?        S      0:00  |   \_ /bin/bash config/unicorn_launcher -E producti
  665 ?        Sl     0:09  |       \_ unicorn master -E production -c config/un
  725 ?        SNl    0:12  |       |   \_ sidekiq 6.0.7 discourse [0 of 5 busy]
  750 ?        Sl     0:20  |       |   \_ unicorn worker[0] -E production -c co
  758 ?        Sl     0:17  |       |   \_ unicorn worker[1] -E production -c co
 2848 ?        S      0:00  |       \_ sleep 1
  631 ?        Ss     0:00  \_ runsv postgres
  635 ?        S      0:00  |   \_ svlogd /var/log/postgres
  636 ?        S      0:00  |   \_ /usr/lib/postgresql/12/bin/postmaster -D /etc
  659 ?        Ss     0:00  |       \_ postgres: 12/main: checkpointer
  660 ?        Ss     0:00  |       \_ postgres: 12/main: background writer
  661 ?        Ss     0:00  |       \_ postgres: 12/main: walwriter
  662 ?        Ss     0:00  |       \_ postgres: 12/main: autovacuum launcher
  663 ?        Ss     0:00  |       \_ postgres: 12/main: stats collector
  664 ?        Ss     0:00  |       \_ postgres: 12/main: logical replication la
  691 ?        Ss     0:00  |       \_ postgres: 12/main: discourse discourse [l
 1848 ?        Ss     0:00  |       \_ postgres: 12/main: discourse discourse [l
 2633 ?        Ss     0:00  |       \_ postgres: 12/main: discourse discourse [l
 2675 ?        Ss     0:00  |       \_ postgres: 12/main: discourse discourse [l
 2840 ?        Ss     0:00  |       \_ postgres: 12/main: discourse discourse [l
  632 ?        Ss     0:00  \_ runsv nginx
  634 ?        S      0:00  |   \_ nginx: master process /usr/sbin/nginx
  654 ?        S      0:02  |       \_ nginx: worker process
  655 ?        S      0:00  |       \_ nginx: cache manager process
  633 ?        Ss     0:00  \_ runsv redis
  637 ?        S      0:00      \_ svlogd /var/log/redis
  638 ?        Sl     0:05      \_ /usr/bin/redis-server *:6379

¿Alguna idea? No soy un experto y estoy teniendo muchas dificultades para encontrar una forma de poner esto en funcionamiento de nuevo. ¿Hay algo simple que esté pasando por alto? ¿Hay algún otro lugar que pueda revisar que me ayude a encontrar el problema?

Gracias.

Oh… veo que reiniciaste y hiciste todo lo obvio…

¿Puedes pegar la configuración de tu contenedor (sin contraseñas)? ¿Se mezcló la plantilla de Redis?

¿Hay algo interesante en docker logs app?

¿Se resuelve localhost dentro de tu contenedor?

Hola Sam, perdona mi falta de conocimiento,

¿te refieres al archivo app.yml?

¿a qué logs de Docker te refieres? He ejecutado esto: ./launcher logs app

run-parts: ejecutando /etc/runit/1.d/00-ensure-links
run-parts: ejecutando /etc/runit/1.d/00-fix-var-logs
run-parts: ejecutando /etc/runit/1.d/anacron
run-parts: ejecutando /etc/runit/1.d/cleanup-pids
Limpiando archivos PID obsoletos
run-parts: ejecutando /etc/runit/1.d/copy-env
run-parts: ejecutando /etc/runit/1.d/letsencrypt
[Mié 03 Jun 2020 06:34:47 AM UTC] Los dominios no han cambiado.
[Mié 03 Jun 2020 06:34:47 AM UTC] Saltado, la próxima hora de renovación es: Mié Jul  1 00:35:12 UTC 2020
[Mié 03 Jun 2020 06:34:47 AM UTC] Agrega '--force' para forzar la renovación.
[Mié 03 Jun 2020 06:34:47 AM UTC] Instalando la clave en: /shared/ssl/forum.tritalk.co.uk.key
[Mié 03 Jun 2020 06:34:47 AM UTC] Instalando la cadena completa en: /shared/ssl/forum.tritalk.co.uk.cer
[Mié 03 Jun 2020 06:34:47 AM UTC] Ejecutando el comando de recarga: sv reload nginx
advertencia: nginx: no se pudo abrir supervise/ok: el archivo no existe
[Mié 03 Jun 2020 06:34:47 AM UTC] Error de recarga para :
[Mié 03 Jun 2020 06:34:48 AM UTC] Los dominios no han cambiado.
[Mié 03 Jun 2020 06:34:48 AM UTC] Saltado, la próxima hora de renovación es: Jue Jul  9 00:35:12 UTC 2020
[Mié 03 Jun 2020 06:34:48 AM UTC] Agrega '--force' para forzar la renovación.
[Mié 03 Jun 2020 06:34:48 AM UTC] Instalando la clave en: /shared/ssl/forum.tritalk.co.uk_ecc.key
[Mié 03 Jun 2020 06:34:48 AM UTC] Instalando la cadena completa en: /shared/ssl/forum.tritalk.co.uk_ecc.cer
[Mié 03 Jun 2020 06:34:48 AM UTC] Ejecutando el comando de recarga: sv reload nginx
advertencia: nginx: no se pudo abrir supervise/ok: el archivo no existe
[Mié 03 Jun 2020 06:34:48 AM UTC] Error de recarga para :
runsvdir iniciado, PID es 627
ok: run: redis: (pid 638) 0s
ok: run: postgres: (pid 636) 0s
chgrp: grupo inválido: 'syslog'
rsyslogd: imklog: no se pudo abrir el log del kernel (/proc/kmsg): Operación no permitida.
rsyslogd: falla al activar el módulo imklog [v8.1901.0 intenta en https://www.rsyslog.com/e/2145 ]
pid del supervisor: 639 pid de unicorn: 665

Dentro del contenedor intenté el comando, no estoy seguro si era eso a lo que te referías

tritalk@TriTalk-Discourse:/var/discourse$ sudo ./launcher enter app
root@TriTalk-Discourse-app:/var/www/discourse# curl http://localhost:8080
curl: (7) Error al conectar con localhost puerto 8080: Conexión rechazada

Sí, app.yml, pero por favor elimina cualquier contraseña o información sensible.

## this is the all-in-one, standalone Discourse Docker container template
##
## After making changes to this file, you MUST rebuild
## /var/discourse/launcher rebuild app
##
## BE *VERY* CAREFUL WHEN EDITING!
## YAML FILES ARE SUPER SUPER SENSITIVE TO MISTAKES IN WHITESPACE OR ALIGNMENT!
## visit http://www.yamllint.com/ to validate this file as needed

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Descomenta estas dos líneas si deseas agregar Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## ¿Qué puertos TCP/IP debe exponer este contenedor?
## Si deseas que Discourse comparta un puerto con otro servidor web como Apache o nginx,
## consulta https://meta.discourse.org/t/17247 para más detalles
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Establece db_shared_buffers en un máximo del 25% de la memoria total.
  ## se establecerá automáticamente por bootstrap según la RAM detectada, o puedes sobrescribirlo
  db_shared_buffers: "128MB"

  ## puede mejorar el rendimiento de ordenación, pero aumenta el uso de memoria por conexión
  #db_work_mem: "40MB"

  ## ¿Qué revisión de Git debe usar este contenedor? (por defecto: tests-passed)
  #version: tests-passed

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## ¿Cuántas solicitudes web simultáneas se admiten? Depende de la memoria y los núcleos de CPU.
  ## se establecerá automáticamente por bootstrap según los CPUs detectados, o puedes sobrescribirlo
  UNICORN_WORKERS: 2

  ## TODO: El nombre de dominio al que responderá esta instancia de Discourse
## Requerido. Discourse no funcionará con una dirección IP sin nombre.
  DISCOURSE_HOSTNAME: forum.xxxx.co.uk

  ## Descomenta si deseas que el contenedor se inicie con el mismo
  ## nombre de host (opción -h) que el especificado anteriormente (por defecto "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de correos electrónicos separados por comas que serán administradores y desarrolladores
  ## en el registro inicial, ejemplo 'usuario1@ejemplo.com,usuario2@ejemplo.com'
  DISCOURSE_DEVELOPER_EMAILS: 'admin@xxxx.co.uk'

  ## TODO: El servidor de correo SMTP utilizado para validar nuevas cuentas y enviar notificaciones
  # Se requieren la dirección SMTP, el nombre de usuario y la contraseña
  # ¡ADVERTENCIA: el carácter '#' en la contraseña SMTP puede causar problemas!
  DISCOURSE_SMTP_ADDRESS: in-v3.mailjet.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: xxxx
  DISCOURSE_SMTP_PASSWORD: "xxxx"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, por defecto true)

  ## Si agregaste la plantilla de Lets Encrypt, descomenta a continuación para obtener un certificado SSL gratuito
  LETSENCRYPT_ACCOUNT_EMAIL: admin@xxxx.co.uk

  ## La dirección CDN para esta instancia de Discourse (configurada para extraer)
  ## consulta https://meta.discourse.org/t/14857 para más detalles
  #DISCOURSE_CDN_URL: //discourse-cdn.example.com

## El contenedor Docker es sin estado; todos los datos se almacenan en /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Los plugins van aquí
## consulta https://meta.discourse.org/t/19157 para más detalles
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - mkdir -p plugins
          - git clone https://github.com/discourse/discourse-adplugin.git
          - git clone https://github.com/discourse/discourse-affiliate.git

## Cualquier comando personalizado para ejecutar después de la compilación
run:
  - exec: echo "Inicio de comandos personalizados"
  ## Si deseas establecer la dirección de correo electrónico 'De' para tu primer registro, descomenta y cambia:
  ## Después de obtener el primer correo de registro, vuelve a comentar la línea. Solo necesita ejecutarse una vez.
  - exec: rails r "SiteSetting.notification_email='admin@xxxx.co.uk'"
  - exec: echo "Fin de comandos personalizados"

Esto es un problema: ¿qué versión de Docker estás ejecutando y qué devuelve docker info?

¡No te equivocas! Es como si no se pudiera encontrar la base de datos; cuando entras al sitio, solo aparece una pantalla con encabezados.

Información de Docker: -

Cliente:
 Modo de depuración: false

Servidor:
 Contenedores: 2
  En ejecución: 1
  Pausados: 0
  Detenidos: 1
 Imágenes: 6
 Versión del servidor: 19.03.11
 Controlador de almacenamiento: overlay2
  Sistema de archivos subyacente: extfs
  Soporta d_type: true
  Diferencia de superposición nativa: true
 Controlador de registro: json-file
 Controlador de cgroup: cgroupfs
 Complementos:
  Volumen: local
  Red: bridge host ipvlan macvlan null overlay
  Registro: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactivo
 Tiempos de ejecución: runc
 Tiempo de ejecución predeterminado: runc
 Binario de inicialización: docker-init
 Versión de containerd: 7ad184331fa3e55e52b890ea95e65ba581ae3429
 Versión de runc: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 Versión de inicialización: fec3683
 Opciones de seguridad:
  apparmor
  seccomp
   Perfil: default
 Versión del kernel: 4.4.0-179-generic
 Sistema operativo: Ubuntu 16.04.6 LTS
 OSType: linux
 Arquitectura: x86_64
 CPUs: 1
 Memoria total: 1.953 GiB
 Nombre: TriTalk-Discourse
 ID: SYIS:XPWU:W2SP:NYNA:GFP7:DNVK:E7JF:553N:EGWF:OR7M:TV2E:A6ZX
 Directorio raíz de Docker: /var/lib/docker
 Modo de depuración: false
 Registro: https://index.docker.io/v1/
 Etiquetas:
 Experimental: false
 Registros inseguros:
  127.0.0.0/8
 Restauración en vivo habilitada: false

ADVERTENCIA: Sin soporte para límite de intercambio

¿Puedes intentar el modo seguro?

Usé el modo seguro y, si entro sin desactivar los complementos, falla. Parece que uno de los complementos está fallando desde la actualización. Los comenté en el archivo yml, reconstruí la aplicación y todo funcionó. Se trata de discourse-affiliate o discourse-adplugin. Investigaré más a fondo más adelante, pero al menos el sitio está de nuevo en funcionamiento. Gracias por toda su ayuda. Nota para mí mismo: ¡usar el modo seguro para realizar comprobaciones preliminares en el futuro!

Parece que tu área de plugins no está formateada correctamente. ¿Quizás eso esté causando el problema?

En realidad debería verse así:

        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-adplugin.git
          - git clone https://github.com/discourse/discourse-affiliate.git

(quita el -mkdir -p plugins)

Espero que eso resuelva el problema con los plugins.

Gracias, Bhanu. Lo probaré, aunque es extraño que haya funcionado hasta hoy. Quizás se haya endurecido algo en la última versión de Docker.

Puede que esté equivocado aquí. Nunca he usado ese parámetro en mis archivos yml y hasta ahora funciona perfectamente.

Hola @carlb,

Solo para tu información, Redis se utiliza principalmente para trabajos en segundo plano (junto con su compañero programador de trabajos Sidekiq). Y, por cierto, cuando estoy en el entorno de desarrollo, a menudo ejecuto Discourse sin que Redis o Sidekiq estén activos, porque no quiero que se ejecuten estos “trabajos en segundo plano”.

Por lo tanto, tu foro de Discourse debería seguir mostrando los foros principales, los temas, los usuarios, las publicaciones, etc., incluso si Redis no está en ejecución. Solo respondo esto por si acaso, porque titulaste tu tema:

Error de Redis después de la actualización

… y luego, amablemente, proporcionaste una captura de pantalla de tu foro con muchos problemas básicos que no están directamente relacionados con Redis en sí.

Gracias por la explicación. No tengo muchos conocimientos sobre cómo encaja todo esto, ya que siempre funciona y nunca he necesitado profundizar demasiado, así que esto me ayudará en el futuro. Solo asumí que, dado que todos los errores que encontré mencionan la falla al conectarse a Redis, este podría ser el problema raíz. Ni siquiera funcionaban las soluciones habituales que normalmente resuelven un problema básico.