أعتقد أن المشغل تم بناؤه قبل وجود دوكر كومبوز:
لا يتميز Docker Compose بالوظائف المطلوبة. يتيح بناء قوالب ملفات Docker الخاصة بـ Discourse نتائج Docker مرنة. مع Compose، كل ما لديك هو مجموعة محتملة من ملفات Docker الثابتة التي يمكن أن تؤدي إلى مجموعة من الحاويات.
في إعداد Discourse الخاص بي، أستخدم حاوية واحدة مع Discourse و nginx باستخدام مقبس UNIX. PostgreSQL و Redis هما خدمة على المضيف. هذا انحراف كبير عن الإعداد الافتراضي، ولكنه ممكن وجاهز للاستخدام.
إنه ممكن جزئيًا باستخدام Compose، ربما عن طريق استخدام ميزة التوصيف (profile) التي تم تصميمها بشكل سيء. ولكن حتى ذلك الحين، فإنه فوضوي للغاية. أو ستحتاج إلى تقديم ملفات Compose مختلفة لكل تنويع.
أنت فقط تنقل المشكلة.
سيكون إعداد Compose نظيف لـ Discourse هو الخدمات التالية في حاويات منفصلة:
- Discourse
- nginx
- PostgreSQL
- Redis
يحتاج Discourse و nginx إلى مشاركة وحدة تخزين، لا مشكلة.
PostgreSQL و Redis… هذه أشياء قد ترغب في استضافتها في مكان آخر، ولا يكون لديك حاوية خاصة بـ Discourse لها. والآن يصبح Docker Compose مشكلة، حيث سيقوم الأمر docker compose up -d بتشغيل PostgreSQL غير المرغوب فيه. حسنًا، لذا نجعله docker compose --profile postgresql up -d لتشغيل إعداد Discourse الأساسي، وحاوية PostgreSQL. و docker compose --profile postgresql --profile redis up -d لإعداد حاويات Discourse المكتفية ذاتيًا “الكاملة”. من الأفضل ألا تنسى وسيطة --profile ...، لأن ذلك سيؤدي إلى المزيد من المشاكل.
لذلك، لتحسين تجربة المستخدم (UX)، تقوم بإنشاء مشغل للعناية بإنشاء أمر Docker Compose المطلوب. الآن نحن نوعًا ما عدنا إلى نقطة البداية. باستثناء أن التعديلات على حاوية nginx ليست ممكنة بعد. لذا أحتاج إلى حاوية nginx-http وحاوية nginx-unix التي يجب أن تكون متبادلة الاستبعاد؟ …
بالتأكيد يمكن أن تكون إدارة الإضافات أفضل، ولكن القيام بذلك باستخدام Docker Compose سيكون أمرًا صعبًا للغاية.
إذًا، لتلخيص الأمر. لن تكون هناك صورة دوكر مناسبة.
أما بالنسبة للكمية التي لا تصدق من المعرفة غير الصحيحة حول ماهية دوكر وكيف تعمل: What is Docker? | Docker Docs
يمكنك مشاركة الحاويات أثناء عملك، والتأكد من أن كل من تشاركه يحصل على نفس الحاوية التي تعمل بنفس الطريقة.
أيضًا - مع “المشغل” المحبوب - كيف يمكنني تشغيل ديسكورس على مجموعة k8s نظرًا لعدم وجود صورة دوكر يمكنني استهلاكها ونشرها هناك؟
حقًا…
يجب تشغيل هذا البرنامج النصي كـ root. يرجى استخدام sudo أو تسجيل الدخول كـ root أولاً.
لا، شكرًا لك. لا أحب تشغيل برامج نصية عشوائية من الإنترنت. أريد فقط صورة دوكر لطيفة يمكنني تشغيلها بأمان في عزلة ![]()
لقد نجحت في نشر Discourse إلى الإنتاج باستخدام Docker Compose مع الصورة المنشورة، وكذلك فعل العملاء.
ومع ذلك، نعم، الأمر فوضوي ويتطلب قدرًا معقولًا من العمل المخصص.
من الأسهل بكثير الالتزام بالتثبيت القياسي باستخدام مشغل CDCK ما لم يكن عليك حقًا استخدام طريقة مختلفة لأن لديك وجهة نظر متحيزة، أو بنية معمارية محددة، أو متطلبات خاصة أخرى.
إن استخدام نهج لا يعتمد على الإرشاد والتوجيه ليس “متحيزًا أو خاصًا أو استثنائيًا” ![]()
على أي حال - الدليل هو وجود صورة دوكر أصلية من discourse. الأمر بهذه البساطة.
لقد حاولت استخدام الدليل الرسمي و “المشغل” فقط للعب بالإعداد - دون جدوى (باستثناء فحص سخيف للمستخدم ما إذا كان المستخدم هو الجذر، وهو ما يطلب المشاكل فقط).
ثم لجأت إلى صورة bitnami (وملف التكوين المقترح الخاص بهم) من https://hub.docker.com/r/bitnami/discourse و بعد أمر docker compose up واحد (ومجموعة من أخطاء SQL [وهو ما لا يبشر بالخير] بالإضافة إلى تحذير من ruby [نفس التحذير] حصلت على نسخة عاملة من discourse:
معقد للغاية و “سحر غير قياسي” …
لذا مرة أخرى - لماذا لا توجد صورة عادية؟
بالبحث في المصادر والمستودعات وجدت أن الصورة الأساسية مستخدمة (https://hub.docker.com/r/discourse/base/) على الرغم من أن إصداراتها / علاماتها فاجأتني (https://hub.docker.com/r/discourse/base/tags) … لا توجد إصدارات منطقية تساءلت؟ وبالفعل، بالنظر إلى المستودع الرئيسي لم يبدو أن هناك أي إصدارات ولكن مهلاً - على الأقل هناك إصدارات موسومة بشكل صحيح (Tags · discourse/discourse · GitHub).
الآن يتساءل المرء - لماذا لا توجد صور مطابقة في دوكر هاب الرئيسي؟
لذا نعم - بالنظر إلى كيفية تنظيم الأشياء أتفق:
![]()
من ناحية أخرى (أو بالأحرى: “كيف يجب أن تكون الأشياء”)، مشروع مثال (أصغر في النطاق، ولكن المنطق قائم): GitHub - miniflux/v2: Minimalist and opinionated feed reader.
لديه إصدارات منطقية: Releases · miniflux/v2 · GitHub
والتي لديها صور مقابلة موسومة بشكل صحيح: https://hub.docker.com/r/miniflux/miniflux/tags
ثم الترقية هي مجرد تبديل الإصدار من x إلى y (أو استخدام علامة latest بحيث سيؤدي إيقاف / سحب / بدء بسيط إلى الحصول على الإصدار المحدث (والذي سيقوم بتشغيل جميع عمليات الترحيل المطلوبة تلقائيًا)
(أوه، والصورة أصغر بحوالي 70 مرة ولكن هذه قصة أخرى)
عمل جيد!
سؤالان فقط… ما هي أخطاء SQL وتحذيرات ruby؟ لست على دراية بها. ولكن ربما يكون ذلك بسبب أنني استخدمت docker وأشياء أخرى بطريقة خاطئة تمامًا ![]()
تقوم بشيء كهذا:
./launcher bootstrap myimage
# الأمر الذي يدفع هذه الصورة إلى مكانك المفضل لتشغيل الصور
./launcher start-cmd
وهذا يمنحك متغيرات البيئة التي تحتاج إلى تعيينها لتشغيل صورتك.
إنه ليس بالأمر الصعب حقًا. يمكنك حتى دمجه في إجراء github بحيث يقوم ببناء صورتك ودفعها إلى مستودع docker الخاص بك. بالنظر إلى الالتزامات تجاه docker_compose، يبدو أن هناك تحركات لإنتاج صورة لا تحتاج إلى تهيئة، أو على الأقل تسهيل قيامها ببعض المهام المطلوبة (ترحيل قاعدة البيانات، تجميع الأصول مسبقًا ودفعها إلى s3 وما إلى ذلك). لقد فعلت هذا للعملاء الذين أرادوا استخدام k8s أو AWS image-launcher-thingy (لا أتذكر اسمها).
لقد فكرت عدة مرات في تقديم مثل هذه الصور المعدة مسبقًا كخدمة، لكنني لم أجد أبدًا من يرغب في الدفع مقابل ذلك.
ولكن هناك مجموعة من القطع الصغيرة. أفضل ما يمكنني إخباره هو أن CDCK يستخدم المُشغّل لبناء الصور، لكنهم يقومون بتشغيلها وإدارتها بأدوات أخرى، تمامًا كما تريد. وعندما بدأوا، لم يكن docker-compose طريقة لائقة للقيام بذلك، وبحلول الوقت الذي كان فيه كذلك، كانوا قد جعلوا المُشغّل يعمل بالفعل، لذلك لم يكن إيجاد طريقة لترحيل الجميع من المُشغّل إلى شيء آخر خيارًا حقًا.
إذا كانت صور bitnami تعمل معك، فاستخدمها، ولكن إذا لم تكن كذلك، فستحتاج إلى الحصول على مساعدة من شخص يستخدمها، وهو في الغالب لا أحد هنا.
Eh… I already deleted the file and whole setup as I found NodeBB which feels less user hostile when it comes to deployment (guide: Docker - NodeBB Documentation; simple docker-compose file with 3 services: nodebb, postgres and redis: NodeBB/docker-compose-pgsql.yml at master · NodeBB/NodeBB · GitHub; and nicely tagged images: Package nodebb · GitHub)
However, I got the image and here are the relevant errors:
- seems like sql schema issue:
postgresql-1 | 2025-07-06 17:15:40.518 GMT [155] ERROR: relation "translation_overrides" does not exist at character 523
postgresql-1 | 2025-07-06 17:15:40.518 GMT [155] STATEMENT: SELECT a.attname, format_type(a.atttypid, a.atttypmod),
postgresql-1 | pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
postgresql-1 | c.collname, col_description(a.attrelid, a.attnum) AS comment,
postgresql-1 | attidentity AS identity,
postgresql-1 | attgenerated as attgenerated
postgresql-1 | FROM pg_attribute a
postgresql-1 | LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
postgresql-1 | LEFT JOIN pg_type t ON a.atttypid = t.oid
postgresql-1 | LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation
postgresql-1 | WHERE a.attrelid = '"translation_overrides"'::regclass
postgresql-1 | AND a.attnum > 0 AND NOT a.attisdropped
postgresql-1 | ORDER BY a.attnum
postgresql-1 |
postgresql-1 | 2025-07-06 17:15:40.616 GMT [156] ERROR: relation "translation_overrides" does not exist at character 523
postgresql-1 | 2025-07-06 17:15:40.616 GMT [156] STATEMENT: SELECT a.attname, format_type(a.atttypid, a.atttypmod),
postgresql-1 | pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
postgresql-1 | c.collname, col_description(a.attrelid, a.attnum) AS comment,
postgresql-1 | attidentity AS identity,
postgresql-1 | attgenerated as attgenerated
postgresql-1 | FROM pg_attribute a
postgresql-1 | LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
postgresql-1 | LEFT JOIN pg_type t ON a.atttypid = t.oid
postgresql-1 | LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation
postgresql-1 | WHERE a.attrelid = '"translation_overrides"'::regclass
postgresql-1 | AND a.attnum > 0 AND NOT a.attisdropped
postgresql-1 | ORDER BY a.attnum
- ruby warnings (both in discourse as well as sidekiq containers, which kinda makes sense as they use same image :D):
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:5: warning: already initialized constant DiscourseAutomation::Scripts::ADD_USER_TO_GROUP_THROUGH_CUSTOM_FIELD
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:5: warning: previous definition of ADD_USER_TO_GROUP_THROUGH_CUSTOM_FIELD was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:6: warning: already initialized constant DiscourseAutomation::Scripts::APPEND_LAST_CHECKED_BY
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:6: warning: previous definition of APPEND_LAST_CHECKED_BY was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:7: warning: already initialized constant DiscourseAutomation::Scripts::APPEND_LAST_EDITED_BY
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:7: warning: previous definition of APPEND_LAST_EDITED_BY was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:8: warning: already initialized constant DiscourseAutomation::Scripts::AUTO_RESPONDER
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:8: warning: previous definition of AUTO_RESPONDER was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:9: warning: already initialized constant DiscourseAutomation::Scripts::AUTO_TAG_TOPIC
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:9: warning: previous definition of AUTO_TAG_TOPIC was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:10: warning: already initialized constant DiscourseAutomation::Scripts::BANNER_TOPIC
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:10: warning: previous definition of BANNER_TOPIC was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:11: warning: already initialized constant DiscourseAutomation::Scripts::CLOSE_TOPIC
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:11: warning: previous definition of CLOSE_TOPIC was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:12: warning: already initialized constant DiscourseAutomation::Scripts::FLAG_POST_ON_WORDS
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:12: warning: previous definition of FLAG_POST_ON_WORDS was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:13: warning: already initialized constant DiscourseAutomation::Scripts::GIFT_EXCHANGE
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:13: warning: previous definition of GIFT_EXCHANGE was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:14: warning: already initialized constant DiscourseAutomation::Scripts::GROUP_CATEGORY_NOTIFICATION_DEFAULT
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:14: warning: previous definition of GROUP_CATEGORY_NOTIFICATION_DEFAULT was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:15: warning: already initialized constant DiscourseAutomation::Scripts::PIN_TOPIC
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:15: warning: previous definition of PIN_TOPIC was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:16: warning: already initialized constant DiscourseAutomation::Scripts::POST
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:16: warning: previous definition of POST was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:17: warning: already initialized constant DiscourseAutomation::Scripts::SEND_PMS
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:17: warning: previous definition of SEND_PMS was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:18: warning: already initialized constant DiscourseAutomation::Scripts::SUSPEND_USER_BY_EMAIL
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:18: warning: previous definition of SUSPEND_USER_BY_EMAIL was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:19: warning: already initialized constant DiscourseAutomation::Scripts::TOPIC
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:19: warning: previous definition of TOPIC was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:20: warning: already initialized constant DiscourseAutomation::Scripts::TOPIC_REQUIRED_WORDS
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:20: warning: previous definition of TOPIC_REQUIRED_WORDS was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:21: warning: already initialized constant DiscourseAutomation::Scripts::USER_GLOBAL_NOTICE
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:21: warning: previous definition of USER_GLOBAL_NOTICE was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:22: warning: already initialized constant DiscourseAutomation::Scripts::USER_GROUP_MEMBERSHIP_THROUGH_BADGE
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:22: warning: previous definition of USER_GROUP_MEMBERSHIP_THROUGH_BADGE was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:23: warning: already initialized constant DiscourseAutomation::Scripts::ZAPIER_WEBHOOK
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:23: warning: previous definition of ZAPIER_WEBHOOK was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:5: warning: already initialized constant DiscourseAutomation::Triggers::AFTER_POST_COOK
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:5: warning: previous definition of AFTER_POST_COOK was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:6: warning: already initialized constant DiscourseAutomation::Triggers::API_CALL
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:6: warning: previous definition of API_CALL was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:7: warning: already initialized constant DiscourseAutomation::Triggers::CATEGORY_CREATED_EDITED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:7: warning: previous definition of CATEGORY_CREATED_EDITED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:8: warning: already initialized constant DiscourseAutomation::Triggers::PM_CREATED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:8: warning: previous definition of PM_CREATED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:9: warning: already initialized constant DiscourseAutomation::Triggers::TOPIC_TAGS_CHANGED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:9: warning: previous definition of TOPIC_TAGS_CHANGED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:10: warning: already initialized constant DiscourseAutomation::Triggers::POINT_IN_TIME
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:10: warning: previous definition of POINT_IN_TIME was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:11: warning: already initialized constant DiscourseAutomation::Triggers::POST_CREATED_EDITED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:11: warning: previous definition of POST_CREATED_EDITED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:12: warning: already initialized constant DiscourseAutomation::Triggers::RECURRING
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:12: warning: previous definition of RECURRING was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:13: warning: already initialized constant DiscourseAutomation::Triggers::STALLED_TOPIC
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:13: warning: previous definition of STALLED_TOPIC was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:14: warning: already initialized constant DiscourseAutomation::Triggers::STALLED_WIKI
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:14: warning: previous definition of STALLED_WIKI was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:15: warning: already initialized constant DiscourseAutomation::Triggers::TOPIC
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:15: warning: previous definition of TOPIC was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:16: warning: already initialized constant DiscourseAutomation::Triggers::USER_ADDED_TO_GROUP
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:16: warning: previous definition of USER_ADDED_TO_GROUP was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:17: warning: already initialized constant DiscourseAutomation::Triggers::USER_BADGE_GRANTED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:17: warning: previous definition of USER_BADGE_GRANTED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:18: warning: already initialized constant DiscourseAutomation::Triggers::USER_FIRST_LOGGED_IN
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:18: warning: previous definition of USER_FIRST_LOGGED_IN was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:19: warning: already initialized constant DiscourseAutomation::Triggers::USER_PROMOTED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:19: warning: previous definition of USER_PROMOTED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:20: warning: already initialized constant DiscourseAutomation::Triggers::USER_REMOVED_FROM_GROUP
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:20: warning: previous definition of USER_REMOVED_FROM_GROUP was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:21: warning: already initialized constant DiscourseAutomation::Triggers::USER_UPDATED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:21: warning: previous definition of USER_UPDATED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/recurring.rb:6: warning: already initialized constant DiscourseAutomation::Triggers::Recurring::RECURRENCE_CHOICES
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/recurring.rb:6: warning: previous definition of RECURRENCE_CHOICES was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/stalled_wiki.rb:6: warning: already initialized constant DiscourseAutomation::Triggers::StalledWiki::DURATION_CHOICES
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/stalled_wiki.rb:6: warning: previous definition of DURATION_CHOICES was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:7: warning: already initialized constant DiscourseAutomation::Triggers::TopicTagsChanged::TriggerOn::TAGS_ADDED_OR_REMOVED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:7: warning: previous definition of TAGS_ADDED_OR_REMOVED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:8: warning: already initialized constant DiscourseAutomation::Triggers::TopicTagsChanged::TriggerOn::TAGS_ADDED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:8: warning: previous definition of TAGS_ADDED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:9: warning: already initialized constant DiscourseAutomation::Triggers::TopicTagsChanged::TriggerOn::TAGS_REMOVED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:9: warning: previous definition of TAGS_REMOVED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:11: warning: already initialized constant DiscourseAutomation::Triggers::TopicTagsChanged::TriggerOn::MODES
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:11: warning: previous definition of MODES was here
sidekiq-1 | 2025-07-06T17:15:52.699Z pid=1 tid=4ox INFO: Booted Rails 7.2.2.1 application in production environment
هذه نقطة ممتازة. لا يوجد سبب وجيه حقًا لعدم إمكانية تشغيل هذا النص البرمجي كغير جذر.
النص البرمجي للإعداد هو الوحيد الذي يحتاج حقًا إلى صلاحيات الجذر، للجزء المخيف حيث يقترح تنفيذ نص Docker البرمجي للتثبيت من الإنترنت. لذا يمكن تغيير ذلك أيضًا لتشغيله كغير جذر.
لا يحتاج النص البرمجي للمشغل إلى صلاحيات الجذر، بل يحتاج فقط إلى إذن الكتابة في /var/discourse وإذن إدارة حاويات Docker.
هممم… ![]()
لا يحتاج البرنامج النصي حتى إلى الوصول إلى /var/discourse (لماذا يفعل ذلك؟).
تنبع المشكلة بأكملها من أمرين:
- سوء فهم كبير لما هو docker، وكيف يعمل، وما الذي يتيحه
- ربط مفهوم docker بـ docker-compose (وهو ليس كذلك!)
يمكنك الحصول على إعداد مغلق تمامًا لا يمس البيئة المضيفة تقريبًا…
بعد إجراء الكثير من البحث، يبدو أن برنامج الإعداد بأكمله تم إنشاؤه لجعل التثبيت بسيطًا قدر الإمكان للشخص غير التقني تمامًا. يقوم بالتحقق، ويوجه المستخدم، ويقوم بإعداد كل شيء. قد يكون هذا شيئًا جيدًا، ولكنه يفشل تمامًا في أي شيء يحاول الانحراف ولو بوصة واحدة عن المسار المتصور.
في الإعداد الأساسي، قد لا تحتاج حتى إلى الوصول إلى أي مجلدات مضيفة - سيتم احتواء كل شيء داخل بيئة محدودة (سيتم استخدام الصورة لإنشاء الحاوية وسيتم التعامل مع جميع مساحات التخزين المطلوبة عبر وحدات تخزين docker [لديها مشاكل عندما تريد الترحيل إلى مكان آخر أو الوصول إلى الملفات ولكننا نتحدث عن الأساسيات]).
كما أنه يحاول التأكد من صحة DNS، ويحاول إعداد الشهادات، والوكيل العكسي، و SMTP، وما إلى ذلك - مرة أخرى، لا بأس تمامًا في توفير هذا الإعداد السهل.
ولكن!
المشكلة ليست في التخلي عن ذلك، بل في توفير صورة docker عادية بالإضافة إلى ذلك (إنها موجودة بالفعل، ويتم استخدامها بواسطة البرامج النصية والقوالب التي يستخدمها البرنامج النصي! discourse_docker/templates/postgres.template.yml at main · discourse/discourse_docker · GitHub و discourse_docker/launcher at main · discourse/discourse_docker · GitHub) مع
- إصدار مناسب: تقوم بتمييز الصورة بإصدار discourse الذي تم إصداره (3.4.5 أو ما شابه)
- توثيق معقول وبسيط لمتغيرات البيئة المتوقعة (التي تدير اتصال قاعدة البيانات/redis/إلخ) والمسارات/وحدات التخزين المحتملة التي يمكن تحميلها على المضيف.
فقط هذا…
ألق نظرة على دليل miniflux المذكور أعلاه: Miniflux Installation with Docker - يمنحك تفاصيل حول الصورة (وأي مستودعات تخدمها) ومتغيرات البيئة الممكنة لتكوينها.
أو صورة MySQL docker: https://hub.docker.com/_/mysql - نفس الشيء - دليل يشرح ما يمكن تكوينه (انظر بشكل خاص القسم: “متغيرات البيئة”).
لا يقول أحد: “عليك استخدام برنامج تثبيت mysql لبناء صورة mysql حتى تتمكن من استخدامها”، أو redis لهذا الغرض - في هذه الحالة، أنت ببساطة تستخدم الصور الموجودة وهذا هو المفتاح وجوهر استخدام docker. ومع ذلك، في حالة discourse، فجأة يصبح هذا حلاً “سيئًا” ويصرخ الجميع: “عليك بناء صورتك الخاصة!” - لماذا!؟
لا. بسبب الإضافات.
أمم… اضطررت للبحث قليلاً بخصوص الإضافات ومرة أخرى يجب أن أقول/أقتبس:
![]()
لذا ما فعلته - ذهبت إلى قسم الإضافات، ونقرت على أول إضافة بحثًا عن التعليمات ودليل التثبيت (Plugin directory | Discourse - Civilized Discussion → Sign in with Apple | Discourse - Civilized Discussion → Discourse Apple Authentication → Install plugins on a self-hosted site) و… يا إلهي - يا لها من “فوضى” مربكة.
لماذا بحق الجحيم تحتاج إلى صورة جديدة فقط للحصول على الإضافات؟ مع دوكر يمكنك فقط تحديد دليل تحميل للإضافات ثم وضعه هناك…
أنا لست شخصًا يتعامل مع روبي، لذا قد تكون الأمور أغرب هنا، ولكن على سبيل المثال في عالم جافا، يمكنك فقط إسقاط ملف jar مع الإضافة ليتم تحميله وفويلا - لديك الإضافة قيد التشغيل. وأنت تستخدم نفس الصورة مثل أي شخص آخر…
(لا أقول إن الأمر ليس فوضويًا، بل أشرح فقط سبب كون الأشياء كما هي)
بسبب خط أنابيب أصول إمبر.
والذي سيكون فوضويًا أيضًا، لأنك لا تريد أن تكون هذه التبعيات خارجية.
هذا؟ https://github.com/ember-engines/ember-asset-loader؟
لماذا لا؟
يمكن معالجة المكونات الإضافية أثناء التشغيل، ويتم ذلك أيضًا عند ترقية مكون إضافي. ببعض الحيل، يمكنك أيضًا إضافة مكون إضافي جديد إلى نسخة قيد التشغيل دون إعادة بناء الحاوية. لذا، يجب أن يكون تحميل وحدة تخزين المكون الإضافي إلى حاوية ممكنًا (مع مجموعة من التغييرات).
المشكلة الرئيسية التي أراها تتعلق بترقية Discourse. يمكن القيام بذلك حاليًا مع نسخة قيد التشغيل. الترقية تعيد بناء Discourse بشكل أساسي. إذا جاءت Discourse بالفعل من صورة مُعدة مسبقًا، فلا يمكنك تغيير تلك الملفات. لذا، فإن الترقية بفترة توقف صفر/قليلة ستتطلب على الأرجح الكثير من العمل.
هذا شيء لا أفهمه (ربما أفتقد السياق فيما يتعلق بـ Ruby…).
بشكل عام، مع Docker/Containers/Orchestration، يمكنك إجراء عمليات نشر “أزرق-أخضر” / “أحمر-أسود” حيث تقوم بإعداد حاوية جديدة بالإصدار الجديد وتبديل حركة المرور بمجرد أن تكون جاهزة. ومع ذلك، بشكل عام بالنسبة للنشر الأصغر، لا ينبغي أن تكون هذه مشكلة لأن معظم وقت بدء تشغيل الخدمة (الحاوية) يجب أن يكون مجرد ثوانٍ، لذا يجب أن يكون وقت التوقف عن تبديل الإصدارات ضئيلًا (المشكلة الأكبر هي الاضطرار إلى تشغيل ترقيات المخطط، ولكن هذا ينطبق بغض النظر عما إذا كنت تعيد بناء الصورة أم لا).
نعم، ولكن هذا ليس ما يعمل عليه حاليًا، لذا فهذا هو الجزء الذي يحتاج إلى عمل. كيف ستقوم بذلك من داخل واجهة إدارة Discourse. كيف ستقوم بتقليص الحاوية الزرقاء أثناء تشغيل الحاوية الخضراء (الأنظمة لا تملك موارد لا نهائية، لذا قبل بدء تشغيل الأزرق، تريد تقليل عاملي يونيكورن في الأخضر.) أو يمكنك ببساطة أن تجعل الأخضر متوقفًا، والآن يرتفع الأزرق.
هناك الكثير من الأشياء التي تحتاج إلى تحديدها وحلها. سواء من منظور تقني أو منظور إداري. الترقية بنقرة واحدة من داخل واجهة الإدارة هي ميزة قيمة.
لا تزال المكونات الإضافية والصور المخصصة بحاجة إلى البناء، ولكن بالنسبة للبناء العادي لـ compose، أصبح ذلك في متناول اليد هذه الأيام - لقد أجريت تجربة إثبات مفهوم صغيرة هنا لأي شخص لديه فضول.
من الواضح، نظرًا لأن هذه كلها مستودعاتي (وليست مستودعات Discourse™)، فهذا ليس شيئًا رسميًا، لذا قد تختلف النتائج، وبالتأكيد لا تتوقع دعمًا رسميًا
أقوم بنشر هذا هنا، نظرًا لأنه تم ذكر أن الناس يقومون بالفعل بتشغيل bitnami وطرق أخرى غير معتمدة للتشغيل.
صور postgres (أو pgvector) الجاهزة لا تعمل مع Discourse - يحتاج Discourse إلى تغيير التكوين الافتراضي، ولا يتصل عبر مستخدم خارق، ويدعم اللغات المحلية، ويحتاج إلى دعم ترقيات postgres دون الحاجة إلى مسؤول Discourse لتفريغ/استعادة.
حسنًا… أعتقد أن هذا هو الاختلاف الحاسم وهذه “التحديثات من واجهة الإدارة” هي بمثابة تذكير بالأوقات القديمة، عندما كان لديك فقط “استضافة الويب” مع مترجم php، لذلك تم بناء كل شيء حول هذا المفهوم. وأعتقد أن هذا انتقل إلى كيفية عمل Discourse وكيف يُتوقع إدارته.
حسنًا، هذا شيء آخر لاحظته - Discourse ثقيل جدًا (بدأ الحاوية في استهلاك الموارد أثناء بدء التشغيل بمستوى مخيف) لذا نعم - قد تكون هذه مشكلة.
كيف يتم “بناء” هذه في سياق Ruby (وهي لغة مترجمة في الغالب وليست مجمعة)؟
ألن يكون من الأفضل محاولة استخدام حلول جاهزة؟ حتى بالنسبة لإعدادات postgres يمكن تغييرها بسهولة عن طريق توفير/تركيب ملف postgresql.conf مخصص، لا حاجة لصورة مخصصة تمامًا مع إعداد مدمج… وحتى بعد ذلك - إذا كان ذلك مطلوبًا، يمكن لـ Discourse توفير مثل هذه الصورة المبنية مسبقًا التي سيتم سحبها فقط بدلاً من إعادة بنائها في كل مرة…
واجهة “تحديث المسؤول” هذه هي إضافة (تسمى “مدير دوكر”). لا تحتاج إلى تضمينها إذا كانت لديك طريقة أخرى لإجراء التحديثات عبر الإنترنت.
