Discourse 자동 주간 백업 및 업데이트 스크립트 (S3 업로드 문제 방지)

Discourse에서 S3 업로드 기능이 활성화된 상태에서 생성된 백업은 사이트 복구에 성공적으로 사용할 수 없는 경우가 많아, 자동 백업이 사실상 무용지물이 되는 문제가 있습니다. 이 문제를 해결하기 위해 백업 시작 전 S3 업로드를 비활성화하여 백업 파일이 완전하고 사용 가능하도록 보장하는 스크립트를 작성했습니다. 백업이 완료되면 스크립트는 S3 업로드를 다시 활성화하여 사이트의 정상적인 운영과 파일 저장을 유지합니다.

또한, 스크립트는 백업 및 업데이트 과정에서 읽기 전용 모드(Read-Only Mode)를 활성화하여 데이터 기록을 방지하고 일관성을 보장합니다. 마지막으로, 최신 코드 업데이트를 자동으로 가져오고 Docker 컨테이너를 다시 빌드하여 유지 관리 사이클을 완료합니다.

이 스크립트가 다른 Discourse 관리자들에게 도움이 되기를 바랍니다. 피드백과 개선 제안은 환영합니다!

#!/bin/bash

set -e

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

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

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 "Discourse.enable_readonly_mode(Discourse::USER_READONLY_MODE_KEY); puts 'Readonly mode enabled'" >> "$LOG_FILE" 2>&1

log "Disabling S3 uploads..."
sudo docker exec app rails runner "SiteSetting.enable_s3_uploads = false" >> "$LOG_FILE" 2>&1

log "Starting backup..."
if ! sudo docker exec app discourse backup >> "$LOG_FILE" 2>&1; 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_FILE" 2>&1

log "Disabling Read-Only Mode..."
sudo docker exec app rails runner "Discourse.disable_readonly_mode(Discourse::USER_READONLY_MODE_KEY); puts 'Readonly mode disabled'" >> "$LOG_FILE" 2>&1

log "Pulling latest git changes..."
git pull >> "$LOG_FILE" 2>&1

log "Rebuilding container..."
./launcher rebuild app >> "$LOG_FILE" 2>&1

log "Weekly update complete."

exit 0
1개의 좋아요

안녕하세요,

이 부분에 대해 좀 더 자세히 설명해 주실 수 있을까요? 구체적으로 어떤 문제인가요?
S3가 활성화된 상태에서 아카이브가 손상되는 경우가 있는 건가요?

안녕하세요, 질문해 주셔서 감사합니다!

네 — 문제가 발생하는 이유는 enable_s3_uploads가 백업 중에 활성화되어 있을 때, 생성된 아카이브가 성공적으로 복구되지 못하는 경우가 많기 때문입니다. 정확한 기술적 원인은 아직 완전히 명확하지는 않지만(여러 스레드에서 논의가 이루어져 왔음), S3를 백업 전에 비활성화하지 않으면 복구 과정이 자주 실패합니다.

Meta에서 "enable_s3_uploads restore"로 검색하면 여러 관련 보고서를 찾을 수 있습니다.

예를 들어, 이 스레드에는 전형적인 실패 사례가 나와 있습니다:
:link: Trouble restoring backup--SiteSetting::Upload.s3_base_url is failing--because enable_s3_uploads was set in database

그래서 제 스크립트는 백업 전에 S3를 일시적으로 비활성화하여, 결과가 깨끗하고 복구 가능한 상태임을 보장합니다.

도움이 되셨으면 좋겠습니다!

1개의 좋아요

데이터베이스만 백업하면, 다양한 이유로 실패할 수 있는 S3 관련 작업은 시도하지 않을 것이라고 확신합니다.