Недавно один из моих друзей столкнулся с проблемой: провайдер VPS внезапно закрылся без предупреждения. К сожалению, ради экономии она выбрала нишевого провайдера, который даже не предоставлял возможность скачивания данных. Хуже того, у неё не было привычки регулярно скачивать резервные копии. За одну ночь её сайт исчез вместе со всеми данными на нём.
Шокированная этим, я написала скрипт на PowerShell, который автоматически скачивает резервные копии с вашего сервера на локальный компьютер на регулярной основе, без необходимости покупать дополнительные услуги объектного хранилища или тратить деньги на что-либо ещё. Всё, что вам нужно, — это компьютер под управлением Windows, который вы регулярно используете (и на котором достаточно места на жёстком диске) и который подключён к Интернету.
Скрипт автоматически удаляет резервные копии старше 5 дней. Вы можете настроить интервал автоматического резервного копирования и срок хранения самых старых резервных копий на локальном компьютере в соответствии со своими потребностями.
$ssh_port = 22
$ssh_address = "username@your.site"
Write-Output "Запуск задачи по скачиванию резервных копий Discourse..."
Write-Output '------------------------'
Write-Output "Получение последнего файла резервной копии..."
Write-Output ''
while ($true) {
$filename = ''
while ($true) {
try {
Write-Output "> ssh -p $ssh_port $ssh_address 'cd /var/discourse/shared/standalone/backups/default/ && ls -t | head -n 1'"
Write-Output ''
$filename = ssh -p $ssh_port "$ssh_address" 'cd /var/discourse/shared/standalone/backups/default/ && ls -t | head -n 1'
break
}
catch {
$filename = ''
Write-Output "Не удалось получить... Вот лог:"
Write-Output '-------------'
Write-Output $_
$answer = Read-Host "Хотите попробовать снова? (y/N)"
if ($answer -ne 'y') {
break
}
Write-Output ''
}
}
if ([String]::IsNullOrEmpty($filename)) {
Write-Output "Ошибка: Не удалось получить имя файла $filename"
Write-Output ''
$answer = Read-Host 'Повторить? (y/N)'
if ($answer -eq 'y') {
}
else {
exit 1
}
}
else {
Write-Output "Последняя резервная копия: $filename"
Write-Output ''
$need_download = $true
if (Test-Path ".\backups\$filename") {
$answer = Read-Host ".\backups\$filename уже существует. Хотите скачать его снова? (y/N)"
Write-Output ''
if ($answer -ne 'y') {
$need_download = $false
}
}
if ($need_download) {
Write-Output "Начинаем скачивание..."
Write-Output ''
while ($true) {
try {
Write-Output "scp -p $ssh_port ${ssh_address}:/var/discourse/shared/standalone/backups/default/$filename .\backups\"
Write-Output ''
scp -p $ssh_port "${ssh_address}:/var/discourse/shared/standalone/backups/default/$filename" .\backups\
Write-Output "Скачивание завершено"
Write-Output ''
break
}
catch {
Write-Output "Скачивание не удалось >_<... Вот лог:"
Write-Output ''
Write-Output $_
$answer = Read-Host "Попробовать скачать снова? (y/N)"
Write-Output ''
if ($answer -ne 'y') {
break
}
}
}
}
Write-Output "Начинаем очистку старых файлов резервных копий..."
Write-Output ''
$count = 0
$backupfiles = Get-ChildItem -Path .\backups\
foreach ($file in $backupfiles) {
if ($file.CreationTime -le (Get-Date).AddDays(-5)) {
try {
Write-Output "Удаление старого файла резервной копии $file ..."
Write-Output ''
$file.Delete()
$count = $count + 1
} catch {
Write-Output "Произошла ошибка при удалении старого файла резервной копии $file >_<"
Write-Output '-------------------'
Write-Output $_
Write-Output '-------------------'
}
}
}
if ($count -ge 0) {
Write-Output "Удалено старых файлов резервных копий: $count"
Write-Output ''
}
else {
Write-Output 'Нет старых файлов резервных копий для удаления'
Write-Output ''
}
Pause
exit 0
}
}
Сохраните приведённый выше скрипт как scriptname.ps1 в каталоге, куда вы хотите скачивать резервные копии. Попробуйте запустить его через “Запуск с помощью PowerShell”. Если всё прошло успешно, переходите к следующему шагу.
Для планирования задачи
- Найдите “Планировщик заданий”.
- Дважды щёлкните “Создать задачу”. Откроется мастер создания запланированной задачи.
- Нажмите “Далее”, затем “Обзор”. Откроется диалоговое окно “Выбор программы для планирования”.
- Перейдите к созданному вами скрипту, выберите его и нажмите “Открыть”. Вы вернётесь в мастер создания запланированной задачи.
- Укажите имя задачи или оставьте имя по умолчанию (это имя файла), укажите, как часто нужно запускать скрипт, затем нажмите “Далее”.
- Укажите время и дату начала (если вы выбрали Ежедневно, Еженедельно, Ежемесячно и т. д.) и периодичность, затем нажмите “Далее”. Этот параметр должен соответствовать циклу автоматического резервного копирования вашего Discourse.
- Введите имя пользователя и пароль учётной записи, от имени которой будет выполняться скрипт, затем нажмите “Далее”.
- Если вы хотите настроить дополнительные свойства, установите соответствующий флажок, затем нажмите “Готово”.


