Ошибка Redis после обновления

Привет,

После обновления через веб-интерфейс я больше не могу получить доступ к своему сайту. Я ничего не менял, просто нажал кнопку обновления! Ошибки указывают на проблемы с подключением к Redis. Я провёл множество поисков, но пока ничего полезного не нашёл. Файл production.log пуст. Система работает на Ubuntu в Digital Ocean. Всё работало отлично в течение 18 месяцев, без ошибок, за исключением случая 6 месяцев назад, когда закончилось место на диске — тогда я успешно увеличил его.

Место на диске в порядке :-

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

В файле unicorn.stdout.log видно следующее:

> 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

Сначала я попробовал вручную пересобрать приложение.

Затем выполнил apt upgrade docker, перезагрузил сервер командой reboot и пересобрал приложение с помощью ./launcher rebuild app.

Команда redis-cli ping возвращает ответ 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 показывает, что процесс запущен:

  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

Есть ли какие-то идеи? Я не эксперт и действительно не могу найти способ снова запустить систему. Возможно, я упускаю что-то простое? Есть ли ещё какие-то места, которые стоит проверить, чтобы найти проблему?

Спасибо

Ох… вижу, что вы перезагрузились и сделали все очевидные вещи…

Можете вставить конфигурацию вашего контейнера (без паролей)? Не перемешан ли там шаблон Redis?

Есть ли что-то интересное в docker logs app?

Разрешается ли localhost внутри вашего контейнера?

Привет, Сэм, извини за мою неосведомлённость,

ты имеешь в виду файл app.yml?

какие именно логи — это логи Docker? Я выполнил команду ./launcher logs app

run-parts: executing /etc/runit/1.d/00-ensure-links
run-parts: executing /etc/runit/1.d/00-fix-var-logs
run-parts: executing /etc/runit/1.d/anacron
run-parts: executing /etc/runit/1.d/cleanup-pids
Cleaning stale PID files
run-parts: executing /etc/runit/1.d/copy-env
run-parts: executing /etc/runit/1.d/letsencrypt
[Wed 03 Jun 2020 06:34:47 AM UTC] Domains not changed.
[Wed 03 Jun 2020 06:34:47 AM UTC] Skip, Next renewal time is: Wed Jul  1 00:35:12 UTC 2020
[Wed 03 Jun 2020 06:34:47 AM UTC] Add '--force' to force to renew.
[Wed 03 Jun 2020 06:34:47 AM UTC] Installing key to:/shared/ssl/forum.tritalk.co.uk.key
[Wed 03 Jun 2020 06:34:47 AM UTC] Installing full chain to:/shared/ssl/forum.tritalk.co.uk.cer
[Wed 03 Jun 2020 06:34:47 AM UTC] Run reload cmd: sv reload nginx
warning: nginx: unable to open supervise/ok: file does not exist
[Wed 03 Jun 2020 06:34:47 AM UTC] Reload error for :
[Wed 03 Jun 2020 06:34:48 AM UTC] Domains not changed.
[Wed 03 Jun 2020 06:34:48 AM UTC] Skip, Next renewal time is: Thu Jul  9 00:35:12 UTC 2020
[Wed 03 Jun 2020 06:34:48 AM UTC] Add '--force' to force to renew.
[Wed 03 Jun 2020 06:34:48 AM UTC] Installing key to:/shared/ssl/forum.tritalk.co.uk_ecc.key
[Wed 03 Jun 2020 06:34:48 AM UTC] Installing full chain to:/shared/ssl/forum.tritalk.co.uk_ecc.cer
[Wed 03 Jun 2020 06:34:48 AM UTC] Run reload cmd: sv reload nginx
warning: nginx: unable to open supervise/ok: file does not exist
[Wed 03 Jun 2020 06:34:48 AM UTC] Reload error for :
Started runsvdir, PID is 627
ok: run: redis: (pid 638) 0s
ok: run: postgres: (pid 636) 0s
chgrp: invalid group: ‘syslog’
rsyslogd: imklog: cannot open kernel log (/proc/kmsg): Operation not permitted.
rsyslogd: activation of module imklog failed [v8.1901.0 try https://www.rsyslog.com/e/2145 ]
supervisor pid: 639 unicorn pid: 665

внутри контейнера я попробовал выполнить команду, не уверен, что это то, что ты имел в виду

tritalk@TriTalk-Discourse:/var/discourse$ sudo ./launcher enter app
root@TriTalk-Discourse-app:/var/www/discourse# curl http://localhost:8080
curl: (7) Failed to connect to localhost port 8080: Connection refused

Да, app.yml, но, пожалуйста, удалите любые пароли или конфиденциальную информацию.

## Это шаблон автономного контейнера Docker Discourse «всё в одном»
##
## После внесения изменений в этот файл вы ОБЯЗАНЫ выполнить пересборку
## /var/discourse/launcher rebuild app
##
## БУДЬТЕ *ОЧЕНЬ* ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ!
## YAML-ФАЙЛЫ ЧРЕЗВЫЧАЙНО ЧУВСТВИТЕЛЬНЫ К ОШИБКАМ В ПРОБЕЛАХ И ВЫРАВНИВАНИИ!
## Для проверки файла используйте http://www.yamllint.com/

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## Какие TCP/IP-порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал порт совместно с другим веб-сервером, например Apache или nginx,
## см. https://meta.discourse.org/t/17247 для деталей
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Установите db_shared_buffers максимум в 25% от общего объема памяти.
## Значение будет автоматически установлено при загрузке на основе обнаруженной оперативной памяти, либо вы можете переопределить его
  db_shared_buffers: "128MB"

  ## Может улучшить производительность сортировки, но увеличивает использование памяти на каждое подключение
  #db_work_mem: "40MB"

  ## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
  #version: tests-passed

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

  ## Сколько одновременных веб-запросов поддерживается? Зависит от объема памяти и количества ядер процессора.
## Значение будет автоматически установлено при загрузке на основе обнаруженных процессоров, либо вы можете переопределить его
  UNICORN_WORKERS: 2

  ## TODO: Доменное имя, на которое будет отвечать этот экземпляр Discourse
## Обязательно. Discourse не будет работать с обычным IP-адресом.
  DISCOURSE_HOSTNAME: forum.xxxx.co.uk

  ## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
## именем хоста (опция -h), что указано выше (по умолчанию "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Список email-адресов через запятую, которые будут назначены администраторами и разработчиками
## при первой регистрации, например 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'admin@xxxx.co.uk'

  ## TODO: SMTP-сервер для проверки новых учетных записей и отправки уведомлений
## Адрес SMTP, имя пользователя и пароль обязательны
## ВНИМАНИЕ: символ '#' в пароле SMTP может вызвать проблемы!
  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           # (опционально, по умолчанию true)

  ## Если вы добавили шаблон Lets Encrypt, раскомментируйте ниже, чтобы получить бесплатный SSL-сертификат
  LETSENCRYPT_ACCOUNT_EMAIL: admin@xxxx.co.uk

  ## Адрес CDN для этого экземпляра Discourse (настроен на загрузку)
## см. https://meta.discourse.org/t/14857 для деталей
  #DISCOURSE_CDN_URL: //discourse-cdn.example.com

## Контейнер Docker не сохраняет состояние; все данные хранятся в /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Плагины размещаются здесь
## см. https://meta.discourse.org/t/19157 для деталей
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

## Любые пользовательские команды для выполнения после сборки
run:
  - exec: echo "Начало пользовательских команд"
  ## Если вы хотите установить адрес электронной почты в поле 'From' для первой регистрации, раскомментируйте и измените:
## После получения первого письма о регистрации закомментируйте строку обратно. Выполняется только один раз.
  - exec: rails r "SiteSetting.notification_email='admin@xxxx.co.uk'"
  - exec: echo "Конец пользовательских команд"

Это проблема. Какую версию Docker вы используете и что возвращает команда docker info?

Вы абсолютно правы! Словно база данных не найдена: при входе на сайт отображается только экран с заголовками.

Информация о Docker:

Client:
 Debug Mode: false

Server:
 Containers: 2
  Running: 1
  Paused: 0
  Stopped: 1
 Images: 6
 Server Version: 19.03.11
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 init version: fec3683
 Security Options:
  apparmor
  seccomp
   Profile: default
 Kernel Version: 4.4.0-179-generic
 Operating System: Ubuntu 16.04.6 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 1.953GiB
 Name: TriTalk-Discourse
 ID: SYIS:XPWU:W2SP:NYNA:GFP7:DNVK:E7JF:553N:EGWF:OR7M:TV2E:A6ZX
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: No swap limit support

Можете попробовать безопасный режим?

Я использовал безопасный режим, и если я захожу в него, не отключая плагины, всё падает. Похоже, что один из плагинов ведёт себя некорректно после обновления. Я закомментировал их в YAML-файле, пересобрал приложение, и всё заработало. Это либо discourse-affiliate, либо discourse-adplugin. Позже я разберусь с этим подробнее, но, по крайней мере, сайт снова работает. Спасибо за всю вашу помощь. Заметка себе: в будущем использовать безопасный режим для предварительных проверок!

Кажется, ваш раздел плагинов сформирован неправильно. Возможно, это и вызывает проблему?

На самом деле это должно выглядеть так:

        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

(удалите строку -mkdir -p plugins)
Надеюсь, это решит проблему с плагинами.

Спасибо, Бхану. Я попробую, странно, что до сегодня всё работало. Возможно, в последнем релизе Docker что-то ужесточили.

Я могу ошибаться. Я никогда не использовал этот параметр в своих yml-файлах, и пока всё работает отлично.

Привет, @carlb,

К сведению: Redis используется в основном для фоновых задач (вместе с сопутствующим планировщиком задач Sidekiq). И, на всякий случай, в среде разработки я часто запускаю Discourse без Redis и Sidekiq, так как не хочу, чтобы эти «фоновые задачи» выполнялись.

Следовательно, ваш форум Discourse должен отображать основные разделы, темы, пользователей, сообщения и т. д., даже если Redis не запущен. Я отвечаю об этом «на всякий случай», потому что вы назвали свою тему:

Ошибка Redis после обновления

… а затем любезно прикрепили скриншот вашего форума, на котором видно множество базовых проблем, которые напрямую не связаны с Redis как таковым.

Спасибо за объяснение. Я не очень хорошо разбираюсь в том, как всё это связано, так как всё всегда просто работало, и мне никогда не приходилось углубляться в детали, поэтому это поможет мне в будущем. Я просто предположил, что, поскольку все найденные мной ошибки указывают на сбой подключения к Redis, это может быть корневая причина. Ничто из обычных решений, которые всегда помогают решить базовые проблемы, не сработало.