Files
SkyArtShop/deploy.ps1

215 lines
8.2 KiB
PowerShell
Raw Normal View History

# Sky Art Shop - Deployment Script
# Run this script as Administrator
param(
[string]$DeployPath = "C:\inetpub\wwwroot\skyartshop",
[string]$SiteName = "SkyArtShop",
[switch]$InstallIIS,
[switch]$CreateSite,
[switch]$UpdateOnly
)
Write-Host "==================================" -ForegroundColor Cyan
Write-Host "Sky Art Shop Deployment Script" -ForegroundColor Cyan
Write-Host "==================================" -ForegroundColor Cyan
Write-Host ""
# Check if running as Administrator
$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if (-not $isAdmin) {
Write-Host "ERROR: This script must be run as Administrator!" -ForegroundColor Red
Write-Host "Right-click PowerShell and select 'Run as Administrator'" -ForegroundColor Yellow
exit 1
}
# Function to install IIS
function Install-IIS {
Write-Host "Installing IIS features..." -ForegroundColor Yellow
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServerRole -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServer -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-CommonHttpFeatures -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpErrors -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ApplicationDevelopment -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-NetFxExtensibility45 -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HealthAndDiagnostics -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpLogging -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-Security -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-RequestFiltering -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-Performance -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServerManagementTools -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ManagementConsole -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-StaticContent -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-DefaultDocument -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-DirectoryBrowsing -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpCompressionStatic -NoRestart
Write-Host "IIS features installed successfully!" -ForegroundColor Green
Write-Host "NOTE: You may need to restart your computer." -ForegroundColor Yellow
Write-Host "After restart, install .NET 8.0 Hosting Bundle from:" -ForegroundColor Yellow
Write-Host "https://dotnet.microsoft.com/download/dotnet/8.0" -ForegroundColor Cyan
}
# Function to publish application
function Publish-Application {
Write-Host "Publishing application..." -ForegroundColor Yellow
$projectPath = $PSScriptRoot
# Build and publish
Set-Location $projectPath
dotnet publish SkyArtShop.csproj -c Release -o $DeployPath
if ($LASTEXITCODE -eq 0) {
Write-Host "Application published successfully to: $DeployPath" -ForegroundColor Green
}
else {
Write-Host "ERROR: Publishing failed!" -ForegroundColor Red
exit 1
}
}
# Function to set permissions
function Set-Permissions {
Write-Host "Setting folder permissions..." -ForegroundColor Yellow
# Grant IIS permissions
icacls $DeployPath /grant "IIS_IUSRS:(OI)(CI)F" /T
icacls $DeployPath /grant "IUSR:(OI)(CI)F" /T
# Ensure uploads folder exists and has permissions
$uploadsPath = Join-Path $DeployPath "wwwroot\uploads\images"
if (-not (Test-Path $uploadsPath)) {
New-Item -Path $uploadsPath -ItemType Directory -Force
}
icacls $uploadsPath /grant "IIS_IUSRS:(OI)(CI)F" /T
Write-Host "Permissions set successfully!" -ForegroundColor Green
}
# Function to create IIS site
function Create-IISSite {
Write-Host "Creating IIS site..." -ForegroundColor Yellow
Import-Module WebAdministration
# Check if site exists
$existingSite = Get-Website -Name $SiteName -ErrorAction SilentlyContinue
if ($existingSite) {
Write-Host "Site '$SiteName' already exists. Updating..." -ForegroundColor Yellow
Stop-Website -Name $SiteName -ErrorAction SilentlyContinue
Start-Sleep -Seconds 2
Remove-Website -Name $SiteName -ErrorAction SilentlyContinue
Start-Sleep -Seconds 2
}
# Check if default site is running on port 80
$defaultSite = Get-Website | Where-Object { $_.Bindings.Collection.bindingInformation -like "*:80:*" -and $_.State -eq "Started" }
if ($defaultSite -and $defaultSite.Name -ne $SiteName) {
Write-Host "Stopping '$($defaultSite.Name)' which is using port 80..." -ForegroundColor Yellow
Stop-Website -Name $defaultSite.Name -ErrorAction SilentlyContinue
}
# Create new site
New-Website -Name $SiteName -PhysicalPath $DeployPath -Port 80 -Force
# Configure application pool
$appPool = Get-Item "IIS:\AppPools\$SiteName" -ErrorAction SilentlyContinue
if ($appPool) {
$appPool.managedRuntimeVersion = ""
$appPool.startMode = "AlwaysRunning"
$appPool | Set-Item
}
# Wait a moment before starting
Start-Sleep -Seconds 2
# Start site
Start-Website -Name $SiteName -ErrorAction SilentlyContinue
Write-Host "IIS site '$SiteName' created and started!" -ForegroundColor Green
}
# Function to configure firewall
function Configure-Firewall {
Write-Host "Configuring Windows Firewall..." -ForegroundColor Yellow
# Remove existing rules if they exist
Remove-NetFirewallRule -DisplayName "SkyArtShop-HTTP" -ErrorAction SilentlyContinue
# Add HTTP rule
New-NetFirewallRule -DisplayName "SkyArtShop-HTTP" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
Write-Host "Firewall rules configured!" -ForegroundColor Green
}
# Main deployment flow
try {
if ($InstallIIS) {
Install-IIS
exit 0
}
if ($UpdateOnly) {
Write-Host "Performing update only..." -ForegroundColor Cyan
# Stop site
Import-Module WebAdministration
Stop-Website -Name $SiteName -ErrorAction SilentlyContinue
Start-Sleep -Seconds 2
# Publish
Publish-Application
# Start site
Start-Website -Name $SiteName
Write-Host ""
Write-Host "Update completed successfully!" -ForegroundColor Green
exit 0
}
# Full deployment
Write-Host "Starting full deployment..." -ForegroundColor Cyan
Write-Host ""
# Step 1: Publish
Publish-Application
# Step 2: Set permissions
Set-Permissions
# Step 3: Create IIS site (if requested)
if ($CreateSite) {
Create-IISSite
}
# Step 4: Configure firewall
Configure-Firewall
Write-Host ""
Write-Host "==================================" -ForegroundColor Green
Write-Host "Deployment completed successfully!" -ForegroundColor Green
Write-Host "==================================" -ForegroundColor Green
Write-Host ""
Write-Host "Next steps:" -ForegroundColor Yellow
Write-Host "1. Ensure MongoDB is running: net start MongoDB" -ForegroundColor White
Write-Host "2. Test locally: http://localhost" -ForegroundColor White
Write-Host "3. Configure your router port forwarding (port 80)" -ForegroundColor White
Write-Host "4. Update No-IP DUC client" -ForegroundColor White
Write-Host "5. Test from internet: http://your-noip-hostname.ddns.net" -ForegroundColor White
Write-Host ""
Write-Host "Site location: $DeployPath" -ForegroundColor Cyan
if ($CreateSite) {
Write-Host "IIS Site name: $SiteName" -ForegroundColor Cyan
}
}
catch {
Write-Host ""
Write-Host "ERROR: Deployment failed!" -ForegroundColor Red
Write-Host $_.Exception.Message -ForegroundColor Red
exit 1
}