تطبيق Discourse مفصول - Redis مُدار، Postgres مُدار، وحجم Digital Ocean مع Discourse

أحاول ربط Discourse بقاعدة بيانات Redis المدارة من Digital Ocean. تمكنت من جعل PostgreSQL يعمل بشكل صحيح مع قاعدة بيانات PostgreSQL المدارة من Digital Ocean، لكن Redis يعطيني خطأ. ما رأيك في هذا؟

    templates:
      - templates/web.template.yml
      - templates/web.ssl.template.yml
    # استخدم مفتاح 'links' لربط الحاويات ببعضها، أي استخدام علم Docker --link.
    expose:
      - '80:80'
      - '443:443'
    params:
      db_default_text_search_config: pg_catalog.english
      db_shared_buffers: 512MB
    env:
      LANG: en_US.UTF-8
      UNICORN_WORKERS: 8
    
      # https://github.com/discourse/discourse/blob/master/config/discourse_defaults.conf
      DISCOURSE_HOSTNAME: blah.example.com
      DISCOURSE_DEVELOPER_EMAILS: email@example.com
      DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
      DISCOURSE_SMTP_PORT: 587
      DISCOURSE_SMTP_USER_NAME: blah@mail.com
      DISCOURSE_SMTP_PASSWORD: 9cd16e-aff2d1b9-36c86fff
      DISCOURSE_DB_NAME: defaultdb
      DISCOURSE_DB_USERNAME: doadmin
      DISCOURSE_DB_PASSWORD: gp5m224
      DISCOURSE_DB_HOST: private-digitalocean-stage-discuss-postgres-do-user-.ondigitalocean.com
      DISCOURSE_DB_PORT: 25060
      DISCOURSE_REDIS_USERNAME: default
      DISCOURSE_REDIS_PASSWORD: dex3mf
      DISCOURSE_REDIS_HOST: private-digitalocean-stage-discuss-redis-do-user-966537-0.b.db.ondigitalocean.com
      DISCOURSE_REDIS_PORT: 25061
      DISCOURSE_REDIS_CLIENT_ID: ~
    volumes:
      - volume:
          host: /var/discourse/shared/standalone
          guest: /shared
      - volume:
          host: /var/discourse/shared/standalone/log/var-log
          guest: /var/log
    hooks:
      after_code:
        - exec:
            cd: $home/plugins
            cmd:
              - 'git clone https://github.com/discourse/docker_manager.git'
    run:
      - exec: echo "Beginning of custom commands"
      - exec: echo "End of custom commands"

كما ترى، أضفت:

  DISCOURSE_REDIS_USERNAME: default
  DISCOURSE_REDIS_PASSWORD: dex3mf
  DISCOURSE_REDIS_HOST: private-digitalocean-stage-discuss-redis-do-user-.db.ondigitalocean.com
  DISCOURSE_REDIS_PORT: 25061
  DISCOURSE_REDIS_CLIENT_ID: ~

لكنني حصلت على هذا الخطأ:

  I, [2021-02-13T04:05:48.508236 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
  Failed to report error: Connection lost (ECONNRESET) 2 Connection lost (ECONNRESET) subscribe failed, reconnecting in 1 second. Call stack /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:275:in `rescue in io'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:267:in `io'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:279:in `read'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:131:in `block in call'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:248:in `block (2 levels) in process'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:389:in `ensure_connected'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:238:in `block in process'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:325:in `logging'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:237:in `process'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:131:in `call'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:113:in `block in connect'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:313:in `with_reconnect'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:111:in `connect'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:294:in `with_socket_timeout'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:144:in `call_loop'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/subscribe.rb:44:in `subscription'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/subscribe.rb:14:in `subscribe'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:3507:in `_subscription'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:2326:in `block in subscribe'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:69:in `block in synchronize'
    /usr/local/lib/ruby/2.7.0/monitor.rb:202:in `synchronize'
    /usr/local/lib/ruby/2.7.0/monitor.rb:202:in `mon_synchronize'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:69:in `synchronize'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:2325:in `subscribe'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus/backends/redis.rb:287:in `global_subscribe'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus.rb:766:in `global_subscribe_thread'
    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus.rb:714:in `block in new_subscriber_thread'
    rake aborted!

لقد عملت سابقًا لضمان توافقنا مع جميع الخدمات المدارة من Digital Ocean. يتطلب Redis الخاص بهم SSL إلزاميًا، وهو ما لم نكن ندعمه في ذلك الوقت.

لجعل Redis الخاص بهم يعمل، استخدم الإعدادات التالية:

  DISCOURSE_REDIS_HOST: falcoland-redis-do-user-435229-0.a.db.ondigitalocean.com
  DISCOURSE_REDIS_PASSWORD: vp39d0dpy8dxn68n
  DISCOURSE_REDIS_PORT: 25061
  DISCOURSE_REDIS_USE_SSL: true

شكرًا لك @Falco ~~ يعمل!!!

خطوتي التالية هي نقل /var/discourse إلى وحدة تخزين في Digital Ocean يمكن لخوادم تطبيق Discourse مشاركتها. هل ستقوم فقط بربط وحدة التخزين وإنشاء روابط رمزية للمجلدات؟

هندستي المستهدفة هي: موزع أحمال → عدة خوادم Discourse مع Redis وPostgreSQL من Digital Ocean، ووحدة تخزين مشتركة واحدة من Digital Ocean يشاركها عدة خوادم Discourse بدلاً من أن يكون لكل منها وحدات تخزين خاصة.

ما رأيك؟

لماذا؟

ضع جميع الأصول الثابتة وتحميلات المستخدمين على Digital Ocean Spaces وفقًا لـ استخدام التخزين الكائني للتحميلات (S3 والنسخ المماثلة) ولن تحتاج خوادم التطبيق إلى مشاركة أي شيء.

شيء واحد يجب أخذه في الاعتبار هو أنه مع وجود قطرات تطبيقات متعددة، و Redis المدارة، و PostgreSQL، والتخزين الكائني، فإن السعر يقترب جدًا من الاستضافة المدارة :wink:

شكرًا لك، فمنتداي لا يستخدم قوالب الواجهة الأمامية. لقد قمت ببناء واجهة برمجية باستخدام NodeJS، بينما الواجهة الأمامية مبنية بـ VueJS. لذا، فإنني أستخدم Discourse فقط لمشاركة وتخزين البيانات. ولا أسمح برفع الصور في منتداي.

إذن، هذه هي حالة الاستخدام الخاصة بي: يمكن لجميع خوادم تطبيق Discourse مشاركة مجلد ملفات واحد خلف موزع الأحمال. كل جزء مفكك الآن باستثناء مجلد /var/discourse. هل هذا واضح؟

مرحبًا @Falco ، لقد فهمت الأمر بسهولة نسبيًا:

أولاً، قم بإنشاء حجم (volume) في DigitalOcean وتأكد من ربط الـ Droplet الخاص بك به في خطوات DigitalOcean، ثم
اتصل عبر SSH بجهاز Discourse الخاص بك

mv /var/discourse /var/discourse.bak
mkdir /home/discourse
mount /dev/sda /home/discourse
mv /var/discourse.bak/* /home/discourse
nano /home/discourse/containers/app.yml

قم بتحديث قسم الأحجام (volumes):

volumes:
  - volume:
      host: /home/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /home/discourse/shared/standalone/log/var-log
      guest: /var/log

ثم،

cd /home/discourse
sudo ./launcher rebuild app

الآن يتم تشغيل Discourse من حجم (volume)، مما يسمح بأخذ لقطات (snapshots) ونشره خلف موزع حمل (load balancer) نظرًا لأن جميع الأجزاء أصبحت مفككة الآن.

تحياتي!