Привет, ребята,
Как я могу полностью отключить хранилище AWS S3 и вернуть все файлы и резервные копии из S3 обратно на свой сервер EC2?
Привет, ребята,
Как я могу полностью отключить хранилище AWS S3 и вернуть все файлы и резервные копии из S3 обратно на свой сервер EC2?
Я считаю, что это сработает:
./launcher enter app
rake uploads:migrate_from_s3
rake posts:rebake
Это перенесёт файлы загрузок ИЗ S3 на ваш веб-сервер. Затем вы можете вернуться к app.yml и изменить DISCOURSE_USE_S3: false. После этого выполните пересборку.
Я бы также зашел в административную панель Discourse и снял все галочки, активирующие режим S3.
Я сделал то, что предложил @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 только через панель администратора, это отключит его только на уровне сайта. Вам нужно отключить его глобально, поэтому необходимо изменить значение с true на false в файле app.yml, а затем выполнить пересборку.
Это должно работать, если вы настроили S3. Я только что протестировал команды migrate_from_s3 и migrate_to_s3. У меня всё работает, ошибок не возникло. Я не знаю, что означает эта ошибка, поэтому на данном этапе следует обратиться за помощью к разработчику Discourse:
NoMethodError: undefined method downcase’ for nil:NilClass`
Странно, мой ответ ниже был удалён, поэтому я публикую его снова.
Эта ошибка возникает, когда к объекту nil вызывается метод строки; обычно это происходит в Ruby, когда ожидается строковый объект, но он равен nil.
Именно поэтому возникает эта ошибка.
Добавил 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% от общего объема памяти.
## будет установлено автоматически при загрузке на основе обнаруженного ОЗУ, либо вы можете переопределить
db_shared_buffers: "128MB"
## может улучшить производительность сортировки, но увеличивает использование памяти на соединение
#db_work_mem: "40MB"
## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
#version: tests-passed
env:
LANG: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## Сколько одновременных веб-запросов поддерживается? Зависит от памяти и ядер процессора.
## будет установлено автоматически при загрузке на основе обнаруженных процессоров, либо вы можете переопределить
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 "Начало пользовательских команд"
## Если вы хотите установить адрес электронной почты «От» для первой регистрации, раскомментируйте и измените:
## После получения первого письма о регистрации закомментируйте строку обратно. Она должна выполниться только один раз.
#- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
- exec: echo "Конец пользовательских команд"
Я точно не помню, но, кажется, я выполнил миграцию в S3 с помощью rake uploads:migrate_to_s3
У меня нет ни малейшего представления, но вот похожая тема с точно такой же ошибкой, как у вас:
Возможно, стоит проконсультироваться с участником команды.
Привет, @Pravi!
Вопрос по боковой панели:
В вашем посте с yml вы «пишете»:
DISCOURSE_SMTP_PASSWORD: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Это правильно? Пароль в вашем yml заключён в двойные кавычки?
Да, оно в двойных кавычках. Я не менял его с момента добавления два года назад.
Я удалил двойные кавычки, затем снова собрал приложение. После этого попытался снова выполнить rake uploads:migrate_from_s3, но безрезультатно. Та же ошибка
Привет @Pravi
Честно говоря, я противник AWS и S3, поэтому не использую их.
Вы рассматривали возможность изучения задачи Rake, обратного анализа этого скрипта и выполнения задачи вручную, шаг за шагом?
Я не очень хорошо разбираюсь во внутреннем скрипте Discourse и немного боюсь его редактировать. Не хочу всё испортить.
Можете подсказать, где находится файл конфигурации Discourse? Я не могу найти его нигде на сервере. Команда 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?