最近、友人が突然廃業した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の自動バックアップサイクルと一致する必要があります。
- スクリプトを実行するアカウントのユーザー名とパスワードを入力してから、「次へ」をクリックします。
- 詳細設定を構成する場合は、チェックボックスを選択してから「完了」をクリックします。


