خطأ في 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% من إجمالي الذاكرة.
  ## سيتم تعيينه تلقائيًا بواسطة bootstrap بناءً على ذاكرة الوصول العشوائي المكتشفة، أو يمكنك تجاوزها
  db_shared_buffers: "128MB"

  ## يمكن أن يحسن أداء الفرز، لكنه يضيف استخدام الذاكرة لكل اتصال
  #db_work_mem: "40MB"

  ## أي إصدار Git يجب أن تستخدمه هذه الحاوية؟ (الافتراضي: tests-passed)
  #version: tests-passed

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

  ## كم عدد طلبات الويب المتزامنة المدعومة؟ يعتمد على الذاكرة ونوى المعالج.
  ## سيتم تعيينه تلقائيًا بواسطة bootstrap بناءً على وحدات المعالجة المركزية المكتشفة، أو يمكنك تجاوزها
  UNICORN_WORKERS: 2

  ## TODO: اسم النطاق الذي ستستجيب له هذه النسخة من Discourse
  ## مطلوب. لن يعمل Discourse مع عنوان IP مجرد.
  DISCOURSE_HOSTNAME: forum.xxxx.co.uk

  ## قم بإلغاء التعليق إذا كنت تريد بدء الحاوية بنفس
  ## اسم المضيف (خيار -h) المحدد أعلاه (الافتراضي "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: قائمة عناوين البريد الإلكتروني المفصولة بفواصل سيتم تعيينها كمسؤول ومطور
  ## عند التسجيل الأولي، مثال '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 "Beginning of custom commands"
  ## إذا كنت ترغب في تعيين عنوان البريد الإلكتروني 'من' لتسجيلك الأول، قم بإلغاء التعليق وتغييره:
  ## بعد الحصول على أول بريد إلكتروني للتسجيل، قم بإعادة التعليق على السطر. يحتاج فقط إلى التشغيل مرة واحدة.
  - exec: rails r "SiteSetting.notification_email='admin@xxxx.co.uk'"
  - exec: echo "End of custom commands"

هذا أمر محير، ما إصدار Docker الذي تشغله؟ وماذا يُرجع أمر docker info؟

أنت على حق! يبدو وكأنه لا يمكن العثور على قاعدة البيانات، فعند الدخول إلى الموقع تظهر فقط شاشة تحتوي على عناوين

معلومات Docker:

العميل:
 وضع التصحيح: غير مفعل

الخادم:
 الحاويات: 2
  قيد التشغيل: 1
  متجمد: 0
  متوقف: 1
 الصور: 6
 إصدار الخادم: 19.03.11
 برنامج تخزين البيانات: overlay2
  نظام الملفات الأساسي: extfs
  يدعم d_type: نعم
  الفارق التراكبي الأصلي: نعم
 برنامج التسجيل: json-file
 برنامج مجموعة التحكم: cgroupfs
 الإضافات:
  حجم التخزين: محلي
  الشبكة: bridge host ipvlan macvlan null overlay
  السجل: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: غير نشط
 أوقات التشغيل: runc
 وقت التشغيل الافتراضي: runc
 ملف التهيئة: docker-init
 إصدار containerd: 7ad184331fa3e55e52b890ea95e65ba581ae3429
 إصدار runc: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 إصدار التهيئة: fec3683
 خيارات الأمان:
  apparmor
  seccomp
   الملف الشخصي: الافتراضي
 إصدار النواة: 4.4.0-179-generic
 نظام التشغيل: Ubuntu 16.04.6 LTS
 نوع نظام التشغيل: linux
 البنية: x86_64
 عدد المعالجات: 1
 إجمالي الذاكرة: 1.953GiB
 الاسم: TriTalk-Discourse
 المعرف: SYIS:XPWU:W2SP:NYNA:GFP7:DNVK:E7JF:553N:EGWF:OR7M:TV2E:A6ZX
 جذر Docker: /var/lib/docker
 وضع التصحيح: غير مفعل
 السجل: https://index.docker.io/v1/
 الملصقات:
 التجريبية: غير مفعل
 السجلات غير الآمنة:
  127.0.0.0/8
 الاستعادة المباشرة مفعل: غير مفعل

تحذير: لا توجد دعم لحدود الذاكرة المؤقتة (swap)

هل يمكنك تجربة الوضع الآمن؟

لقد استخدمت الوضع الآمن، وعندما أدخل دون تعطيل الإضافات، يفشل الأمر. لذا يبدو أن أحد الإضافات تسبب مشكلة منذ الترقية. قمت بإخراجها من ملف yml، وأعدت بناء التطبيق، فكل شيء يعمل الآن. المشكلة إما في إضافة 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 الأحدث.

قد أكون مخطئًا هنا. لم أستخدم هذا المعامل في ملفات YAML الخاصة بي من قبل، ومع ذلك تعمل بشكل جيد حتى الآن.

مرحبًا @carlb،

للعلم، يُستخدم Redis بشكل أساسي للوظائف الخلفية (إلى جانب مُجدول الوظائف المرافق له Sidekiq). وبالمناسبة، عندما أكون في بيئة التطوير، غالبًا ما أشغّل Discourse دون تشغيل Redis أو Sidekiq لأنني لا أريد تشغيل هذه “الوظائف الخلفية”.

لذلك، يجب أن يستمر منتدى Discourse في عرض المنتديات الأساسية والمواضيع والمستخدمين والمنشورات وما إلى ذلك، حتى لو لم يكن Redis قيد التشغيل. وأردت فقط ذكر ذلك للعلم، لأنك سمّيت موضوعك:

خطأ Redis بعد الترقية

… ثم زودتنا بصورة شاشة لمنتديك تظهر فيها العديد من المشاكل الأساسية التي لا ترتبط مباشرة بـ Redis بحد ذاته.

شكرًا لك على الشرح، فأنا لست على دراية كبيرة بكيفية تكامل كل هذه العناصر، حيث أنها تعمل دائمًا بشكل تلقائي، لذا لم أكن بحاجة للغوص في التفاصيل بعمق، وهذا ما سيساعدني في المستقبل. لقد افترضت فقط، نظرًا لأن جميع الأخطاء التي واجهتها تشير إلى فشل الاتصال بقاعدة بيانات Redis، أن هذا قد يكون السبب الجذري. كما أن أيًا من الحلول المعتادة التي عادةً ما تحل المشكلات الأساسية لم تنجح.