215 lines
8.2 KiB
PowerShell
215 lines
8.2 KiB
PowerShell
|
|
# 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
|
||
|
|
}
|