Redis-Fehler nach Upgrade

Hallo,

nach dem Upgrade über das Web-Frontend kann ich meine Seite nicht mehr aufrufen. Ich habe nichts geändert, nur auf die Upgrade-Schaltfläche geklickt! Die Fehler deuten auf Verbindungsprobleme mit Redis hin. Ich habe bereits viel gesucht, aber bisher keine Hilfe gefunden. Die production.log ist leer. Das System läuft unter Ubuntu auf DigitalOcean. Es hat 18 Monate lang problemlos funktioniert, außer vor sechs Monaten, als mir der Speicherplatz ausging – das habe ich damals erfolgreich behoben, indem ich den Speicherplatz erweitert habe.

Der Speicherplatz ist in Ordnung:

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

Die unicorn.stdout.log zeigt Folgendes:

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

Zuerst habe ich versucht, die App manuell neu aufzubauen.

Anschließend habe ich apt upgrade docker ausgeführt, den Server mit reboot neu gestartet und die App mit ./launcher rebuild app neu aufgebaut.

redis-cli ping liefert eine PONG-Antwort.

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 zeigt, dass Redis läuft:

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

Habt ihr eine Idee? Ich bin kein Experte und habe große Schwierigkeiten, einen Weg zu finden, um das System wieder zum Laufen zu bringen. Gibt es etwas Einfaches, das ich übersehen habe? Gibt es noch andere Stellen, die ich überprüfen könnte, um das Problem zu finden?

Vielen Dank!

Oh … ich sehe, du hast neu gestartet und alle offensichtlichen Dinge erledigt…

Kannst du deine Container-Konfiguration (ohne Passwörter) einfügen? Ist die Redis-Vorlage dabei?

Gibt es etwas Interessantes in docker logs app?

Wird localhost innerhalb deines Containers aufgelöst?

Hallo Sam, entschuldige meine mangelnde Kenntnisse,

meinst du die Datei app.yml?

Welche Logs sind die Docker-Logs? Ich habe folgendes ausgeführt: ./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

Im Container habe ich den Befehl versucht, bin mir aber nicht sicher, ob das das war, was du meintest:

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

Ja, app.yml, aber entferne bitte alle Passwörter oder sensiblen Informationen.

## Dies ist die All-in-One, eigenständige Discourse Docker-Container-Vorlage
##
## Nach Änderungen an dieser Datei MUSS neu aufgebaut werden
## /var/discourse/launcher rebuild app
##
## SEI *SEHR* VORSICHTIG BEI DER BEARBEITUNG!
## YAML-DATEIEN SIND EXTREM EXTREM EMPFINDLICH GEGENÜBER FEHLERN IN LEERZEICHEN ODER AUSRICHTUNG!
## Besuchen Sie http://www.yamllint.com/, um diese Datei bei Bedarf zu validieren

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Kommentieren Sie diese beiden Zeilen aus, wenn Sie Lets Encrypt (https) hinzufügen möchten
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## Welche TCP/IP-Ports sollte dieser Container freigeben?
## Wenn Sie möchten, dass Discourse einen Port mit einem anderen Webserver wie Apache oder nginx teilt,
## siehe https://meta.discourse.org/t/17247 für Details
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Setzen Sie db_shared_buffers auf maximal 25 % des gesamten Speichers.
  ## Wird automatisch vom Bootstrap basierend auf dem erkannten RAM eingestellt, oder Sie können es überschreiben
  db_shared_buffers: "128MB"

  ## Kann die Sortierleistung verbessern, erhöht jedoch den Speicherverbrauch pro Verbindung
  #db_work_mem: "40MB"

  ## Welche Git-Revision soll dieser Container verwenden? (Standard: tests-passed)
  #version: tests-passed

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

  ## Wie viele gleichzeitige Webanfragen werden unterstützt? Hängt vom Speicher und den CPU-Kernen ab.
  ## Wird automatisch vom Bootstrap basierend auf den erkannten CPUs eingestellt, oder Sie können es überschreiben
  UNICORN_WORKERS: 2

  ## TODO: Der Domänenname, auf den diese Discourse-Instanz reagiert
  ## Erforderlich. Discourse funktioniert nicht mit einer bloßen IP-Nummer.
  DISCOURSE_HOSTNAME: forum.xxxx.co.uk

  ## Kommentieren Sie dies aus, wenn Sie möchten, dass der Container mit dem gleichen
  ## Hostnamen (-h-Option) wie oben angegeben gestartet wird (Standard: "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Liste der durch Komma getrennten E-Mail-Adressen, die bei der ersten Anmeldung zu Administratoren und Entwicklern werden
  ## Beispiel: 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'admin@xxxx.co.uk'

  ## TODO: Der SMTP-Mailserver, der zur Validierung neuer Konten und zum Senden von Benachrichtigungen verwendet wird
  # SMTP-Adresse, Benutzername und Passwort sind erforderlich
  # WARNUNG: Das Zeichen '#' im SMTP-Passwort kann Probleme verursachen!
  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           # (optional, Standard: true)

  ## Wenn Sie die Lets Encrypt-Vorlage hinzugefügt haben, kommentieren Sie unten aus, um ein kostenloses SSL-Zertifikat zu erhalten
  LETSENCRYPT_ACCOUNT_EMAIL: admin@xxxx.co.uk

  ## Die CDN-Adresse für diese Discourse-Instanz (konfiguriert zum Abrufen)
  ## siehe https://meta.discourse.org/t/14857 für Details
  #DISCOURSE_CDN_URL: //discourse-cdn.example.com

## Der Docker-Container ist zustandslos; alle Daten werden in /shared gespeichert
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Plugins gehen hier
## siehe https://meta.discourse.org/t/19157 für Details
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

## Beliebige benutzerdefinierte Befehle, die nach dem Build ausgeführt werden sollen
run:
  - exec: echo "Beginn der benutzerdefinierten Befehle"
  ## Wenn Sie die 'From'-E-Mail-Adresse für Ihre erste Registrierung festlegen möchten, kommentieren Sie dies aus und ändern Sie:
  ## Nach Erhalt der ersten Anmelde-E-Mail diesen Kommentar wieder aktivieren. Es muss nur einmal ausgeführt werden.
  - exec: rails r "SiteSetting.notification_email='admin@xxxx.co.uk'"
  - exec: echo "Ende der benutzerdefinierten Befehle"

Das ist ein Problem. Welche Docker-Version verwendest du? Was gibt docker info aus?

Du liegst nicht falsch! Es ist, als ob die Datenbank nicht gefunden werden kann. Wenn du auf die Seite gehst, siehst du nur einen Bildschirm mit Überschriften.

Docker-Informationen:

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

Kannst du den abgesicherten Modus ausprobieren?

Ich habe den abgesicherten Modus verwendet, und wenn ich hineingehe und die Plugins nicht deaktiviere, schlägt es fehl. Es scheint also, dass eines der Plugins seit dem Upgrade Probleme macht. Ich habe sie aus der YAML-Datei auskommentiert, die App neu erstellt, und alles funktioniert wieder. Es ist entweder discourse-affiliate oder discourse-adplugin. Ich werde das später weiter untersuchen, aber zumindest ist die Seite wieder online und läuft. Danke für eure ganze Hilfe. Merksatz für mich: In Zukunft den abgesicherten Modus für vorläufige Checks verwenden!

Dein Plugins-Bereich scheint nicht korrekt formatiert zu sein. Vielleicht ist das die Ursache des Problems?

Es sollte eigentlich so aussehen:

        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

(Entferne -mkdir -p plugins)

Hoffentlich löst das das Problem mit den Plugins.

Danke, Bhanu. Ich werde es versuchen. Seltsam, dass es bis heute funktioniert hat. Vielleicht wurde in der neuesten Docker-Version etwas verschärft.

Ich könnte mich hier irren. Ich habe diesen Parameter in meinen YML-Dateien noch nie verwendet, und bisher funktioniert alles einwandfrei.

Hallo @carlb,

Zur Info: Redis wird hauptsächlich für Hintergrundjobs verwendet (zusammen mit dem dazugehörigen Job-Scheduler Sidekiq). Übrigens: In der Entwicklungsumgebung lasse ich Discourse oft ohne Redis oder Sidekiq laufen, da ich nicht möchte, dass diese „Hintergrundjobs

Danke für die Erklärung. Ich habe nicht viel Ahnung davon, wie all das zusammenhängt, da es einfach immer funktioniert hat und ich mich nie tiefgehend damit beschäftigen musste. Das hilft mir also für die Zukunft. Ich ging einfach davon aus, da alle Fehler, die ich fand, einen Verbindungsfehler zu Redis erwähnen, dass dies die Ursache sein könnte. Auch die üblichen Lösungen, die bei grundlegenden Problemen immer helfen, haben diesmal nicht funktioniert.