Recentemente, uma amiga minha se deparou com o problema de o provedor de VPS falir repentinamente sem aviso prévio. Infelizmente, por uma questão de preço baixo, ela escolheu um provedor de nicho - um que nem sequer oferecia download de dados. Pior ainda, ela nem tem o hábito de baixar backups regularmente. Da noite para o dia, o site dela desapareceu, juntamente com todos os dados nele contidos.
Chocado com isso, escrevi um script Powershell que baixará automaticamente backups do seu servidor para o seu computador local regularmente, sem a necessidade de comprar serviços adicionais de armazenamento de objetos ou gastar um centavo em outras coisas. Tudo o que você precisa é de um computador Windows que você usa regularmente (e que tenha bastante espaço em disco) e esteja conectado à Internet.
O script limpará automaticamente os backups de 5 dias atrás. Você pode definir o intervalo de backup automático e o tempo do backup mais antigo salvo localmente de acordo com suas necessidades.
$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
}
}
Salve o script acima como scriptname.ps1 no caminho onde você deseja baixar o backup. Tente “Executar com Powershell”. Se for bem-sucedido, você poderá prosseguir para a próxima etapa.
Para agendar uma tarefa
- Pesquise por “Agendador de Tarefas”.
- Clique duas vezes em Adicionar Tarefa Agendada. O Assistente de Tarefa Agendada aparece.
- Clique em Avançar e, em seguida, clique em Procurar. A caixa de diálogo Selecionar Programa para Agendar aparece.
- Navegue até o script que você criou, clique nele e, em seguida, clique em Abrir. Você retorna ao Assistente de Tarefa Agendada.
- Forneça um nome para a tarefa, ou mantenha o padrão, que é o nome do arquivo, especifique a frequência com que o script deve ser executado e clique em Avançar.
- Especifique a hora e a data de início (se você especificou Diariamente, Semanalmente ou Mensalmente, etc.) e a recorrência, em seguida, clique em Avançar. Este item deve corresponder ao ciclo de backup automático do seu discourse.
- Digite o nome de usuário e a senha da conta que executará o script e clique em Avançar.
- Se você quiser configurar propriedades avançadas, selecione a caixa de seleção e clique em Concluir.


