Fórum ficou inutilizável

Olá, estou tentando habilitar backups S3 para um servidor Min.IO. Quando altero o app.yml para o que acredito refletir a documentação, então reconstruo, ao concluir, tudo o que recebo no navegador são os 4 pontos coloridos no meio da tela. Quando olho no console, recebo;

Uncaught ReferenceError: I18n is not defined
    at admin?v=103a67b2358b…86c5a58d96d4e91:1:1
wizard?v=ab2295f1774…85b733472935c34a0:1
Uncaught ReferenceError: I18n is not defined
    at wizard?v=ab2295f1774…b733472935c34a0:1:1

Minhas alterações no app.yml são as seguintes;

  DISCOURSE_BACKUP_LOCATION: 's3'
  DISCOURSE_USE_S3: 'true'
  DISCOURSE_S3_REGION: 'off-cloud-backup'
  DISCOURSE_S3_ENDPOINT: 'http://borg....'
  DISCOURSE_S3_ACCESS_KEY_ID: '(my uid here)'
  DISCOURSE_S3_SECRET_ACCESS_KEY: '(my key here)'
  DISCOURSE_S3_CDN_URL: 'http://borg....'
  DISCOURSE_S3_BUCKET: 'assets'
  DISCOURSE_S3_BACKUP_BUCKET: 'discourse-data'
  DISCOURSE_S3_INSTALL_CORS_RULE: 'false'

No servidor Min, configurei a região, depois um bucket público chamado ‘assets’, depois um bucket privado chamado ‘discourse-data’, e obviamente credenciais correspondentes. Tentei sem aspas nas variáveis por via das dúvidas, pois alguns exemplos fazem isso - sem alteração.

Se eu alterar essas configurações e reiniciar, elas não parecem ser aplicadas. Preciso reconstruir para que elas ativem, o que torna o ciclo de testes bem doloroso. Seria um pouco mais fácil se esses campos estivessem todos disponíveis nas configurações de administração, como pareciam ter sido historicamente, ou pelo menos aparecem em algumas capturas de tela de pessoas (?).

Se eu comentar todas as entradas _S3 no app.yml e reconstruir, funciona bem. (Eu apenas não tenho backups configurados) (os URLs ENDPOINT e CDN resolvem localmente para o IP correto)

Configurar todo o resto, incluindo assinaturas, foi relativamente fácil, mas bati em um muro com isso. Alguém tem alguma ideia do que estou fazendo errado?

Você quer apenas backups no S3? Se sim, você só precisa ter as chaves e o bucket de backup.

Você o configurou para todos os ativos no S3, mas provavelmente se esqueceu da parte no topo das instruções que tem tarefas rake para pré-compilar ativos e enviá-los para o S3.

Oi, obrigado por isso, vou tentar duas coisas então;

  • Reconstruir com ACCESS, SECRET e BACKUP_BUCKET (e imagino que endpoint?)
  • Tentando adicionar as tarefas rake e reconstruir

Você está certo que eu só queria os dados inicialmente, mas provavelmente teria progredido para os assets assim que algo estivesse funcionando.

Dito tudo isso, minha (muito pobre) interpretação da documentação que torna o site efetivamente morto, parece potencialmente problemática para iniciantes. Não tenho certeza por que o console está relatando I18n como um problema, mas parece uma modificação menor no código algo como;

if (I18n && I18n.xxx) 

em vez de;

if (I18n.xxx)

Poderia proteger iniciantes de destruir seus sites… devo vasculhar e tentar fazer um PR, ou é algo que alguém com mais expertise poderia olhar? Ficarei feliz em tentar, mas não quero perder meu tempo se não for útil…?

Mmm, Ok, fiz um pequeno progresso, as configurações simplificadas agora permitem que a página seja renderizada, no entanto, estou recebendo um ‘bad request’ do servidor. Estou testando o armazenamento S3 da máquina Discourse usando a ferramenta “mc” do Min.io e parece funcionar bem e posso listar buckets .. no entanto, nos logs, estou recebendo;

Falha ao listar backups do S3: Aws::S3::Errors::BadRequest

E

/var/www/discourse/lib/backup_restore/s3_backup_store.rb:140:in `rescue in unsorted_files' 
/var/www/discourse/lib/backup_restore/s3_backup_store.rb:131:in `unsorted_files' 
/var/www/discourse/lib/backup_restore/backup_store.rb:23:in `files' 

Fiz questão de copiar e colar as configurações de app.yml na configuração “mc” para garantir que não houvesse erros de digitação .. então estou um pouco perdido por um segundo. Talvez tente novamente amanhã …

Está tentando listar o conteúdo do bucket.

Você não precisa da tarefa rake que tem a ver com ativos.

Está tentando listar o conteúdo do bucket.
Você não precisa da tarefa rake que tem a ver com assets.

Ok, obrigado pela ajuda, eu notei isso, no entanto, não está realmente ajudando. Eu tentei Min.io e SeaweedFS, ambos eu configurei localmente a ponto de conseguir escrever um arquivo no S3 usando uma ferramenta de linha de comando da máquina Discourse, nenhuma das opções parece querer cooperar de dentro do Discourse. Após revisar o tempo gasto, acho que se os backups estiverem online e no S3, posso ver como a opção de backup direto para S3 é ótima, no entanto, se seus backups estiverem “fora da nuvem” e você precisar emular o armazenamento S3 apenas para usar a opção, para mim isso se tornou um pouco caro em termos de tempo.

A propósito, notei alguém dizendo que o CloudFlare S3 agora funciona, o que pode ser bom para algumas pessoas. O CloudFlare parece ter adicionado 10G de S3 ao seu nível gratuito, no entanto, para mim, meus backups geralmente estão fora da nuvem em um servidor de backup Borg.

O que eu fiz em vez disso foi adicionar a máquina host do Discourse à minha VPN de backup, instalei borg e borgmatic cobrindo /var/discourse/shared/standalone/backups e /var/discourse/shared/standalone/log no host, e então adicionei isso ao cron 30 minutos após o backup local ser agendado.

P: Você poderia esclarecer se os backups locais cobrem tudo, ou preciso de mais para cobrir uploads? (as tarefas rake adicionais são apenas para S3?)

Meu eu paranoico simplesmente não confia em provedores de nuvem com sistemas ativos E backups. Toda vez que penso que talvez eu me preocupe demais, lembro-me da vez em que fui a um cliente em resposta a meu servidor não está funcionando e descobri que ele havia sido atingido por um raio - dentro da sala do servidor.

Você seguiu as instruções específicas do Minio aqui? Configure an S3 compatible object storage provider for uploads

Se você está apenas alterando essas variáveis de ambiente, pode fazer um

  ./launcher destroy app;./launcher start app

Se você for colocar ativos lá e não apenas backups, não perca a tarefa rake que envia os ativos para lá.

1 curtida

Você seguiu as instruções específicas do Minio aqui?

Sim, segui. Fico feliz em admitir que posso ter cometido erros e não ter lido/retido tudo, mas pesquisar a documentação apropriada não foi um deles… :wink:

./launcher destroy app;./launcher start app

Ok, isso é útil para referência futura, eu estava tentando parar/iniciar, não estou muito familiarizado com como o docker constrói variáveis de ambiente na inicialização.

Se você vai colocar ativos lá e não apenas backups, então não perca a tarefa rake que envia os ativos para lá.

Claro, essa foi a parte que me deixou um pouco confuso, vou adicioná-los. Estava apenas me perguntando por que estes não fariam parte do backup padrão, sei que há um problema de espaço, mas minha expectativa seria que, em geral, as pessoas quisessem um backup de todo o seu conteúdo? (e como a maioria das pessoas não parece verificar seus conteúdos, errar no lado de tudo talvez seja mais seguro?)

Hmm, eu tentei primeiro na minha instância de teste (!) .. Copiei e colei duas linhas da documentação .. algo está desatualizado em algum lugar?

I, [2023-09-04T18:39:51.544973 #1]  INFO -- : cd /var/www/discourse/plugins & sudo -E -u discourse bundle exec rake s3:upload_assets
bundler: failed to load command: rake (/var/www/discourse/vendor/bundle/ruby/3.2.0/bin/rake)
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/definition.rb:524:in `materialize': Could not find css_parser-1.16.0, oj-3.16.1, rotp-6.3.0, globalid-1.2.0, google-protobuf-3.24.2-x86_64-linux in locally installed gems (Bundler::GemNotFound)
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/definition.rb:197:in `specs'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/definition.rb:254:in `specs_for'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/runtime.rb:18:in `setup'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler.rb:162:in `setup'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/setup.rb:23:in `block in <top (required)>'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/ui/shell.rb:159:in `with_level'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/ui/shell.rb:111:in `silence'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/setup.rb:23:in `<top (required)>'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/cli/exec.rb:56:in `require_relative'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/cli/exec.rb:56:in `kernel_load'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/cli/exec.rb:23:in `run'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/cli.rb:492:in `exec'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/cli.rb:34:in `dispatch'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/cli.rb:28:in `start'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/exe/bundle:45:in `block in <top (required)>'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/bundler-2.4.13/exe/bundle:33:in `<top (required)>'
        from /usr/local/bin/bundle:25:in `load'
        from /usr/local/bin/bundle:25:in `<main>'
I, [2023-09-04T18:39:52.163459 #1]  INFO -- : 
I, [2023-09-04T18:39:52.164462 #1]  INFO -- : Terminating async processes

Meus hooks ficam assim;

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets
          - sudo -E -u discourse git clone https://github.com/discourse/docker_manager.git
          - sudo -E -u discourse git clone https://github.com/discourse/discourse-whos-online
          - sudo -E -u discourse git clone https://github.com/discourse/discourse-solved.git
          - sudo -E -u discourse git clone https://github.com/discourse/discourse-reactions.git
          - sudo -E -u discourse git clone https://github.com/discourse/discourse-subscriptions.git
          - sudo -E -u discourse git clone https://github.com/discourse/discourse-topic-voting.git
          - sudo -E -u discourse git clone https://github.com/discourse/discourse-calendar.git
          - sudo -E -u discourse git clone https://github.com/sylque/discourse-home-page.git
          - sudo -E -u discourse git clone https://github.com/sylque/discpage.git
          - sudo -E -u discourse git clone https://github.com/discourse/discourse-onboarding-banner.git

Essas tarefas rake não vão aí.

Se seus uploads estão no S3, você está contando com o gerenciador do S3 para fazer funcionar, então você não precisa de backups. Existe uma configuração oculta para baixar ativos do S3 e incluí-los no backup, mas você quase certamente não quer fazer isso.

Mmm, eu tinha notado anteriormente que outra pessoa havia falado sobre colocar coisas na seção errada, então fui em frente e fiz a mesma coisa de qualquer maneira, eek (!)\n\nEntão, depois de ler com mais atenção, ainda parece que tenho um problema, eu tenho;\nyaml\nhooks:\n after_code:\n - exec:\n cd: $home/plugins\n cmd:\n - git clone https://github.com/discourse/docker_manager.git\n - git clone https://github.com/discourse/discourse-whos-online\n - git clone https://github.com/discourse/discourse-solved.git\n - git clone https://github.com/discourse/discourse-reactions.git\n - git clone https://github.com/discourse/discourse-subscriptions.git\n - git clone https://github.com/discourse/discourse-topic-voting.git\n - git clone https://github.com/discourse/discourse-calendar.git\n - git clone https://github.com/sylque/discourse-home-page.git\n - git clone https://github.com/sylque/discpage.git\n - git clone https://github.com/discourse/discourse-onboarding-banner.git\n\n after_assets_precompile:\n - exec:\n cd: $home\n cmd:\n - sudo -E -u discourse bundle exec rake s3:upload_assets\n - sudo -E -u discourse bundle exec rake s3:expire_missing_assets\n\nEle diz para colar em app.yml na seção hooks .. isso parece certo ou ainda estou no lugar errado? O erro que estou recebendo agora é;\n\nFAILED\n--------------------\nPups::ExecError: cd /var/www/discourse &amp;&amp; sudo -E -u discourse bundle exec rake s3:upload_assets failed with return #&lt;Process::Status: pid 1845 exit 1&gt;\nLocation of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'\nexec failed with the params {\"cd\"=&gt;\"$home\", \"cmd\"=&gt;[\"sudo -E -u discourse bundle exec rake s3:upload_assets\", \"sudo -E -u discourse bundle exec rake s3:expire_missing_assets\"]}\nbootstrap failed with exit code 1\n\nEstou olhando de volta para os logs para mais detalhes, mas não estou vendo nada. Infelizmente, eu nunca programei em Ruby, então eu realmente não sei o que estou olhando / procurando, alguma ideia?\n\nNota; aconselhou a executar ./discourse-doctor, o que eu fiz, mas não pareceu me dizer nada diferente ..