Discourse automatisiertes wöchentliches Backup- und Update-Skript (Vermeidung von S3-Upload-Problemen)

Bei Discourse können Backups, die erstellt werden, während die S3-Upload-Funktion aktiviert ist, oft nicht erfolgreich zur Wiederherstellung der Website verwendet werden, wodurch automatische Backups effektiv ungültig werden. Um dieses Problem zu lösen, habe ich dieses Skript geschrieben, das S3-Uploads deaktiviert, bevor die Sicherung beginnt, wodurch sichergestellt wird, dass die Backup-Dateien vollständig und verwendbar sind. Nach Abschluss der Sicherung aktiviert das Skript S3-Uploads wieder, um den normalen Website-Betrieb und die Dateispeicherung aufrechtzuerhalten. Zusätzlich aktiviert das Skript während des Sicherungs- und Update-Prozesses den schreibgeschützten Modus, um Schreibvorgänge zu verhindern und die Konsistenz zu gewährleisten. Schließlich ruft es automatisch die neuesten Code-Updates ab und baut den Docker-Container neu auf, um den Wartungszyklus abzuschließen. Ich hoffe, dieses Skript kann anderen Discourse-Administratoren helfen. Feedback und Verbesserungsvorschläge sind willkommen!

#!/bin/bash

set -e

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

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

log "=== Weekly Discourse Update Started ==="

cd /var/discourse || { log "Failed to cd /var/discourse"; exit 1; }

log "Enabling Read-Only Mode..."
sudo docker exec app rails runner "SiteSetting.readonly_mode = true; puts 'Readonly mode enabled'" 

log "Disabling S3 uploads..."
sudo docker exec app rails runner "SiteSetting.enable_s3_uploads = false" 

log "Starting backup..."
if ! sudo docker exec app discourse backup 
  log "Backup failed"
  exit 1
fi
log "Backup succeeded."

log "Enabling S3 uploads..."
sudo docker exec app rails runner "SiteSetting.enable_s3_uploads = true" 

log "Disabling Read-Only Mode..."
sudo docker exec app rails runner "SiteSetting.readonly_mode = false; puts 'Readonly mode disabled'" 

log "Pulling latest git changes..."
git pull 

log "Rebuilding container..."
./launcher rebuild app 

log "Weekly update complete."

exit 0
1 „Gefällt mir“

Hallo,

Können Sie das bitte näher erläutern? Was genau ist das Problem?
Ist das Archiv manchmal beschädigt, wenn S3 aktiviert ist?

Hallo, danke für deine Frage!

Ja – das Problem ist, dass, wenn enable_s3_uploads während des Backups aktiviert ist, das resultierende Archiv oft nicht erfolgreich wiederhergestellt werden kann. Obwohl der genaue technische Grund nicht vollständig geklärt ist (und in mehreren Threads diskutiert wurde), schlägt der Wiederherstellungsprozess häufig fehl, es sei denn, S3 wird vor dem Backup deaktiviert.

Du findest mehrere Berichte auf Meta, indem du nach \"enable_s3_uploads restore\" suchst.

Zum Beispiel zeigt dieser Thread einen typischen Fehlerfall:
:link: Trouble restoring backup--SiteSetting::Upload.s3_base_url is failing--because enable_s3_uploads was set in database

Deshalb deaktiviert mein Skript S3 vor dem Backup vorübergehend, um sicherzustellen, dass das Ergebnis sauber und wiederherstellbar ist.

Ich hoffe, das hilft zur Klärung!

1 „Gefällt mir“

Ich bin ziemlich sicher, dass, wenn Sie nur ein Datenbank-Backup erstellen, es nicht versuchen wird, die S3-Sachen zu tun, die aus verschiedenen Gründen fehlschlagen können.