В 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