Heliosurge
(Dan DeMontmorency)
27.Декабрь.2025 22:58:40
3
Привет, Эд, очень дельные замечания. Насколько я помню, один из участников некоторое время назад создал скрипт для резервного копирования на другую систему. Нужно будет поискать и проверить.
Вот довольно полная цитата из оригинального поста. У Canapin есть хороший ответ со ссылкой на резервное копирование в Google Drive и Dropbox.
Lhc_fl:
Недавно один мой друг столкнулся с проблемой: провайдер VPS внезапно закрылся без предупреждения. К сожалению, ради экономии она выбрала узкоспециализированного провайдера, который даже не предоставлял возможность загрузки данных. Хуже того, у неё вообще не было привычки регулярно скачивать резервные копии. За одну ночь её сайт исчез вместе со всеми данными.
Шокированная этим, я написала скрипт на PowerShell, который автоматически скачивает резервные копии с вашего сервера на ваш локальный компьютер на регулярной основе, без необходимости покупать дополнительные услуги объектного хранилища или тратить деньги на что-либо ещё. Всё, что вам нужно, — это компьютер под управлением Windows, который вы регулярно используете (и на котором есть достаточно места на жёстком диске) и который подключён к интернету.
Скрипт автоматически удаляет резервные копии старше 5 дней. Вы можете настроить интервал автоматического резервного копирования и срок хранения самой старой копии локально в соответствии со своими потребностями.
$ssh_port = 22
$ssh_address = "username@your.site"
Write-Output "Starting Discourse backup download task..."
Write-Output '------------------------'
Write-Output "Fetching the latest backup file..."
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 "Failed to fetch... Here is the log:"
Write-Output '-------------'
Write-Output $_
$answer = Read-Host "Do you want to re-fetch? (y/N)"
if ($answer -ne 'y') {
break
}
Write-Output ''
}
}
if ([String]::IsNullOrEmpty($filename)) {
Write-Output "Error: Failed to fetch file name $filename"
Write-Output ''
$answer = Read-Host 'Retry?(y/N)'
if ($answer -eq 'y') {
}
else {
exit 1
}
}
else {
Write-Output "Latest backup: $filename"
Write-Output ''
$need_download = $true
if (Test-Path ".\backups\$filename") {
$answer = Read-Host ".\backups\$filename already exists. Do you want to download it again?(y/N)"
Write-Output ''
if ($answer -ne 'y') {
$need_download = $false
}
}
if ($need_download) {
Write-Output "Start downloading..."
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 "Download completed"
Write-Output ''
break
}
catch {
Write-Output "Download failed >_<... The following is the log:"
Write-Output ''
Write-Output $_
$answer = Read-Host "Download again? (y/N)"
Write-Output ''
if ($answer -ne 'y') {
break
}
}
}
}
Write-Output "Start trying to clean old backup files..."
Write-Output ''
$count = 0
$backupfiles = Get-ChildItem -Path .\backups\
foreach ($file in $backupfiles) {
if ($file.CreationTime -le (Get-Date).AddDays(-5)) {
try {
Write-Output "Delete old backup file $file ..."
Write-Output ''
$file.Delete()
$count = $count + 1
} catch {
Write-Output "An error occurred while deleting old backup file $file >_<"
Write-Output '-------------------'
Write-Output $_
Write-Output '-------------------'
}
}
}
if ($count -ge 0) {
Write-Output "Cleaned $count old backup files"
Write-Output ''
}
else {
Write-Output 'No old backup files need to clean up'
Write-Output ''
}
Pause
exit 0
}
}
Сохраните приведённый выше скрипт как scriptname.ps1 в той папке, куда вы хотите скачивать резервные копии. Попробуйте запустить через “Запуск с помощью PowerShell”. Если всё прошло успешно, можно переходить к следующему шагу.
Для планирования задачи:
Найдите “Планировщик заданий”.
Дважды щёлкните по пункту “Создать простую задачу”. Откроется мастер создания запланированной задачи.
Нажмите “Далее”, затем “Обзор”. Откроется диалоговое окно “Выбор программы для планирования”.
Перейдите к созданному вами скрипту, выберите его и нажмите “Открыть”. Вы вернётесь в мастер создания запланированной задачи.
Укажите имя задачи или оставьте значение по умолчанию (имя файла), задайте частоту выполнения скрипта, затем нажмите “Далее”.
Укажите время и дату начала (если вы выбрали ежедневное, еженедельное, ежемесячное и т. д. выполнение), а также периодичность, затем нажмите “Далее”. Этот параметр должен соответствовать циклу автоматического резервного копирования вашего Discourse.
Введите имя пользователя и пароль для учётной записи, от имени которой будет выполняться скрипт, затем нажмите “Далее”.
Если вы хотите настроить дополнительные свойства, установите соответствующий флажок, затем нажмите “Готово”.
@Canapin , с приложением launcher rebuild разве не нужно запускать его так:
./launcher r build app
Так я привык запускать его, следуя другим инструкциям на этом сайте. Хотя я узнал, что часто существует множество способов сделать одно и то же. Lol
Отличная статья, очень полезно.
1 лайк