Discourse 自动每周备份和更新脚本 (避免S3上传问题)

在 Discourse 中,启用 S3 上传功能时生成的备份通常无法成功用于恢复站点,这使得自动备份实际上无效。为了解决这个问题,我编写了这个脚本,它会在开始备份之前禁用 S3 上传,确保备份文件完整且可用。备份完成后,脚本会重新启用 S3 上传以维持站点的正常运行和文件存储。

此外,脚本在备份和更新过程中会启用只读模式,以防止数据写入并确保一致性。最后,它会自动拉取最新的代码更新并重建 Docker 容器,以完成维护周期。

希望这个脚本能帮助到其他 Discourse 管理员。欢迎提供反馈和改进建议!

#!/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 
then
  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 个赞

您好,

您能详细说明一下吗?具体是什么问题?
启用 S3 时,存档有时会损坏吗?

您好,感谢您的提问!

是的,问题在于启用 enable_s3_uploads 进行备份时,生成的归档文件通常无法成功恢复。虽然确切的技术原因尚不完全清楚(并且在多个帖子中已讨论过),但在禁用 S3 之前进行备份,恢复过程经常会失败。

您可以通过搜索 \"enable_s3_uploads restore\" 在 Meta 上找到多个报告。

例如,此帖子显示了一个典型的失败案例:
:link: Trouble restoring backup--SiteSetting::Upload.s3_base_url is failing--because enable_s3_uploads was set in database

这就是为什么我的脚本会在备份前暂时禁用 S3,以确保结果干净且可恢复。

希望这能帮助您理解!

1 个赞

我很确定,如果你进行仅数据库的备份,它就不会尝试执行那些可能因各种原因而失败的 S3 操作。