Files
acme-auto/backend/templates_cert/deploy-cert.ps1.j2
T

83 lines
3.5 KiB
Django/Jinja
Raw Normal View History

2026-07-18 20:09:26 +08:00
$ErrorActionPreference = "Stop"
2026-07-20 11:43:46 +08:00
function Log($msg) { Write-Host "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] $msg" }
2026-07-18 20:09:26 +08:00
# === 由 CertCenter 生成 ===
$Domain = "{{ domain }}"
$BaseUrl = "{{ base_url }}"
$Token = "{{ token }}"
$CertDir = "{{ cert_dir }}"
$CheckCmd = "{{ check_cmd }}"
$ReloadCmd = "{{ reload_cmd }}"
2026-07-20 11:29:46 +08:00
$ConfigId = "{{ acme_config_id }}"
2026-07-18 20:09:26 +08:00
# ===========================
2026-07-18 20:54:48 +08:00
$EncodedDomain = [System.Uri]::EscapeDataString($Domain)
2026-07-20 11:29:46 +08:00
$ConfigParam = if ($ConfigId) { "&acme_config_id=$ConfigId" } else { "" }
2026-07-18 20:54:48 +08:00
$TmpDir = "$env:TEMP\cert-sync-$($Domain -replace '[*\.]','_')"
2026-07-18 20:09:26 +08:00
$VersionFile = "$CertDir\.version"
New-Item -ItemType Directory -Force -Path $CertDir, $TmpDir | Out-Null
$headers = @{ Authorization = "Bearer $Token" }
# 跳过 TLS 证书验证(CertCenter 初期可能使用自签证书)
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
2026-07-20 11:43:46 +08:00
Log "开始同步证书: $Domain"
Log "配置目录: $CertDir, 配置ID: $(if ($ConfigId) { $ConfigId } else { '无' })"
2026-07-18 20:09:26 +08:00
# 1. 检查版本
2026-07-20 11:43:46 +08:00
Log "检查远程版本..."
try {
$remote = (Invoke-WebRequest -Uri "$BaseUrl/api/version?domain=$EncodedDomain$ConfigParam" -Headers $headers -UseBasicParsing -SkipCertificateCheck).Content.Trim()
} catch {
Log "错误: 无法获取远程版本 - $_"
exit 1
}
$local = if (Test-Path $VersionFile) { (Get-Content $VersionFile).Trim() } else { "0" }
Log "远程版本: $remote, 本地版本: $local"
if ($remote -eq $local) {
Log "版本一致,跳过更新"
exit 0
}
2026-07-18 20:09:26 +08:00
# 2. 下载证书
2026-07-20 11:43:46 +08:00
Log "版本不一致,开始下载证书..."
try {
Invoke-WebRequest -Uri "$BaseUrl/api/cert/fullchain?domain=$EncodedDomain$ConfigParam" -Headers $headers -OutFile "$TmpDir\fullchain.pem" -UseBasicParsing -SkipCertificateCheck
Invoke-WebRequest -Uri "$BaseUrl/api/cert/private?domain=$EncodedDomain$ConfigParam" -Headers $headers -OutFile "$TmpDir\private.key" -UseBasicParsing -SkipCertificateCheck
} catch {
Log "错误: 下载证书失败 - $_"
exit 1
}
Log "证书下载完成"
2026-07-18 20:09:26 +08:00
# 3. 备份旧证书
Copy-Item "$CertDir\fullchain.pem" "$CertDir\fullchain.pem.bak" -ErrorAction SilentlyContinue
Copy-Item "$CertDir\private.key" "$CertDir\private.key.bak" -ErrorAction SilentlyContinue
2026-07-20 11:43:46 +08:00
Log "旧证书已备份"
2026-07-18 20:09:26 +08:00
# 4. 原子替换
Move-Item "$TmpDir\fullchain.pem" "$CertDir\fullchain.pem" -Force
Move-Item "$TmpDir\private.key" "$CertDir\private.key" -Force
2026-07-20 11:43:46 +08:00
Log "证书文件已替换"
2026-07-18 20:09:26 +08:00
# 5. 校验 & 重载 & 上报
2026-07-20 10:26:58 +08:00
$HostName = $env:COMPUTERNAME
2026-07-18 20:09:26 +08:00
try {
2026-07-20 11:43:46 +08:00
Log "执行校验命令: $CheckCmd"
2026-07-18 20:09:26 +08:00
Invoke-Expression $CheckCmd
2026-07-20 11:43:46 +08:00
Log "校验通过,执行重载: $ReloadCmd"
2026-07-18 20:09:26 +08:00
$remote | Out-File -NoNewline -Encoding ascii $VersionFile
Invoke-Expression $ReloadCmd
2026-07-20 11:43:46 +08:00
Log "更新成功: $Domain -> v$remote"
2026-07-20 11:29:46 +08:00
try { Invoke-WebRequest -Uri "$BaseUrl/api/report?domain=$EncodedDomain&status=success&hostname=$HostName&message=deployed+v$remote$ConfigParam" -Headers $headers -Method POST -UseBasicParsing -SkipCertificateCheck | Out-Null } catch {}
2026-07-18 20:09:26 +08:00
} catch {
2026-07-20 11:43:46 +08:00
Log "错误: 校验失败,回滚证书 - $_"
2026-07-18 20:09:26 +08:00
Move-Item "$CertDir\fullchain.pem.bak" "$CertDir\fullchain.pem" -Force -ErrorAction SilentlyContinue
Move-Item "$CertDir\private.key.bak" "$CertDir\private.key" -Force -ErrorAction SilentlyContinue
2026-07-20 11:43:46 +08:00
Log "已回滚到旧证书"
2026-07-20 11:29:46 +08:00
try { Invoke-WebRequest -Uri "$BaseUrl/api/report?domain=$EncodedDomain&status=failed&hostname=$HostName&message=check+failed+rolled+back$ConfigParam" -Headers $headers -Method POST -UseBasicParsing -SkipCertificateCheck | Out-Null } catch {}
2026-07-18 20:09:26 +08:00
exit 1
}