Como desativar o armazenamento S3?

Olá pessoal,

Como posso desativar completamente o armazenamento AWS S3 e restaurar todos os arquivos e backups do S3 de volta ao meu servidor EC2?

Acredito que isso resolverá o problema:

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

Isso migra os uploads DO S3 para o seu servidor web. Em seguida, você pode voltar ao seu app.yml e alterar DISCOURSE_USE_S3: false. Depois, reconstrua.

Eu também entraria na área de administração do Discourse e desmarcaria todas as caixas que ativam o modo S3.

Fiz conforme mencionado por @AntiMetaman, mas recebo um erro: rake aborted. Primeiro, ele me pede para desativar o upload no S3. Desativei o upload no S3 e tentei executar o rake novamente, mas então esse erro apareceu.

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

Este aqui, certo?

s3

Hoje encontrei este tópico. Pode valer a pena esperar se for possível.

Se você desativar o S3 apenas pelo painel de administração, isso só o desabilitará no nível do site. Você deseja desabilitá-lo globalmente, motivo pelo qual precisa alterar o valor de true para false no app.yml e, em seguida, reconstruir.

Deveria funcionar se você configurou seu S3. Acabei de testar um migrate_from_s3 e um migrate_to_s3. Funciona para mim. Não recebi nenhum erro. Não sei o que esse erro significa, então, neste ponto, um desenvolvedor do Discourse deveria ajudar:

NoMethodError: undefined method 'downcase' for nil:NilClass

Estranho, minha resposta abaixo foi excluída; então estou postando-a novamente.

Esse erro ocorre quando um método de string é chamado em um objeto que é nil; e geralmente acontece em Ruby quando se espera um objeto de string, mas ele é nil.

É por isso que esse erro ocorre.

Adicionei DISCOURSE_USE_S3: false ao app.yml, mas o erro persiste. Qual versão do Discourse você está usando? Estou usando a versão mais recente.

Eu também estou na versão mais recente. Você recebeu algum erro ao reconstruir? Se sim, pode postá-los?

Não, não há nenhum tipo de erro.

Se o erro ocorre apenas após o seu comando rake, você pode postar exatamente o que digitou? Quando você configurou o S3 pela primeira vez, não foi necessário migrar os arquivos para o S3?

Aqui está meu app.yml completo

## este é o modelo de contêiner Docker Discourse standalone, tudo-em-um
##
## Após fazer alterações neste arquivo, você DEVE reconstruir
## /var/discourse/launcher rebuild app
##
## TENHA *MUITO* CUIDADO AO EDITAR!
## ARQUIVOS YAML SÃO SUPER SUPER SENSÍVEIS A ERROS DE ESPAÇAMENTO OU ALINHAMENTO!
## visite http://www.yamllint.com/ para validar este arquivo conforme necessário

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Descomente estas duas linhas se desejar adicionar o Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"
##  - "templates/cloudflare.template.yml"

## quais portas TCP/IP este contêiner deve expor?
## Se você quiser que o Discourse compartilhe uma porta com outro servidor web como Apache ou nginx,
## consulte https://meta.discourse.org/t/17247 para detalhes
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Defina db_shared_buffers para no máximo 25% da memória total.
  ## será definido automaticamente pelo bootstrap com base na RAM detectada, ou você pode sobrescrever
  db_shared_buffers: "128MB"

  ## pode melhorar o desempenho de ordenação, mas aumenta o uso de memória por conexão
  #db_work_mem: "40MB"

  ## Qual revisão do Git este contêiner deve usar? (padrão: tests-passed)
  #version: tests-passed

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Quantas solicitações web concorrentes são suportadas? Depende da memória e dos núcleos da CPU.
  ## será definido automaticamente pelo bootstrap com base nas CPUs detectadas, ou você pode sobrescrever
  UNICORN_WORKERS: 2

  ## TODO: O nome de domínio ao qual esta instância do Discourse responderá
  DISCOURSE_HOSTNAME: engineersasylum.com

  ## Descomente se quiser que o contêiner seja iniciado com o mesmo
  ## nome de host (opção -h) especificado acima (padrão "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de e-mails separados por vírgula que serão feitos administradores e desenvolvedores
  ## no cadastro inicial, exemplo 'usuario1@exemplo.com,usuario2@exemplo.com'
  DISCOURSE_DEVELOPER_EMAILS: 'praveen369gen@gmail.com'

  ## TODO: O servidor de e-mail SMTP usado para validar novas contas e enviar notificações
  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           # (opcional, padrão true)

  ## Se você adicionou o modelo Lets Encrypt, descomente abaixo para obter um certificado SSL gratuito
  LETSENCRYPT_ACCOUNT_EMAIL: praxxxxxx@gmail.com

  ## O endereço do CDN para esta instância do Discourse (configurado para buscar)
  ## consulte https://meta.discourse.org/t/14857 para detalhes
  #DISCOURSE_CDN_URL: //discourse-cdn.example.com
  DISCOURSE_USE_S3: false

## O contêiner Docker é sem estado; todos os dados são armazenados em /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Plugins vão aqui
## consulte https://meta.discourse.org/t/19157 para detalhes
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

## Quaisquer comandos personalizados para executar após a construção
run:
  - exec: echo "Início dos comandos personalizados"
  ## Se quiser definir o endereço de e-mail 'De' para seu primeiro registro, descomente e altere:
  ## Após receber o primeiro e-mail de cadastro, comente novamente a linha. Ela só precisa ser executada uma vez.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Fim dos comandos personalizados"

Não me lembro exatamente, mas acho que migrei para o S3 usando rake uploads:migrate_to_s3

Não tenho a menor ideia, mas aqui está um tópico semelhante que apresenta exatamente o mesmo erro que você teve:

Talvez você queira verificar com um membro da equipe.

Olá @Pravi

Pergunta sobre a barra lateral:

No seu post com o arquivo yml, você “diz”:

DISCOURSE_SMTP_PASSWORD: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Isso está correto? A senha está entre aspas duplas no seu yml?

Sim, está entre aspas duplas. Não o alterei desde que o adicionei há dois anos.

Removi as aspas duplas, reconstruí o aplicativo novamente e tentei executar rake uploads:migrate_from_s3 novamente, mas sem sucesso. O mesmo erro.

Oi @Pravi,

Para ser honesto, sou contra o uso da AWS e do S3, então não os utilizo.

Você já considerou examinar a tarefa do Rake, fazer engenharia reversa desse script e simplesmente executar a tarefa manualmente, passo a passo?

Não tenho muita experiência com scripts internos do Discourse e estou um pouco receoso de editá-los. Não quero estragar tudo.

Você pode me dizer a localização do arquivo discourse.config? Não consigo encontrá-lo em lugar nenhum no meu servidor. O comando find não retornou nada.

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#

Olá @Pravi,

Desculpe se você me interpretou mal.

Eu não pedi que você editasse esse arquivo ou qualquer outro.

Para “engenharia reversa” de um script, na minha opinião, significa estudá-lo e ver como ele funciona, e não tem nada a ver com editar o arquivo. Significa lê-lo e entendê-lo.

Normalmente, se lermos e entendermos qualquer script ou arquivo que esteja gerando um erro, conseguimos compreender como resolver o problema.

Você está postando mensagens de erro de um arquivo que, aparentemente, não leu.

Espero que isso ajude.

Entendo seu ponto. Vou tentar fazer isso.
Você pode sugerir a localização do arquivo ‘discourse.config’? Onde estão armazenadas as configurações do S3?