You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure虚拟机IIS上.NET应用自动化部署前远程备份方案及最佳实践咨询

自动化部署到Azure VM IIS的解决方案(含前置远程备份)

针对你提到的「每日多次交付、本地/VS自动化部署、部署前远程备份指定文件夹」的需求,我整理了一套实用的方案和最佳实践,分两部分来说:


一、远程备份Azure VM上的指定文件夹

核心思路是通过PowerShell远程会话连接到Azure VM,执行文件夹压缩备份,还可以把备份同步到Azure存储做异地留存。

1. 前置准备

  • 确保Azure VM的NSG规则允许WinRM访问:开放5985(HTTP)或5986(HTTPS)端口,并且只允许你的本地IP或构建服务器IP访问(安全起见)。
  • 本地机器安装Azure PowerShell模块(Install-Module -Name Az -AllowClobber -Scope CurrentUser)。
  • VM上的管理员账号有足够权限访问目标文件夹和执行压缩命令。

2. 备份脚本示例

下面是一个完整的PowerShell脚本,实现远程备份+自动清理旧备份的功能:

# 配置参数
$vmName = "Your-VM-Name"
$resourceGroupName = "Your-Resource-Group"
$sourceFolder = "C:\inetpub\wwwroot\Your-App-Folder" # 要备份的目标文件夹
$backupDir = "C:\VM-Backups\Your-App" # VM上的备份存储目录
$keepBackupCount = 7 # 保留最近7个备份
$storageAccountName = "Your-Storage-Account" # 可选:上传到Azure存储
$containerName = "app-backups" # 可选:存储容器名
$sasToken = "Your-SAS-Token" # 可选:容器的SAS令牌

# 获取VM公IP
$publicIp = (Get-AzPublicIpAddress -ResourceGroupName $resourceGroupName -Name "$vmName-ip").IpAddress

# 获取VM管理员凭据(避免硬编码,建议用Azure Key Vault读取)
$cred = Get-Credential -Message "输入Azure VM管理员账号密码"

try {
    # 建立远程PowerShell会话
    Write-Host "正在连接到Azure VM..."
    $session = New-PSSession -ComputerName $publicIp -Credential $cred -Port 5985

    # 创建备份目录(如果不存在)
    Invoke-Command -Session $session -ScriptBlock {
        param($dir)
        if (-not (Test-Path $dir)) {
            New-Item -ItemType Directory -Path $dir | Out-Null
            Write-Host "备份目录已创建: $dir"
        }
    } -ArgumentList $backupDir

    # 生成带时间戳的备份文件名
    $backupFileName = "App-Backup_$(Get-Date -Format 'yyyyMMddHHmmss').zip"

    # 压缩目标文件夹到备份文件
    Write-Host "开始备份文件夹: $sourceFolder"
    Invoke-Command -Session $session -ScriptBlock {
        param($source, $destDir, $destFile)
        Compress-Archive -Path $source -DestinationPath "$destDir\$destFile" -Force
        Write-Host "备份完成: $destDir\$destFile"
    } -ArgumentList $sourceFolder, $backupDir, $backupFileName

    # 可选:上传备份到Azure Blob存储
    if ($storageAccountName -and $containerName -and $sasToken) {
        Write-Host "正在上传备份到Azure存储..."
        Invoke-Command -Session $session -ScriptBlock {
            param($backupFile, $account, $container, $sas)
            az storage blob upload `
                --account-name $account `
                --container-name $container `
                --file $backupFile `
                --name (Split-Path $backupFile -Leaf) `
                --sas-token $sas
            Write-Host "备份已上传到存储容器: $container"
        } -ArgumentList "$backupDir\$backupFileName", $storageAccountName, $containerName, $sasToken
    }

    # 清理旧备份(保留指定数量)
    Write-Host "清理旧备份..."
    Invoke-Command -Session $session -ScriptBlock {
        param($dir, $keepCount)
        $oldBackups = Get-ChildItem $dir -Filter "App-Backup_*.zip" `
            | Sort-Object CreationTime -Descending `
            | Select-Object -Skip $keepCount
        if ($oldBackups) {
            $oldBackups | Remove-Item -Force
            Write-Host "已删除 $($oldBackups.Count) 个旧备份"
        } else {
            Write-Host "没有需要清理的旧备份"
        }
    } -ArgumentList $backupDir, $keepBackupCount

} catch {
    Write-Error "备份过程出错: $_"
    exit 1
} finally {
    # 关闭远程会话
    if ($session) {
        Remove-PSSession $session
        Write-Host "已断开与VM的连接"
    }
}

二、Visual Studio到Azure VM的自动化交付最佳实践

根据场景不同,推荐两种主流方案:

1. 个人开发:Visual Studio + Web Deploy + 自定义备份脚本

这是最适合个人开发者的快速方案:

  • 前置配置:在Azure VM上安装Web Deploy 3.6,并确保NSG开放8172端口(Web Deploy默认端口)。
  • VS发布配置:
    1. 在VS中右键项目 → 「发布」,选择「Azure Virtual Machine」作为目标。
    2. 输入VM的公IP、管理员账号、IIS站点名称,完成配置。
    3. 点击「编辑」发布配置,在「设置」选项卡中,可以勾选「在发布前备份应用」(VS会自动备份到VM的指定目录),但如果需要更灵活的备份规则(比如自定义文件夹、上传到存储),建议把前面的备份脚本整合到发布流程中。
  • 整合备份脚本:在VS的发布配置中,添加「预发布脚本」,指向你写的备份PowerShell脚本,确保部署前先执行备份。

2. 团队协作:Azure DevOps Pipeline(最佳实践)

如果是团队多人协作、每日多次交付,Azure DevOps Pipeline是最专业的选择,实现从代码提交到自动部署的全流程:

  • Pipeline步骤示例:
    1. 构建应用:用DotNetCoreCLI任务(针对.NET Core/.NET 5+)或MSBuild任务(针对.NET Framework)编译并生成发布包。
    2. 执行远程备份:用Azure PowerShell任务,运行前面的备份脚本,确保部署前完成备份。
    3. 部署到IIS:用Web Deploy任务(或直接调用msdeploy.exe命令),将发布包同步到Azure VM的IIS站点。
    4. 触发器配置:设置CI触发器,当代码推送到指定分支时自动触发部署;或者设置定时触发器,按需求执行部署。

3. 本地自动化脚本:PowerShell + MSDeploy

如果不想依赖VS或Azure DevOps,也可以写一个本地脚本,一键完成备份+部署:

# 先执行前面的备份脚本...

# 部署应用到IIS
$msdeployPath = "C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy.exe"
$sourcePackage = "C:\Path\To\Your\App\Publish\YourApp.zip"
$destUrl = "https://$publicIp:8172/msdeploy.axd?site=Your-IIS-Site-Name"
$destCred = "$($cred.UserName):$($cred.GetNetworkCredential().Password)"

try {
    Write-Host "开始部署应用..."
    & $msdeployPath `
        -verb:sync `
        -source:package="$sourcePackage" `
        -dest:auto,computerName="$destUrl",userName="$destCred",authType="Basic" `
        -allowUntrusted
    Write-Host "应用部署成功"
} catch {
    Write-Error "部署过程出错: $_"
    exit 1
}

关键注意事项

  • 安全优先:不要硬编码密码或SAS令牌,建议用Azure Key Vault存储敏感信息,在脚本或Pipeline中通过Azure PowerShell模块读取。
  • 端口限制:NSG规则中严格限制WinRM(5985/5986)和Web Deploy(8172)的访问IP,避免暴露公网风险。
  • 错误处理:在脚本中添加try-catch块,确保备份失败时终止部署,防止覆盖正常运行的应用。

内容的提问来源于stack exchange,提问作者Roman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:40:47