Исходные данные

Задача

Получить бакап БД и файлов RedMine размером поменьше чем целый образ Hyper-V.

Надо немного уметь в PowerShell и PuTTY (хотя рекомендую WinSCP - визуально править файлы и по каталога ходить).

После отладки и корректировки под свои дополнительные нужды (например исключить большие Git каталоги) засунуть в стандартный планировщик Windows (не забыть про указание рабочего каталога).

Реализация

После номера пункта, Система в которой выполняем действие.

1. Windows. Установить OpenSSH.Client, выполнить PowerShell

Add-WindowsCapability -Online -Name OpenSSH.Client*

2. Windows. Сгенерировать shh ключ, выполнить PowerShell

cd c:\Users\[UserName]\.ssh
ssh-keygen -t rsa -b 4096 -C "your_mail@example.com"

[UserName] - имя текущего пользователя.

Каталог c:\Users\[UserName]\.ssh обычно скрытый и\или системный. При отсутствии каталога предварительно его создать.

your_mail@example.com - e-mail текущего пользователя.

3. Redmine. Содержимым из c:\Users\[UserName]\.ssh\id_rsa.pub дополнить файл(добавить новую строку) root/.ssh/authorized_keys

Каталог root/.ssh/authorized_keys обычно скрытый и\или системный.

4. Windows. Установка первого соединения, выполнить PowerShell

ssh root@192.168.1.155

root - пользователь RedMine

192.168.1.155 - IP Hyper-V, где развернут RedMine

PowerShell попросит принять соединение, набрать yes и нажать Enter, если всё сделано верно больше вводить пароль при подключении по ssh больше не придётся.

5. Windows. Создаем файл StartBackUp.ps1 с содержимым в рабочем каталоге пользователя (в данный каталог будет производиться архивация данных RedMine)

cls
#Текущая дата
$DateStr=(Get-Date).ToString("yyyy_MM_dd_hh_mm_ss")

#Создаем (удаляя предыдущий) скрипт арихивации
Write-Host "=====================$DateStr======================"
$FileName = "BackUpScript.ps1"
if (Test-Path $FileName) 
{
  Remove-Item $FileName
}

#Формируем имя временного каталога RedMine
$BackUpPath="/var//www//"+$DateStr
Write-Host "Create: $FileName"

#Создать временный каталог для архива
"ssh root@192.168.1.155 'mkdir "+$BackUpPath+"'">>$FileName

#Архив файлов
"ssh root@192.168.1.155 'tar -cvf "+$BackUpPath+"/files.tar.gz /var/www/redmine/files'">>$FileName

#Архив Git
"ssh root@192.168.1.155 'tar -cvf "+$BackUpPath+"/git.tar.gz /srv/repos/git'">>$FileName

#Архив базы RedMine
"ssh root@192.168.1.155 '/usr/bin/mysqldump -u redmine -p9323XXXXXXX13ad redmine_production | gzip > "+$BackUpPath+"/redmineDB.gz'">>$FileName

#Запуск скрипта архивации
Write-Host "Run: $FileName"
.\BackUpScript.ps1

#Копировние временного каталога RedMine в текущий рабочий каталог Windows
Write-Host "Copy dir from $BackUpPath to "(Get-Location)
scp -r root@192.168.1.155:$BackUpPath (Get-Location)

#Создаем (удаляя предыдущий) скрипт удаления временного каталога RedMine
$FileName = "DelBackUpScript.ps1"
if (Test-Path $FileName) 
{
  Remove-Item $FileName
}
#Запуск скрипта удаления
"ssh root@192.168.1.155 'rm -r "+ $BackUpPath+"'">>$FileName
Write-Host "Run: $FileName"
.\DelBackUpScript.ps1

Данные для строки архива базы RedMine брать из /var/www/redmine/config/database.yml

6. Windows. Запускаем PowerShell, переходим в каталог с StartBackUp.ps1 и запускаем его на исполнение.

Комментарии (4)


  1. mniAlex
    15.12.2021 09:24

    Что-то все как-то сложно. Не понял зачем писать скрипт который при запуске создает ещё пару скриптов... Сделайте все в одном. И зачем для каждой отдельной команды вызывать SSH соединение? Объедините все команды через оператор && и вызывайте одно соединение.

    А почему вы не захотели реализовать создание архивов в bash скрипте, а потом от туда же, из вашей вм, отправлять все в хранилище бэкапов? Кстати, вы ведь не храните бэкапы вм, на гипервизоре?


    1. MasyGreen Автор
      15.12.2021 09:42

      1) Работающих образов с RedMine больше одного и набор скриптов тоже генерируется в некотором, возможно, упрощенном виде, для удобства восприятия (не все умеют с листа читать сложные конструкции).

      2) Бакапы сливаются в папку, а папка синхронизируется с облаком. Тут еще кусочек в конце удаляет лишние архивы старше 7 дней с локали (в облаке они остаются и чистятся отдельно)

      #Delete old folder (-7 days)
      $DateComp=(Get-date).AddDays(-7)
      
      $loc = (Get-Location)
      $dir = Get-ChildItem $loc | ? {$_.PSIsContainer}
      
      foreach ($d in $dir){
      try
      {
      #Get folder name
      $ds = [string[]][System.IO.DirectoryInfo]$d.Name
      #Get data from folder name
      $df = $ds.Substring(0,10)
      #Convert folder name to data
      $dt = [datetime]::parseexact($df, 'yyyy_MM_dd', $null)
      #Delete old folder
      if ($dt -le $DateComp){
      Write-Host "DELETE "$d": "$dt" < "$DateComp
      Remove-Item $d -Recurse -Force -Confirm:$false
      }
      }
      catch
      {
      Write-Host "SKIP "$d
      }
      }


  1. Turkin
    15.12.2021 09:42

    Зачем в контексте данной задачи писать про Hyper-V?


    1. MasyGreen Автор
      15.12.2021 09:46

      Хотел изначально писать цикл про работу с RedMine, начиная с установки Hyper-V, работе с почтой, GIT и т.п. заканчивая бакапом-восстановлением.

      Но подобных статей достаточно и там не очень сложно. А вот подходов по простому бакапу с ходу не нашел, решил поделиться.