Fallo de restauración - Copia de seguridad S3 (compatible)

Así que he estado intentando restaurar una copia de seguridad, pero estoy recibiendo errores. Parece que tiene que ver con las copias de seguridad en S3.

Es importante destacar que esto se está haciendo con un servicio compatible con S3 (Scaleway). Sin embargo, no estoy seguro de si este error es específico del servicio compatible o no; la configuración funcionó de manera muy fluida y ha estado operando correctamente. Si es específico de Scaleway, probablemente dejaré de usar su servicio, ya que entiendo que solo AWS S3 está oficialmente soportado.

Utilicé esta guía para configurarlo: Configure an S3 compatible object storage provider for uploads, por lo que esto está en el archivo app.yml.

  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets

También utilicé la misma configuración para Scaleway en el archivo app.yml (no la configuré en la sección de administración, ya que parecía innecesaria): configuración de Scaleway

He intentado tanto desde el área de administración como desde la línea de comandos en el servidor actual, así como configurando un nuevo servidor (copié el archivo app.yml) y restaurando mediante la línea de comandos. Obtengo los mismos errores.

[INICIADO]
'system' ha iniciado la restauración.
Marcando la restauración como en ejecución...
Asegurando que exista /var/www/discourse/tmp/restores/default/2020-07-16-131434...
Descargando el archivo comprimido al directorio tmp...
#<Thread:0x000055c73a831df8@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> finalizado con excepción (report_on_exception es true):
Traceback (última llamada desde):
	1: desde /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 niveles) en thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': método `split' no definido para nil:NilClass (NoMethodError)
EXCEPCIÓN: método `split' no definido para nil:NilClass
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 niveles) en thread_batches'
Intentando revertir...
No fue necesario revertir
Limpiando archivos...
Eliminando el directorio tmp '/var/www/discourse/tmp/restores/default/2020-07-16-131434'...
Reanudando sidekiq...
Marcando la restauración como finalizada...
Notificando a 'system' sobre el final de la restauración...
#<Thread:0x000055c73a831510@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> finalizado con excepción (report_on_exception es true):
Traceback (última llamada desde):
	1: desde /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 niveles) en thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': método `split' no definido para nil:NilClass (NoMethodError)
#<Thread:0x000055c73a8316c8@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> finalizado con excepción (report_on_exception es true):
Traceback (última llamada desde):
	1: desde /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 niveles) en thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': método `split' no definido para nil:NilClass (NoMethodError)
#<Thread:0x000055c73a8319e8@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> finalizado con excepción (report_on_exception es true):
Traceback (última llamada desde):
	1: desde /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 niveles) en thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': método `split' no definido para nil:NilClass (NoMethodError)
¡Finalizado!
[FALLIDO]
Restauración completada.

¿Quizás el error sea solo al descargar la copia de seguridad? :face_with_monocle:

1 me gusta

Parece que sí.

Te sugiero cambiar la ubicación de la copia de seguridad a local en app.yml, reconstruir, descargar el archivo de copia de seguridad manualmente y restaurarlo desde la consola.

3 Me gusta

Ah, eso tiene sentido. ¡Gracias @Falco! :slight_smile:

Lo probaré por la mañana y te cuento~

2 Me gusta

¡Gracias @Falco, lo aprecio! Funcionó completamente sin problemas :smiley:

Migré a un nuevo servidor; parece que también habría estado bien quedarme en el mismo.

Por si alguien más quiere consultar esto más adelante, los pasos con más detalle fueron (tenga en cuenta que mis configuraciones de S3 estaban solo en el archivo app.yml, tal como se especifica aquí, sin personalizaciones en la configuración de administración):

  1. En el sitio de origen, si no es una reversión, habilita ‘deshabilitar correos electrónicos’ (puede no ser necesario) y activa el modo de solo lectura (recuerda volver a cambiar estas opciones en la nueva instancia una vez que la migración esté completa). Crea una copia de seguridad; una vez completada, considera detener también la instancia antigua (./launcher stop app). Independientemente de si es una reversión o no, actualiza los registros A de DNS para que apunten a la dirección IP del nuevo servidor. Puedes hacer esto de una manera más elegante o en un orden diferente para minimizar el tiempo de inactividad; en mi caso, el tiempo de inactividad no fue un problema (reversión, foro no lanzado).

  2. Instala Discourse en el nuevo servidor y migra todo lo personalizado en app.yml, incluidas las configuraciones de S3. Asegúrate de que las versiones de Discourse sean iguales o muy similares.

  3. Comenta estas dos líneas (otras configuraciones de S3 en app.yml pueden dejarse tal cual):
    DISCOURSE_S3_BACKUP_BUCKET: BucketName
    DISCOURSE_BACKUP_LOCATION: s3

  4. Descarga manualmente la copia de seguridad deseada desde S3 o un servicio compatible con S3.

  5. Navega a /var/discourse/shared/standalone/backups y crea una nueva carpeta llamada ‘default’ si no existe (no existirá si es una instalación nueva). Luego, mientras estás en el directorio de copias de seguridad, ejecuta (esto cambia los permisos de la carpeta para que coincidan con los que tendría normalmente si Discourse hubiera creado una copia de seguridad local; no estoy seguro de si es necesario):
    chown -R 1000:www-data default

  6. Sube la copia de seguridad a la carpeta backups/default usando un cliente SFTP; no cambies el nombre del archivo de copia de seguridad.

  7. Reconstruye la aplicación:
    cd /var/discourse
    ./launcher rebuild app

  8. Entra en la aplicación, habilita las copias de seguridad y restaura (cambia el nombre de BackupFileName.tar.gz):

./launcher enter app
discourse enable_restore
discourse restore BackupFileName.tar.gz
  1. Una vez completado, descomenta las dos líneas de archivo de copia de seguridad de S3 en app.yml del paso 2 y reconstruye la aplicación.

  2. Puedes eliminar la carpeta local backups/default y la copia de seguridad contenida (/var/discourse/shared/standalone/backups).

Referencia:

4 Me gusta

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.