Скрипт автоматического еженедельного резервного копирования и обновления 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_FILE"
}

log "=== Начато еженедельное обновление Discourse ==="

cd /var/discourse || { log "Не удалось перейти в каталог /var/discourse"; exit 1; }

log "Включение режима «Только для чтения»..."
sudo docker exec app rails runner "Discourse.enable_readonly_mode(Discourse::USER_READONLY_MODE_KEY); puts 'Режим «Только для чтения» включён'" >> "$LOG_FILE" 2>&1

log "Отключение загрузки в S3..."
sudo docker exec app rails runner "SiteSetting.enable_s3_uploads = false" >> "$LOG_FILE" 2>&1

log "Начало резервного копирования..."
if ! sudo docker exec app discourse backup >> "$LOG_FILE" 2>&1; then
  log "Резервное копирование не удалось"
  exit 1
fi
log "Резервное копирование выполнено успешно."

log "Включение загрузки в S3..."
sudo docker exec app rails runner "SiteSetting.enable_s3_uploads = true" >> "$LOG_FILE" 2>&1

log "Отключение режима «Только для чтения»..."
sudo docker exec app rails runner "Discourse.disable_readonly_mode(Discourse::USER_READONLY_MODE_KEY); puts 'Режим «Только для чтения» отключён'" >> "$LOG_FILE" 2>&1

log "Загрузка последних изменений из git..."
git pull >> "$LOG_FILE" 2>&1

log "Пересборка контейнера..."
./launcher rebuild app >> "$LOG_FILE" 2>&1

log "Еженедельное обновление завершено."

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, которые могут завершиться ошибкой по различным причинам.