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发布配置:
- 在VS中右键项目 → 「发布」,选择「Azure Virtual Machine」作为目标。
- 输入VM的公IP、管理员账号、IIS站点名称,完成配置。
- 点击「编辑」发布配置,在「设置」选项卡中,可以勾选「在发布前备份应用」(VS会自动备份到VM的指定目录),但如果需要更灵活的备份规则(比如自定义文件夹、上传到存储),建议把前面的备份脚本整合到发布流程中。
- 整合备份脚本:在VS的发布配置中,添加「预发布脚本」,指向你写的备份PowerShell脚本,确保部署前先执行备份。
2. 团队协作:Azure DevOps Pipeline(最佳实践)
如果是团队多人协作、每日多次交付,Azure DevOps Pipeline是最专业的选择,实现从代码提交到自动部署的全流程:
- Pipeline步骤示例:
- 构建应用:用
DotNetCoreCLI任务(针对.NET Core/.NET 5+)或MSBuild任务(针对.NET Framework)编译并生成发布包。 - 执行远程备份:用
Azure PowerShell任务,运行前面的备份脚本,确保部署前完成备份。 - 部署到IIS:用
Web Deploy任务(或直接调用msdeploy.exe命令),将发布包同步到Azure VM的IIS站点。 - 触发器配置:设置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
相关产品推荐
相关产品推荐

