كيفية إيقاف S3 storage؟

مرحبًا يا رفاق،

كيف يمكنني إيقاف تخزين AWS S3 بالكامل وإعادة جميع الملفات والنسخ الاحتياطية الموجودة في تخزين S3 إلى خادم EC2 الخاص بي؟

إعجاب واحد (1)

أعتقد أن هذا سيفي بالغرض:

./launcher enter app
rake uploads:migrate_from_s3
rake posts:rebake

هذا ينقل الملفات المرفوعة من S3 إلى خادم الويب الخاص بك. بعد ذلك، يمكنك العودة إلى ملف app.yml وتغيير DISCOURSE_USE_S3: false. ثم أعد البناء.

9 إعجابات

سأقوم أيضًا بالدخول إلى منطقة الإدارة في Discourse وإلغاء تحديد جميع المربعات التي تُفعّل وضع S3.

إعجابَين (2)

لقد فعلت ما ذكره @AntiMetaman، لكنه يعطيني خطأ ‘rake aborted’. أولاً، يطلب مني إيقاف تحميل S3. قمت بإيقاف تحميل S3 وحاولت تشغيل rake مرة أخرى، ثم ظهر هذا الخطأ.

root@ip-172-31-7-247-app:/var/www/discourse# rake uploads:migrate_from_s3 --trace
** Invoke uploads:migrate_from_s3 (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute uploads:migrate_from_s3
Migrating uploads from S3 to local storage for 'default'...
rake aborted!
NoMethodError: undefined method `downcase' for nil:NilClass
/var/www/discourse/app/models/global_setting.rb:107:in `s3_bucket_name'
/var/www/discourse/app/models/site_setting.rb:157:in `absolute_base_url'
/var/www/discourse/lib/tasks/uploads.rake:138:in `migrate_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:118:in `block in migrate_all_from_s3'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:68:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:78:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:118:in `migrate_all_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:93:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:281:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:281:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:281:in `execute'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/usr/local/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:188:in `invoke'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:160:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `block (2 levels) in top_level'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:125:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:110:in `top_level'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:186:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:80:in `run'
bin/rake:13:in `<top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `kernel_load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:28:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:476:in `exec'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor.rb:399:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:30:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/base.rb:476:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:24:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:46:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/friendly_errors.rb:123:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:34:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_from_s3

هذه هي، أليس كذلك؟

s3

لقد صادفت هذا الموضوع اليوم. قد يستحق الانتظار إذا كان ذلك ممكنًا.

إذا قمت بإيقاف S3 فقط من لوحة الإدارة، فإن ذلك سيعطله على مستوى الموقع فقط. أنت تريد تعطيله عالميًا، ولهذا السبب يجب عليك تغيير القيمة من true إلى false في ملف app.yml ثم إعادة البناء.

يجب أن يعمل الأمر إذا قمت بإعداد S3. لقد جربت للتو migrate_from_s3 و migrate_to_s3. يعمل الأمر بالنسبة لي. لم أتلق أي أخطاء. لا أعرف ما يعنيه هذا الخطأ، لذا يجب أن يساعد مطور Discourse في هذه المرحلة:

NoMethodError: undefined method 'downcase' for nil:NilClass

غريب، تم حذف ردّي أدناه، لذا سأقوم بنشره مرة أخرى.

تظهر هذه الرسالة عند استدعاء دالة خاصة بالنص على كائن يكون قيمته nil؛ وعادة ما يحدث هذا في Ruby عندما يُتوقع وجود كائن نصي، لكنه يكون nil.

لهذا السبب تظهر هذه الرسالة.

إعجاب واحد (1)

تمت إضافة DISCOURSE_USE_S3: false إلى ملف app.yml، لكن الخطأ لا يزال كما هو. ما هي نسخة Discourse التي تستخدمها؟ أنا أستخدم أحدث إصدار.

أنا أيضًا على أحدث إصدار. هل واجهت أي أخطاء أثناء إعادة البناء؟ إذا كان الأمر كذلك، هل يمكنك نشرها؟

لا، لم يحدث أي نوع من الأخطاء.

إذا كانت المشكلة تظهر فقط بعد تنفيذ أمر rake، فهل يمكنك نشر ما كتبته بالضبط؟ عندما قمت بإعداد S3 لأول مرة، ألم تكن بحاجة إلى نقل الملفات إلى S3؟

إليك ملف app.yml الكامل الخاص بي

## هذا قالب حاوية 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"
##  - "templates/cloudflare.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_HOSTNAME: engineersasylum.com

  ## قم بإلغاء التعليق إذا كنت تريد تشغيل الحاوية بنفس
  ## اسم المضيف (خيار -h) المحدد أعلاه (الافتراضي "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: قائمة عناوين البريد الإلكتروني المفصولة بفواصل سيتم تعيينها كمسؤول ومطور
  ## عند التسجيل الأولي، مثال 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'praveen369gen@gmail.com'

  ## TODO: خادم البريد SMTP المستخدم للتحقق من الحسابات الجديدة وإرسال الإشعارات
  DISCOURSE_SMTP_ADDRESS: email-smtp.us-east-1.amazonaws.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: AXXXXXXXXXXXXXXX
  DISCOURSE_SMTP_PASSWORD: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (اختياري، الافتراضي true)

  ## إذا قمت بإضافة قالب Lets Encrypt، قم بإلغاء التعليق أدناه للحصول على شهادة SSL مجانية
  LETSENCRYPT_ACCOUNT_EMAIL: praxxxxxx@gmail.com

  ## عنوان CDN لهذه النسخة من Discourse (مُهيأ لجلب)
  ## راجع https://meta.discourse.org/t/14857 للحصول على التفاصيل
  #DISCOURSE_CDN_URL: //discourse-cdn.example.com
  DISCOURSE_USE_S3: false

## حاوية 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
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-adplugin.git
          - git clone https://github.com/communiteq/discourse-sitemap.git
          - git clone https://github.com/discourse/discourse-whos-online.git
          - git clone https://github.com/discourse/discourse-push-notifications.git
          - git clone https://github.com/discourse/discourse-chat-integration.git
          - git clone https://github.com/davidtaylorhq/discourse-telegram-notifications.git
          - git clone https://github.com/discourse/discourse-knowledge-explorer.git
          - git clone https://github.com/discourse/discourse-math.git

## أي أوامر مخصصة للتشغيل بعد البناء
run:
  - exec: echo "Beginning of custom commands"
  ## إذا كنت ترغب في تعيين عنوان البريد الإلكتروني 'From' لتسجيلك الأول، قم بإلغاء التعليق وتغيير:
  ## بعد الحصول على أول بريد إلكتروني للتسجيل، قم بإعادة التعليق على السطر. يجب تشغيله مرة واحدة فقط.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "End of custom commands"

لا أتذكر بالضبط، لكنني أعتقد أنني قمت بالنقل إلى S3 باستخدام rake uploads:migrate_to_s3

لا أعرف السبب بالتأكيد، لكن إليك موضوعًا مشابهًا يحتوي على نفس الخطأ الذي واجهته:

قد ترغب في مراجعة الأمر مع أحد أعضاء الفريق.

مرحبًا @Pravi

سؤال جانبي:

في مشاركتك الخاصة بملف yml, “تقول”:

DISCOURSE_SMTP_PASSWORD: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

هل هذا صحيح؟ هل كلمة المرور محاطة بعلامتي اقتباس مزدوجتين في ملف yml الخاص بك؟

نعم، إنه بين علامتي اقتباس مزدوجة. لم أقم بتغييره منذ أضفته قبل عامين.

أزلت علامتي الاقتباس المزدوجة، ثم أعيد بناء التطبيق مرة أخرى. ثم حاولت تشغيل rake uploads:migrate_from_s3 مرة أخرى، لكن دون جدوى. نفس الخطأ

مرحبًا @Pravi

بكل صراحة، أنا معارض لـ AWS و S3، لذا لا أستخدمهما.

هل فكرت في مراجعة مهمة Rake، وعكس هندسة ذلك السكربت، ثم تنفيذ المهمة يدويًا خطوة بخطوة؟

لا أملك فكرة كافية عن السكربت الداخلي لمنصة Discourse، وأنا خائف قليلاً من تعديل السكربت. لا أريد أن أفسد كل شيء.

هل يمكنك إخباري بموقع ملف discourse.config؟ لا أستطيع العثور عليه في أي مكان على خادمي. أمر البحث (find) لا يعيد أي نتيجة.

root@ip-172-31-7-247:/var/discourse# find . -name "*.config"
root@ip-172-31-7-247:/var/discourse# find . -name "*.conf"
./shared/standalone/letsencrypt/engineersasylum.com/engineersasylum.com.conf
./shared/standalone/letsencrypt/engineersasylum.com/engineersasylum.com.csr.conf
./shared/standalone/letsencrypt/engineersasylum.com_ecc/engineersasylum.com.conf
./shared/standalone/letsencrypt/engineersasylum.com_ecc/engineersasylum.com.csr.conf
./shared/standalone/letsencrypt/ca/acme-v01.api.letsencrypt.org/ca.conf
./shared/standalone/letsencrypt/ca/acme-v02.api.letsencrypt.org/ca.conf
./shared/standalone/letsencrypt/account.conf
./shared/standalone/postgres_data/pg_hba.conf
./shared/standalone/postgres_data/postgresql.auto.conf
./shared/standalone/postgres_data/pg_ident.conf
./shared/standalone/postgres_data/postgresql.conf
root@ip-172-31-7-247:/var/discourse#

مرحبًا @Pravi

آسف لأنك فسّرت كلامي بشكل خاطئ.

لم أطلب منك تعديل ذلك الملف أو أي ملف آخر.

عندما أقول “هندسة عكسية” للسكريبت، فإنني أعني في رأيي دراسته وفهم كيفية عمله، ولا علاقة لذلك بتعديل الملف. بل يعني قراءته وفهمه.

عادةً، إذا قرأنا وفسّرنا أي سكريبت أو ملف يُظهر خطأً، يمكننا عادةً فهم كيفية حل المشكلة.

أنت تنشر رسائل خطأ من ملف لم تقرأه، على ما يبدو.

أتمنى أن يكون هذا مفيدًا.

أفهم وجهة نظرك. سأحاول القيام بذلك.
هل يمكنك اقتراح موقع ملف ‘discourse.config’؟ أين يتم تخزين إعدادات S3؟