بعد الترقية عبر واجهة الويب الأمامية، لم أعد أستطيع الوصول إلى موقعي. لم أقم بأي تغييرات، فقط ضغطت على زر الترقية! تشير الأخطاء إلى وجود مشاكل في الاتصال بـ Redis. لقد قمت بالكثير من البحث ولكن لم أجد أي شيء يساعدني حتى الآن. ملف production.log فارغ. النظام يعمل على Ubuntu على Digital Ocean، وقد عمل بشكل جيد لمدة 18 شهرًا دون أخطاء باستثناء عندما نفدت مساحة القرص قبل 6 أشهر، حيث قمت بنجاح بزيادة تلك المساحة.
> 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
هل لديك أي أفكار؟ لست خبيرًا وأجد صعوبة كبيرة في العثور على طريقة لإعادة تشغيل النظام. هل هناك أي شيء بسيط قد أغفله؟ هل هناك أي مكان آخر يمكنني التحقق منه قد يساعدني في العثور على المشكلة؟
أي سجلات تقصد بسجلات 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
## هذا قالب حاوية 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"
العميل:
وضع التصحيح: غير مفعل
الخادم:
الحاويات: 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. سأقوم بالتحقيق بشكل أعمق لاحقًا، لكن على الأقل الموقع يعمل مرة أخرى. شكرًا لكم على كل مساعدتكم. ملاحظة لي: استخدم الوضع الآمن لإجراء الفحوصات الأولية في المستقبل!
للعلم، يُستخدم Redis بشكل أساسي للوظائف الخلفية (إلى جانب مُجدول الوظائف المرافق له Sidekiq). وبالمناسبة، عندما أكون في بيئة التطوير، غالبًا ما أشغّل Discourse دون تشغيل Redis أو Sidekiq لأنني لا أريد تشغيل هذه “الوظائف الخلفية”.
لذلك، يجب أن يستمر منتدى Discourse في عرض المنتديات الأساسية والمواضيع والمستخدمين والمنشورات وما إلى ذلك، حتى لو لم يكن Redis قيد التشغيل. وأردت فقط ذكر ذلك للعلم، لأنك سمّيت موضوعك:
خطأ Redis بعد الترقية
… ثم زودتنا بصورة شاشة لمنتديك تظهر فيها العديد من المشاكل الأساسية التي لا ترتبط مباشرة بـ Redis بحد ذاته.
شكرًا لك على الشرح، فأنا لست على دراية كبيرة بكيفية تكامل كل هذه العناصر، حيث أنها تعمل دائمًا بشكل تلقائي، لذا لم أكن بحاجة للغوص في التفاصيل بعمق، وهذا ما سيساعدني في المستقبل. لقد افترضت فقط، نظرًا لأن جميع الأخطاء التي واجهتها تشير إلى فشل الاتصال بقاعدة بيانات Redis، أن هذا قد يكون السبب الجذري. كما أن أيًا من الحلول المعتادة التي عادةً ما تحل المشكلات الأساسية لم تنجح.