Powershell脚本

start.ps1:

$script = "backup_script.ps1"
[string]$dir = Get-Location
$logfolder = $dir + '\logs\'
$logtime = Get-Date -Format yyyyMMdd-HHmmss
$logfile = $logfolder + $logtime + ".log"

if (!(Test-Path $logfolder)) {
    New-Item -ItemType Directory -Path $logfolder
}
powershell -f $script $logtime | Out-File $logfile

backup_script.ps1:

$logtime = $args
[string]$dir = Get-Location
$logfolder = $dir + '\logs\'
$logfile = $logfolder + $logtime + '-git' + '.log'
Write-output $logfile
Write-Output "### Backup Start Up ####"
Write-Output "### Init Parameters ####"
Write-Output "### Excute time: $(Get-Date) ####"
Write-Output ""

$app_location = 'C:\Program Files\Atlassian\Confluence\'
$data_location = 'D:\CONFLUENCE_DATA\'
$dbdump_location = 'D:\postgresql_dump\'

Write-Output "Confluence app localtion: $app_location"
Write-Output "Confluence data location: $data_location"
Write-Output "Confluence dbdump location: $dbdump_location"
Write-Output ""

$app_repos = @{
    local     = 'D:\GitRepo\Confluence\application\';
    bitbucket = '[email protected]:bjebc/confluence-app.git'
}
$data_repos = @{
    local     = 'D:\GitRepo\Confluence\data\';
    bitbucket = '[email protected]:bjebc/confluence-data.git'
}
$dbdump_repos = @{
    local     = 'D:\GitRepo\Confluence\database\';
    bitbucket = '[email protected]:bjebc/confluence-database.git'
}
Write-Output "Conflunece app repos:"
Write-Output $app_repos
Write-Output "Confluence data repo:"
Write-Output $data_repos
Write-Output "Confluence dbdump repo:"
Write-Output $dbdump_repos
Write-Output ""

# check if confluence app folder has got a .git folder, init git if not
if (!(Test-Path -PATH ($app_location + '.git'))) {
    Write-Output "### Init Git Forlders $app_location ####"
    Set-Location $app_location
    git init >> $logfile
    foreach ($remote in $app_repos.Keys) {
        if ($remote -eq "local") {
            if (!(Test-Path ($app_repos["local"] + 'HEAD'))) {
                if (!(Test-Path $app_repos["local"])) {
                    New-Item -Type Directory -Path $app_repos["local"]
                }
                git init --bare $app_repos["local"] >> $logfile
            }
        }
        git remote add $remote $app_repos[$remote] >> $logfile
    }
}

# check if confluence data folder has got a .git folder, init git if not
if (!(Test-Path -Path ($data_location + '.git'))) {
    Write-Output "### Init Git Forlders $data_location ####"
    Set-Location $data_location
    git init >> $logfile
    foreach ($remote in $data_repos.Keys) {
        if ($remote -eq "local") {
            if (!(Test-Path ($data_repos["local"] + 'HEAD'))) {
                if (!(Test-Path $data_repos["local"])) {
                    New-Item -Type Directory -Path $data_repos["local"]
                }
                git init --bare $data_repos["local"] >> $logfile
            }
        }
        git remote add $remote $data_repos[$remote] >> $logfile
    }
}

# check if confluence dbdump folder has got a .git folder, init git if not
if (!(Test-Path -Path ($dbdump_location + '.git'))) {
    if (!(Test-Path -Path $dbdump_location)) {
        New-Item -Type Directory -Path $dbdump_location
    }
    Write-Output "### Init Git Forlders $dbdump_location ####"
    Set-Location $dbdump_location
    git init $dbdump_location >> $logfile
    foreach ($remote in $dbdump_repos.Keys) {
        if ($remote -eq "local") {
            if (!(Test-Path ($dbdump_repos["local"] + 'HEAD'))) {
                if (!(Test-Path $dbdump_repos["local"])) {
                    New-Item -Type Directory -Path $dbdump_repos["local"]
                }
                git init --bare $dbdump_repos["local"] >> $logfile
            }
        }
        git remote add $remote $dbdump_repos[$remote] >> $logfile
    }
}
Write-Output "### Stop Confluence Service ####"
Stop-Service Confluence121217132300
Write-Output ""

# dump database
$time = Get-Date -Format yyyyMMdd-HHmmss
pg_dump -d CONFLUENCE -U postgres -F t -f "d:\postgresql_dump\$time.tar"

# commit and push conflunece app changes
Set-Location $app_location
git add . >> $logfile
git commit -m 'Timed script commit.' >> $logfile
foreach ($remote in $app_repos.Keys) {
    git push $remote master >> $logfile
}

# commit and push confluence data changes
Set-Location $data_location
git add . >> $logfile
git commit  -m 'Timed script commit.' >> $logfile
foreach ($remote in $data_repos.Keys) {
    git push $remote master >> $logfile
}

# commit and push dbdump changes
Set-Location $dbdump_location
git add . >> $logfile
git commit -a -m 'Timed script commit.' >> $logfile
foreach ($remote in $dbdump_repos.Keys) {
    git push $remote master >> $logfile
}

# start confluence service
Start-service Confluence121217132300

Write-Output '### Backup Complete ####'

.gitignore

Confluence应用目录

*temp/
*logs/

Confluence_Data目录

*temp/
*logs/
*cache/
*.logs

Postgresql数据库导出与导入

plain text

pg_dump -U CONFLUENCE -f /$time.sql -d CONFLUENCE
psql -U CONFLUENCE -f /20171225-120003.sql CONFLUENCE

*.tar

pg_dump -U postgres -F t -f /$time.tar -d CONFLUENCE
pg_restore -U postgres -d CONFLUENCE /20171225-120003.tar

Windows计划任务配置

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2017-12-24T15:38:54.5916575</Date>
    <Author>HF-DEV01\Administrator</Author>
    <URI>\Backup\Conflunece Backup</URI>
  </RegistrationInfo>
  <Triggers>
    <CalendarTrigger>
      <StartBoundary>2017-12-24T12:00:00+08:00</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>S-1-5-21-938857123-2463988143-3464861971-500</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>powershell</Command>
      <Arguments>-f start.ps1</Arguments>
      <WorkingDirectory>D:\CONFLUENCE_DATA\confluence_backup_script</WorkingDirectory>
    </Exec>
  </Actions>
</Task>