تحذير! إذا كانت قاعدة البيانات لديك كبيرة جداً، ستحتاج إلى مساحة إضافية كبيرة على القرص (3 أضعاف حجم قاعدة البيانات) ويجب أن تكون حذراً للغاية أثناء هذا التحديث!
لقد قمنا بتطبيق التغييرات اللازمة لترقية صورة Docker إلى PostgreSQL 18. أي مسؤول موقع يقوم بإعادة بناء Discourse من سطر الأوامر سيتم ترقية موقعه من PostgreSQL 15 السابق إلى PostgreSQL 18. يرجى ملاحظة أنه إذا كنت قد امتنعت عن الترقية عندما حدث تحديث PostgreSQL 15 في عام 2025، يمكنك تخطي تلك الترقية والانتقال مباشرة إلى PostgreSQL 18.
إذا كنت قد امتنعت عن الترقية سابقاً، قم بتغيير قالب PostgreSQL في ملف app.yml من templates/postgres.13.template.yml إلى templates/postgres.template.yml.
وكما هو الحال مع أي ترقية، يُنصح بقوة بأخذ نسخة احتياطية قبل القيام بأي شيء.
تغييرات اللغة والإعدادات المحلية (Locale)
في السابق، كنا نشهد حدوث تلف في الفهارس عند تحديث glibc، مثلما يحدث أثناء ترقية نظام التشغيل. منذ PostgreSQL 17، يوجد مزود إعدادات محلية مدمج جديد، وهو مستقل عن glibc الخاص بنظام التشغيل وبالتالي يكون مستقراً عبر الإصدارات. كجزء من هذه الترقية، نحن نتحول إلى استخدام هذا المزود المدمج باستخدام إعداد اللغة C.UTF-8. يستخدم هذا الإعداد ترتيب نقاط الرموز، ونوصي به لأسباب الاستقرار المذكورة أعلاه.
من أجل إنجاز تغيير إعدادات اللغة، نحتاج أولاً إلى إنشاء مجموعة قواعد البيانات (DB cluster) الجديدة باستخدام مزود الإعدادات المحلية المدمج، ثم نقوم بتصدير واستعادة قاعدة البيانات في هذه المجموعة. لهذا السبب، تكون متطلبات مساحة القرص أكبر من الترقيات السابقة حيث كنا نقوم بترقية في الموقع (in-place).
التحديث
دليل التثبيت الرسمي (حاوية واحدة)
في المرة القادمة التي تقوم فيها بإعادة البناء، ستظهر لك هذه الرسالة في النهاية:
-------------------------------------------------------------------------------------
اكتملت ترقية PostgreSQL
قاعدة البيانات القديمة (الإصدار 15) مخزنة في /shared/postgres_data_old
لاستكمال الترقية، قم بإعادة البناء مرة أخرى باستخدام:
./launcher rebuild app
-------------------------------------------------------------------------------------
هذا يعني أن كل شيء سار على ما يرام أثناء الترقية! تحتاج فقط إلى إصدار أمر إعادة بناء جديد لجعل موقعك يعمل مرة أخرى.
تثبيت حاوية البيانات
إذا كنت تشغل إعداداً يعتمد على حاوية بيانات مخصصة بناءً على العينة المقدمة في مستودع discourse_docker الخاص بنا، فأنت تريد التأكد من أنك تقوم بإيقاف تشغيل PostgreSQL بطريقة آمنة ونظيفة.
في أيامنا هذه، لدينا مهام في الخلفية تقوم بتشغيل استعلامات تمتد لعدة دقائق، لذا فإن إيقاف تشغيل حاوية الويب سيساعد في إيقاف حاوية البيانات بشكل آمن.
./launcher stop web_only
./launcher stop data
./launcher rebuild data
./launcher rebuild data
./launcher rebuild web_only
قبل إصدار أمر إعادة البناء الأول لحاوية البيانات، يمكنك تتبع سجل PostgreSQL (tail) لمعرفة ما إذا كان قد تم إيقافه بشكل صحيح.
تشغيل أمر tail -f shared/standalone/log/var-log/postgres/current يجب أن يعطيك السجل التالي إذا كان الإيقاف نظيفاً:
2025-01-24 09:19:06.437 UTC [37] LOG: received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG: background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG: shutting down
2025-01-24 09:19:06.468 UTC [37] LOG: database system is shut down
تأجيل التحديث
إذا كنت بحاجة إلى تأجيل التحديث أثناء إعادة البناء القادمة، يمكنك تبديل قالب PostgreSQL في ملف app.yml الخاص بك عن طريق تغيير "templates/postgres.template.yml" إلى "templates/postgres.15.template.yml".
لا يُنصح بذلك، حيث قد ينسى بعض مسؤولي المواقع عكس هذا التغيير لاحقاً.
مهام اختيارية بعد التحديث
تحسين إحصائيات PostgreSQL
بعد التحديث، لن تكون إحصائيات الجداول متاحةً في PostgreSQL الجديد. يمكنك إنشاؤها باستخدام:
docker exec -u postgres app \
/usr/lib/postgresql/18/bin/vacuumdb -d discourse --analyze-in-stages
تنظيف البيانات القديمة
للتثبيت القياسي، يمكنك حذف البيانات القديمة بتنسيق PG15 باستخدام الأمر التالي:
cd /var/discourse
./launcher cleanup
إذا كانت لديك حاوية بيانات منفصلة، ستحتاج إلى إزالة النسخة الاحتياطية على النحو التالي:
rm -fr /var/discourse/shared/data/postgres_data_old/
الأسئلة الشائعة
لم يتم إيقاف تشغيل المجموعة المصدرية بشكل نظيف
إذا واجهت فشل في الترقية مع الرسالة أعلاه، يمكنك محاولة نهج أبسط لإعادة الوضع إلى حالة أفضل.
أعد تشغيل الحاوية القديمة باستخدام ./launcher start app. انتظر بضع دقائق حتى تعود للعمل.
الآن قم بإيقافها مرة أخرى باستخدام ./launcher stop app. بعد ذلك، تابع السجلات (tail logs) لمعرفة ما إذا كان الإيقاف نظيفاً:
tail -f shared/standalone/log/var-log/postgres/current
2025-01-24 09:19:06.437 UTC [37] LOG: received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG: background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG: shutting down
2025-01-24 09:19:06.468 UTC [37] LOG: database system is shut down
إذا لم تدل السجلات بأن قاعدة البيانات قد أُوقفت، يمكنك إعادة تشغيل الحاوية القديمة مرة أخرى، الدخول إليها باستخدام ./launcher enter app، تشغيل هذه الأوامر، ثم متابعة السجلات مرة أخرى عند الانتهاء.
export SVWAIT=300
sv stop nginx
sv stop unicorn
sv stop postgres
exit
إذا بدت السجلات كما هو موضح أعلاه، يمكنك الآن محاولة الترقية مرة أخرى باستخدام ./launcher rebuild app.
قيم lc_collate لقاعدة البيانات “postgres” غير متطابقة
يحدث هذا الخطأ إذا كنت تستخدم إعدادات لغة غير افتراضية لقاعدة البيانات. تم الإبلاغ عن أنك بحاجة إلى 3 متغيرات لكي تنجح العملية. تأكد من أن قسم env: في ملف app.yml الخاص بك يحتوي على الأسطر الثلاثة التالية:
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
مع تغيير en_US.UTF-8 إلى إعداد اللغة الخاص بك.
كل عملية إعادة بناء تقوم بالترقية مرة أخرى (حلقة ترقية)
عند حدوث ذلك، ستحتوي سجلات الترقية الخاصة بك على
mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old/postgres_data': Directory not empty
mv: cannot move '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new': Directory not empty
هذا يعني أن هناك ملفات من الترقية الأخيرة لا تزال موجودة. قم بنقلها إلى مكان آخر قبل المتابعة.
لقد تخطيت تحديث PostgreSQL 15، ماذا أفعل الآن؟
يمكنك اتباع التعليمات القياسية في أعلى هذا الدليل، وسيقوم بالترقية من إصدارك إلى 18 دون أي مشاكل.