Discourse Script Automatizado Semanal de Backup y Actualización (Evitando Problemas de Carga S3)

En Discourse, las copias de seguridad generadas mientras la función de carga S3 está habilitada a menudo no se pueden usar correctamente para restaurar el sitio, lo que hace que las copias de seguridad automáticas sean efectivamente inválidas. Para solucionar este problema, escribí este script que deshabilita las cargas S3 antes de iniciar la copia de seguridad, asegurando que los archivos de copia de seguridad estén completos y sean utilizables. Después de que finaliza la copia de seguridad, el script vuelve a habilitar las cargas S3 para mantener las operaciones normales del sitio y el almacenamiento de archivos.

Además, el script habilita el Modo de Solo Lectura durante el proceso de copia de seguridad y actualización para prevenir escrituras de datos y asegurar la consistencia. Finalmente, extrae automáticamente las últimas actualizaciones de código y reconstruye el contenedor Docker para completar el ciclo de mantenimiento.

Espero que este script pueda ayudar a otros administradores de Discourse. ¡Se aceptan comentarios y sugerencias de mejora!

#!/bin/bash

set -e

LOG_FILE="/var/discourse/scripts/weekly_update.log"

log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" 
}

log "=== Actualización Semanal de Discourse Iniciada ==="

cd /var/discourse || { log "Falló al cambiar al directorio /var/discourse"; exit 1; }

log "Habilitando Modo de Solo Lectura..."
sudo docker exec app rails runner "SiteSetting.readonly_mode = true; puts 'Modo de solo lectura habilitado'" 

log "Deshabilitando cargas S3..."
sudo docker exec app rails runner "SiteSetting.enable_s3_uploads = false"

log "Iniciando copia de seguridad..."
if ! sudo docker exec app discourse backup ; then
  log "Copia de seguridad fallida"
  exit 1
fi
log "Copia de seguridad exitosa."

log "Habilitando cargas S3..."
sudo docker exec app rails runner "SiteSetting.enable_s3_uploads = true"

log "Deshabilitando Modo de Solo Lectura..."
sudo docker exec app rails runner "SiteSetting.readonly_mode = false; puts 'Modo de solo lectura deshabilitado'"

log "Extrayendo últimos cambios de git..."
git pull 

log "Reconstruyendo contenedor..."
./launcher rebuild app 

log "Actualización semanal completa."

exit 0
1 me gusta

Hola,

¿Podrías por favor dar más detalles sobre esto? ¿Cuál es el problema específicamente?
¿El archivo está corrupto a veces con S3 habilitado?

Hola, ¡gracias por tu pregunta!

Sí, el problema es que cuando enable_s3_uploads está habilitado durante la copia de seguridad, el archivo resultante a menudo no se puede restaurar con éxito. Si bien la razón técnica exacta no está completamente clara (y se ha discutido en varios hilos), el proceso de restauración falla con frecuencia a menos que S3 se deshabilite antes de la copia de seguridad.

Puedes encontrar varios informes en Meta buscando \"enable_s3_uploads restore\".

Por ejemplo, este hilo muestra un caso de fallo típico:
:link: Trouble restoring backup--SiteSetting::Upload.s3_base_url is failing--because enable_s3_uploads was set in database

Por eso mi script deshabilita temporalmente S3 antes de la copia de seguridad, para garantizar que el resultado sea limpio y restaurable.

¡Espero que esto ayude a aclarar!

1 me gusta

Estoy bastante seguro de que si haces una copia de seguridad solo de la base de datos, no intentará realizar las operaciones de S3 que pueden fallar por diversas razones.