تثبيت Discourse لتطوير macOS باستخدام asdf و docker-compose

ملاحظة: هذه دليل تثبيت لبيئة تطوير غير مدعومة. الأدلة المدعومة رسميًا لـ macOS موجودة هنا (محلي) و هنا (Docker). تابع على مسؤوليتك الخاصة.

هدف هذا الدليل هو وضع postgres و redis في حاويات (containerize) مع إبقاء ruby خارج الحاويات.

جربت نهج Discourse للتطوير باستخدام Docker، لكنه كان بطيئًا جدًا على جهازي.

بعد ذلك، نظرت في دليل Discourse للتطوير على macOS. لكن أول ما فعله السكربت هو تثبيت brew. قد يكون brew ممتازًا بالفعل، لكنني أستخدم MacPorts منذ فترة طويلة وأرغب في الاستمرار في مقاومة تثبيت brew بنجاح. بالإضافة إلى ذلك، كان ذلك السكربت يقوم بتثبيتات عامة لأشياء مثل postgresql و redis، وأفضل أن أكون قادرًا على صيانتها على أساس كل مشروع على حدة.

إذن، إليك ما نجح معي باستخدام مزيج من asdf و docker-compose. النتيجة هي حل وسط بين النهجين المذكورين أعلاه. يتم تشغيل postgres و redis في حاوية باستخدام docker-compose بحيث يمكن تثبيتها على الإصدارات الرسمية التي يستخدمها Discourse في الإنتاج. يعمل Rails مباشرة على النظام. هذا المزيج أسرع بكثير بالنسبة لي. النتائج قد تختلف من شخص لآخر.

إذا أردت المتابعة، ستحتاج إلى تثبيت كل من asdf و Docker على جهازك. (يا إلهي، asdf رائع حقًا… يجب أن تحصل عليه بالتأكيد إذا كنت مهتمًا بصيانة العديد من بيئات التطوير المختلفة بسهولة. إنه يحل محل renv، nvm… يبدو أنه يحل محل كل شيء تقريبًا باستثناء jenv.)

إذا نظرت إلى ما يفعله سكربت تثبيت macOS، يمكنك تقسيم ما يتم تثبيته إلى ثلاث فئات:

  • بيئات وأدوات سطر الأوامر مثل ruby و yarn. سنقوم بتثبيتها وتثبيت إصداراتها في دليل مشروعنا باستخدام asdf.
  • الخدمات - وتحديدًا postgres و redis. سنقوم بتثبيتها باستخدام Docker Compose، مرة أخرى حتى نتمكن من تثبيت إصداراتها على ما نحتاجه لهذا المشروع، ولدينا أيضًا بيئة تطوير يمكننا تشغيلها وإيقافها بسهولة.
  • أخرى - بشكل رئيسي مكتبات معالجة الصور مثل ImageMagick والتحسين. يمكن تثبيت هذه باستخدام إما brew، أو port، أو مباشرة من المصدر.

سنحتاج أيضًا إلى إعادة تكوين بيئة التطوير لدينا بشكل طفيف للاتصال بخادم postgres الذي يتم تشغيله بواسطة docker-compose.

مصدر Discourse

يجب تنفيذ جميع الخطوات أدناه داخل دليل مصدر Discourse:

git clone https://github.com/discourse/discourse.git && cd discourse

هذا مهم لأن هذا هو المكان الذي سيحفظ فيه asdf ملف تكوين .tool-versions الخاص به، والمكان الذي سننشئ فيه ملف docker-compose.yml الخاص بـ Docker.

asdf

هناك ثلاثة أشياء نحتاج إلى تثبيتها باستخدام asdf: ruby، yarn، و postgres. وبكل سرور، يجعل asdf من السهل تثبيتها جميعًا مرة واحدة وتثبيت إصداراتها في دليل مشروعنا. أولاً، قم بإنشاء .tool-versions مع المحتويات التالية:

yarn 1.22.2
ruby 2.6.5
postgres 10.12

بعد ذلك، قم بتشغيل asdf install فقط.

الآن يجب أن تتمكن من تنفيذ خطوات تثبيت مكتبة Ruby المضمنة في السكربت وفي الإرشادات لاحقًا:

gem update --system
gem install bundler
gem install rails
gem install mailcatcher
gem install pg -- --with-pg-config=$HOME/.asdf/installs/postgres/10.12/bin/pg_config
bundle install

قد تحتاج إلى تعديل المسار إلى pg_config اعتمادًا على المكان الذي قمت بتثبيت asdf فيه.

docker-compose.yml

بعد ذلك، نحتاج إلى إنشاء ملف docker-compose.yml الخاص بنا ومهيأً لتشغيل redis و postgres. يبدو ملفي كالتالي:

version: "3"
networks:
  discourse:
    driver: bridge
services:
  data:
    image: "geoffreychallen/discourse_data:latest"
    command: /sbin/boot
    ports:
      - "5432:5432"
      - "6379:6379"
    volumes:
      - "data_shared:/shared/"
      - "data_logs:/var/log/"
    networks:
      - discourse
volumes:
  data_shared:
    driver: local
  data_logs:
    driver: local

شكرًا لـ @pfaffman على اقتراح استخدام حاوية بيانات Discourse قياسية. تم بناء geoffreychallen/discourse_data:latest من Discourse Docker. استخدمت ملف data.yml النموذجي مع تغييرين. أولاً، قمت بتعيين كلمة مرور مستخدم discourse لتكون discourse. ثانيًا، جعلت هذا المستخدم مستخدمًا خارقًا (superuser) حتى يتمكن من إنشاء قواعد بيانات اختبارية. إليك جزء hooks من ملف data.yml الخاص بي:

hooks:
  after_postgres:
    - exec:
        stdin: |
          alter user discourse with password 'discourse';
        cmd: sudo -u postgres psql discourse
        raise_on_fail: false
    - exec:
        stdin: |
          alter user "discourse" with superuser;
        cmd: sudo -u postgres psql discourse
        raise_on_fail: false

مرة أخرى، هذا فقط في حال أردت بناء حاوية بيانات Discourse الخاصة بك وعدم استخدام الحاوية الخاصة بي. من فضلك لا تستخدم هذه الحاوية في الإنتاج - فهي غير آمنة تمامًا!

في هذا التكوين، نعرض منافذ postgres و redis القياسية ونشغل أمر boot الذي تحتاجه الحاوية للبدء.

بمجرد وجود ملف docker-compose.yml الخاص بك في مكانه، جربه:

docker-compose up

بافتراض أن كل شيء تم تكوينه بشكل صحيح، يجب أن ترى redis و postgres يتم تشغيلهما. اضغط على Control-C للإلغاء أو استخدم docker-compose down إذا لم يتم إغلاق شيء ما بشكل صحيح لسبب ما.

المكتبات المتنوعة

يمكن تثبيت معظم مكتبات تحسين الصور باستخدام إما port أو brew. إليك كيفية القيام بذلك باستخدام port:

sudo port install imagemagick pngquant optipng jhead jpegoptim gifsicle

يمكن تثبيت svgo بمجرد أن يكون لديك npm. لن أغطي ذلك، لأنه واضح جدًا.

للعلم، حسب ما أرى، لا يُطلب أي من هذه الأدوات. أرى تحذيرات أثناء خطوات لاحقة مختلفة حول غيابها، لكن لا يبدو أن أي شيء ينفجر.

config/database.yml و spec/fixtures/multisite/two_dbs.yml

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

لإصلاح ذلك، تحتاج إلى تعديل config/database.yml. بشكل أساسي، في كل مكان ترى فيه:

adapter: postgresql

استبدله بـ:

adapter: postgresql
host: localhost
username: discourse
password: discourse

يسبب إضافة host عدم استخدام Discourse لمقبس، وتسبب username و password اتصال Discourse باستخدام مستخدم قاعدة بيانات Discourse الافتراضي وكلمة المرور التي قمنا بتعيينها أعلاه.

كان علي إجراء هذا التغيير ثلاث مرات في config/database.yml: مرة واحدة تحت development، ثم تحت test، وأخيرًا تحت profile. لكي تعمل مجموعة الاختبارات، كان علي إجراء تغيير مماثل في spec/fixtures/multisite/two_dbs.yml.

لنبدأ…

حسنًا، لنبدأ! في نافذة واحدة، افتح بيئة التطوير الخاصة بك باستخدام docker-compose:

docker-compose up

في نافذة ثانية، دعنا ننفذ خطوات إعداد قاعدة البيانات:

bundle exec rake db:create

بافتراض أن ذلك نجح، يمكنك الآن المتابعة من النقطة المناسبة في دليل macOS القائم على brew.

عندما تنتهي من العمل، أوقف docker-compose ويمكنك إبعاد بيئة التطوير الخاصة بك حتى المرة القادمة.

إذا أردت حذف قاعدة البيانات ومحتويات redis بشكل دائم، فقم بتشغيل docker-compose down -v لمسح الأحجام الدائمة (persistent volumes) بالإضافة إلى الحاويات نفسها. ولكن بدون العلم -v، سيقوم docker-compose down بالحفاظ على قاعدة بياناتك بين جلسات التطوير.

هل تنجح الاختبارات؟

فشلت إعداداتي في حالتين من الاختبارات:

Failures:

  1) UploadCreator#create_for pngquant should apply pngquant to optimized images
     Failure/Error: expect(upload.filesize).to eq(9558)

       expected: 9558
            got: 9550

       (compared using ==)
     # ./spec/lib/upload_creator_spec.rb:115:in `block (4 levels) in <main>'

  2) tasks/uploads uploads:secure_upload_analyse_and_update when store is external when secure media is enabled rebakes the posts attached
     Failure/Error: expect(post1.reload.baked_at).not_to eq(post1_baked)

       expected: value != 2020-03-08 03:20:01.777117000 +0000
            got: 2020-03-08 03:20:01.777117000 +0000

       (compared using ==)

       Diff:
         <The diff is empty, are your objects producing identical `#inspect` output?>
     # ./spec/tasks/uploads_spec.rb:90:in `block (5 levels) in <main>'

Finished in 19 minutes 21 seconds (files took 13.67 seconds to load)
4297 examples, 2 failures, 11 pending

بالنسبة لي، يبدو الأول وكأن pngquant يعمل بشكل أفضل قليلاً مما هو متوقع. لست متأكدًا من سبب تمثيل ذلك لفشل. الثاني أيضًا لا أفهمه. لكن هذا يبدو معقولاً بالنسبة لي.

استمتع بالبرمجة!

5 إعجابات