Files
Thinh Lam 688fac73e9
CI/CD / backend (push) Failing after 2m8s
CI/CD / frontend (push) Failing after 1m40s
CI/CD / deploy (push) Has been skipped
sciagent code + Gitea Actions CI/CD
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:38:30 +07:00

160 lines
6.1 KiB
PowerShell

# ============================================================================
# 03 — Setup 3 IIS sites: DYD.Api / DYD.User / DYD.Admin
# Run as Administrator on VPS after 01-install-prerequisites.ps1
# ============================================================================
#Requires -RunAsAdministrator
$ErrorActionPreference = 'Stop'
Import-Module WebAdministration -ErrorAction Stop
# --- CONFIG ------------------------------------------------------------------
$BaseDir = 'C:\inetpub'
$Sites = @(
@{
Name = 'DYD.Api'
AppPool = 'DYD.ApiPool'
Path = "$BaseDir\DYD.Api"
HttpPort = 5443
HttpsPort = 443
Host = 'api.ski-ump.com.vn'
LogsPath = "$BaseDir\DYD.Api\logs"
Managed = $true # .NET Core → No Managed Code
},
@{
Name = 'DYD.User'
AppPool = '' # static site, no app pool
Path = "$BaseDir\DYD.User"
HttpPort = 8080
HttpsPort = 443
Host = 'ski-ump.com.vn'
Managed = $false
},
@{
Name = 'DYD.Admin'
AppPool = ''
Path = "$BaseDir\DYD.Admin"
HttpPort = 8082
HttpsPort = 443
Host = 'admin.ski-ump.com.vn'
Managed = $false
}
)
# --- HELPER ------------------------------------------------------------------
function New-Dir($p) {
if (-not (Test-Path $p)) {
New-Item -ItemType Directory -Path $p -Force | Out-Null
Write-Host " Created: $p" -ForegroundColor Green
}
}
function New-ApiAppPool($name) {
if (Test-Path "IIS:\AppPools\$name") {
Write-Host " [OK] AppPool $name exists" -ForegroundColor Green
return
}
New-WebAppPool -Name $name | Out-Null
Set-ItemProperty "IIS:\AppPools\$name" -name managedRuntimeVersion -value ''
Set-ItemProperty "IIS:\AppPools\$name" -name startMode -value 'AlwaysRunning'
Set-ItemProperty "IIS:\AppPools\$name" -name processModel.idleTimeout -value ([TimeSpan]::Zero)
Write-Host " Created AppPool: $name (No Managed Code, AlwaysRunning)" -ForegroundColor Green
}
# --- DIRECTORIES -------------------------------------------------------------
Write-Host ""
Write-Host "==========================================" -ForegroundColor Cyan
Write-Host " 1/4 — Create directories" -ForegroundColor Cyan
Write-Host "==========================================" -ForegroundColor Cyan
foreach ($s in $Sites) {
New-Dir $s.Path
if ($s.LogsPath) { New-Dir $s.LogsPath }
}
New-Dir "$BaseDir\backups"
# --- APP POOLS ---------------------------------------------------------------
Write-Host ""
Write-Host "==========================================" -ForegroundColor Cyan
Write-Host " 2/4 — Create App Pools" -ForegroundColor Cyan
Write-Host "==========================================" -ForegroundColor Cyan
foreach ($s in $Sites) {
if ($s.Managed -and $s.AppPool) {
New-ApiAppPool $s.AppPool
}
}
# --- SITES -------------------------------------------------------------------
Write-Host ""
Write-Host "==========================================" -ForegroundColor Cyan
Write-Host " 3/4 — Create Sites + Bindings" -ForegroundColor Cyan
Write-Host "==========================================" -ForegroundColor Cyan
foreach ($s in $Sites) {
# Remove existing site if port conflict
$existing = Get-Website -Name $s.Name -ErrorAction SilentlyContinue
if ($existing) {
Write-Host " Site $($s.Name) exists. Skipping creation." -ForegroundColor Yellow
continue
}
if ($s.Managed) {
New-Website -Name $s.Name `
-PhysicalPath $s.Path `
-ApplicationPool $s.AppPool `
-Port $s.HttpPort `
-HostHeader $s.Host `
-Force | Out-Null
}
else {
New-Website -Name $s.Name `
-PhysicalPath $s.Path `
-Port $s.HttpPort `
-HostHeader $s.Host `
-Force | Out-Null
}
Write-Host " Created site: $($s.Name) on :$($s.HttpPort) — host: $($s.Host)" -ForegroundColor Green
}
# --- PLACEHOLDER INDEX -------------------------------------------------------
Write-Host ""
Write-Host "==========================================" -ForegroundColor Cyan
Write-Host " 4/4 — Placeholder index.html" -ForegroundColor Cyan
Write-Host "==========================================" -ForegroundColor Cyan
foreach ($s in $Sites) {
$indexPath = Join-Path $s.Path 'index.html'
if (-not (Test-Path $indexPath)) {
@"
<!DOCTYPE html>
<html><head><title>$($s.Name)</title></head>
<body><h1>$($s.Name) — placeholder</h1>
<p>Site chưa được deploy. Chạy pipeline hoặc deploy thủ công.</p></body></html>
"@ | Set-Content $indexPath -Encoding UTF8
}
}
# --- FIREWALL ----------------------------------------------------------------
Write-Host ""
Write-Host "Firewall rules (HTTP 80, HTTPS 443, custom ports):" -ForegroundColor Cyan
$ports = @(80, 443, 5443, 8080, 8082, 3000) # 3000 cho Gitea sau
foreach ($p in $ports) {
$rule = "DYD-TCP-$p"
if (-not (Get-NetFirewallRule -DisplayName $rule -ErrorAction SilentlyContinue)) {
New-NetFirewallRule -DisplayName $rule -Direction Inbound -Protocol TCP -LocalPort $p -Action Allow | Out-Null
Write-Host " [+] TCP $p allowed" -ForegroundColor Green
}
}
# --- SUMMARY -----------------------------------------------------------------
Write-Host ""
Write-Host "=========================================================" -ForegroundColor Green
Write-Host " DONE — 3 IIS sites ready" -ForegroundColor Green
Write-Host "=========================================================" -ForegroundColor Green
Write-Host ""
Get-Website | Where-Object { $_.Name -like 'DYD.*' } | Format-Table -AutoSize Name, State, PhysicalPath, @{L='Bindings';E={($_.Bindings.Collection.bindingInformation) -join ', '}}
Write-Host "HTTP URLs (cần bind host file hoặc DNS):"
foreach ($s in $Sites) {
Write-Host " http://$($s.Host):$($s.HttpPort)" -ForegroundColor Yellow
}
Write-Host ""
Write-Host "Next: 04-install-gitea.ps1 + 05-setup-ssl.ps1 (sau khi DNS trỏ IP)"