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