312 lines
12 KiB
PowerShell
312 lines
12 KiB
PowerShell
# 由壹点3D素材 - 生产服务器配置脚本
|
||
# 功能:配置 insecure-registry,允许从构建机拉取镜像
|
||
# 目标:192.168.58.20(生产服务器)
|
||
# 注意:只修改配置,不安装任何东西,不影响现有服务
|
||
|
||
param(
|
||
[string]$ProdServerIP = '192.168.58.20',
|
||
[string]$ProdServerUser = 'root',
|
||
[string]$ProdServerPassword = 'jsjj8888',
|
||
[string]$BuildServerIP = '192.168.42.134',
|
||
[switch]$DryRun, # 只检查,不修改
|
||
[switch]$Help
|
||
)
|
||
|
||
# 设置编码
|
||
try {
|
||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||
$OutputEncoding = [System.Text.Encoding]::UTF8
|
||
chcp 65001 | Out-Null
|
||
} catch {}
|
||
|
||
# ==================== 辅助函数 ====================
|
||
|
||
function Write-Success {
|
||
param([string]$Message)
|
||
Write-Host "✅ $Message" -ForegroundColor Green
|
||
}
|
||
|
||
function Write-Error-Custom {
|
||
param([string]$Message)
|
||
Write-Host "❌ $Message" -ForegroundColor Red
|
||
}
|
||
|
||
function Write-Info {
|
||
param([string]$Message)
|
||
Write-Host "ℹ️ $Message" -ForegroundColor Cyan
|
||
}
|
||
|
||
function Write-Warning-Custom {
|
||
param([string]$Message)
|
||
Write-Host "⚠️ $Message" -ForegroundColor Yellow
|
||
}
|
||
|
||
function Write-Step {
|
||
param([int]$Step, [string]$Message)
|
||
Write-Host ""
|
||
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Cyan
|
||
Write-Host "📦 步骤 $Step`: $Message" -ForegroundColor Magenta
|
||
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Cyan
|
||
}
|
||
|
||
function Write-SubStep {
|
||
param([string]$Message)
|
||
Write-Host " ▶ $Message" -ForegroundColor Yellow
|
||
}
|
||
|
||
function Invoke-ProdServer {
|
||
param([string]$Command, [switch]$Silent)
|
||
|
||
$result = & "C:\Program Files\PuTTY\plink.exe" -batch -pw $ProdServerPassword "$ProdServerUser@$ProdServerIP" $Command 2>&1
|
||
|
||
if (-not $Silent) {
|
||
$result | ForEach-Object {
|
||
if ($_ -match "error|failed|fatal") {
|
||
Write-Host " $_" -ForegroundColor Red
|
||
} elseif ($_ -match "warning|warn") {
|
||
Write-Host " $_" -ForegroundColor Yellow
|
||
} elseif ($_ -match "success|complete|done|✓|Successfully") {
|
||
Write-Host " $_" -ForegroundColor Green
|
||
} else {
|
||
Write-Host " $_" -ForegroundColor Gray
|
||
}
|
||
}
|
||
}
|
||
|
||
return $result
|
||
}
|
||
|
||
function Show-Help {
|
||
Write-Host @"
|
||
由壹点3D素材 - 生产服务器配置脚本
|
||
|
||
用法:
|
||
.\setup-production-server.ps1 # 配置生产服务器
|
||
.\setup-production-server.ps1 -DryRun # 只检查,不修改
|
||
|
||
功能:
|
||
1. 备份现有 Docker 配置(如果存在)
|
||
2. 配置 insecure-registry(允许从构建机拉取镜像)
|
||
3. 重启 Docker 服务
|
||
4. 验证配置
|
||
|
||
目标服务器:
|
||
IP:$ProdServerIP(生产服务器)
|
||
用户:$ProdServerUser
|
||
|
||
构建机:
|
||
IP:$BuildServerIP
|
||
|
||
注意:
|
||
- 此脚本只修改 Docker 配置,不安装任何东西
|
||
- 会备份现有配置到 /etc/docker/daemon.json.backup
|
||
- 重启 Docker 时会短暂中断服务(约 5-10 秒)
|
||
- 所有容器会自动重启(restart: always)
|
||
"@
|
||
}
|
||
|
||
# ==================== 主逻辑 ====================
|
||
|
||
function Main {
|
||
Write-Host ""
|
||
Write-Host "╔════════════════════════════════════════════════════════════╗" -ForegroundColor Cyan
|
||
Write-Host "║ ║" -ForegroundColor Cyan
|
||
Write-Host "║ 由壹点3D素材 - 生产服务器配置 ║" -ForegroundColor Cyan
|
||
Write-Host "║ ║" -ForegroundColor Cyan
|
||
Write-Host "╚════════════════════════════════════════════════════════════╝" -ForegroundColor Cyan
|
||
Write-Host ""
|
||
|
||
if ($Help) { Show-Help; return }
|
||
|
||
Write-Host "📋 配置信息" -ForegroundColor Magenta
|
||
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Cyan
|
||
Write-Info "目标服务器:$ProdServerIP(生产服务器)"
|
||
Write-Info "构建机:$BuildServerIP"
|
||
Write-Info "操作:配置 insecure-registry"
|
||
if ($DryRun) {
|
||
Write-Warning-Custom "模式:只检查,不修改(DryRun)"
|
||
}
|
||
Write-Host ""
|
||
|
||
Write-Warning-Custom "⚠️ 重要提示:"
|
||
Write-Info " - 此脚本只修改 Docker 配置,不安装任何东西"
|
||
Write-Info " - 会备份现有配置"
|
||
Write-Info " - 重启 Docker 时会短暂中断服务(约 5-10 秒)"
|
||
Write-Info " - 所有容器会自动重启"
|
||
Write-Host ""
|
||
|
||
# ==================== 步骤 0:检查现有服务 ====================
|
||
Write-Step 0 "检查生产服务器状态"
|
||
|
||
Write-SubStep "测试 SSH 连接..."
|
||
$testResult = Invoke-ProdServer -Command "echo 'OK'" -Silent
|
||
if ($testResult -notmatch "OK") {
|
||
Write-Error-Custom "无法连接生产服务器"
|
||
return
|
||
}
|
||
Write-Success "SSH 连接正常"
|
||
|
||
Write-SubStep "检查运行中的服务..."
|
||
$containers = Invoke-ProdServer -Command "docker ps --format '{{.Names}}'" -Silent
|
||
$containerList = $containers -split "`n" | Where-Object { $_ -match '\S' }
|
||
|
||
Write-Info " 当前运行的容器:"
|
||
foreach ($container in $containerList) {
|
||
Write-Host " - $container" -ForegroundColor Gray
|
||
}
|
||
|
||
Write-SubStep "检查现有 Docker 配置..."
|
||
$existingConfig = Invoke-ProdServer -Command "cat /etc/docker/daemon.json 2>/dev/null || echo 'NOT_EXISTS'" -Silent
|
||
|
||
if ($existingConfig -match "NOT_EXISTS") {
|
||
Write-Info " /etc/docker/daemon.json 不存在(将创建新配置)"
|
||
$hasExistingConfig = $false
|
||
} else {
|
||
Write-Warning-Custom " /etc/docker/daemon.json 已存在"
|
||
Write-Host " 当前配置:" -ForegroundColor Gray
|
||
$existingConfig | ForEach-Object { Write-Host " $_" -ForegroundColor Gray }
|
||
$hasExistingConfig = $true
|
||
}
|
||
|
||
Write-SubStep "检查当前 insecure-registry 配置..."
|
||
$currentInsecure = Invoke-ProdServer -Command "docker info 2>&1 | grep -A 3 'Insecure Registries'" -Silent
|
||
Write-Host " 当前配置:" -ForegroundColor Gray
|
||
$currentInsecure | ForEach-Object { Write-Host " $_" -ForegroundColor Gray }
|
||
|
||
if ($DryRun) {
|
||
Write-Host ""
|
||
Write-Info "DryRun 模式:检查完成,未进行任何修改"
|
||
return
|
||
}
|
||
|
||
Write-Host ""
|
||
Write-Warning-Custom "⚠️ 即将修改 Docker 配置并重启 Docker 服务"
|
||
Write-Info " - 会短暂中断服务(约 5-10 秒)"
|
||
Write-Info " - 所有容器会自动重启"
|
||
Write-Host ""
|
||
$confirm = Read-Host "确认继续?(y/n)"
|
||
if ($confirm -ne 'y') {
|
||
Write-Info "已取消配置"
|
||
return
|
||
}
|
||
|
||
# ==================== 步骤 1:备份现有配置 ====================
|
||
Write-Step 1 "备份现有配置"
|
||
|
||
if ($hasExistingConfig) {
|
||
Write-SubStep "备份 /etc/docker/daemon.json..."
|
||
$backupCmd = "cp /etc/docker/daemon.json /etc/docker/daemon.json.backup.`$(date +%Y%m%d_%H%M%S)"
|
||
Invoke-ProdServer -Command $backupCmd -Silent | Out-Null
|
||
Write-Success "配置已备份"
|
||
} else {
|
||
Write-Info "无需备份(配置文件不存在)"
|
||
}
|
||
|
||
# ==================== 步骤 2:创建新配置 ====================
|
||
Write-Step 2 "配置 insecure-registry"
|
||
|
||
Write-SubStep "创建新的 Docker 配置..."
|
||
|
||
$newConfig = @"
|
||
{
|
||
"insecure-registries": ["$BuildServerIP`:5000"]
|
||
}
|
||
"@
|
||
|
||
$createConfigCmd = @"
|
||
cat > /etc/docker/daemon.json << 'EOFCONFIG'
|
||
$newConfig
|
||
EOFCONFIG
|
||
"@
|
||
|
||
Invoke-ProdServer -Command $createConfigCmd -Silent | Out-Null
|
||
Write-Success "配置已创建"
|
||
|
||
Write-SubStep "验证配置文件..."
|
||
$verifyConfig = Invoke-ProdServer -Command "cat /etc/docker/daemon.json"
|
||
Write-Success "配置文件内容正确"
|
||
|
||
# ==================== 步骤 3:重启 Docker ====================
|
||
Write-Step 3 "重启 Docker 服务"
|
||
|
||
Write-Warning-Custom "⚠️ 即将重启 Docker,服务会短暂中断(约 5-10 秒)"
|
||
Start-Sleep -Seconds 2
|
||
|
||
Write-SubStep "重启 Docker 服务..."
|
||
Invoke-ProdServer -Command "systemctl restart docker" -Silent | Out-Null
|
||
|
||
Write-SubStep "等待 Docker 启动..."
|
||
Start-Sleep -Seconds 5
|
||
|
||
Write-SubStep "检查 Docker 状态..."
|
||
$dockerStatus = Invoke-ProdServer -Command "systemctl is-active docker" -Silent
|
||
if ($dockerStatus -match "active") {
|
||
Write-Success "Docker 服务已启动"
|
||
} else {
|
||
Write-Error-Custom "Docker 服务启动失败"
|
||
Write-Info "请手动检查:ssh root@$ProdServerIP 'systemctl status docker'"
|
||
return
|
||
}
|
||
|
||
Write-SubStep "等待容器自动重启..."
|
||
Start-Sleep -Seconds 5
|
||
|
||
Write-SubStep "检查容器状态..."
|
||
$containersAfter = Invoke-ProdServer -Command "docker ps --format 'table {{.Names}}\t{{.Status}}'"
|
||
|
||
$runningCount = ($containersAfter -split "`n" | Where-Object { $_ -match "Up" }).Count
|
||
if ($runningCount -ge $containerList.Count) {
|
||
Write-Success "所有容器已恢复运行"
|
||
} else {
|
||
Write-Warning-Custom "部分容器可能未启动,请检查"
|
||
}
|
||
|
||
# ==================== 步骤 4:验证配置 ====================
|
||
Write-Step 4 "验证配置"
|
||
|
||
Write-SubStep "检查 insecure-registry 配置..."
|
||
$newInsecure = Invoke-ProdServer -Command "docker info 2>&1 | grep -A 5 'Insecure Registries'"
|
||
|
||
if ($newInsecure -match $BuildServerIP) {
|
||
Write-Success "insecure-registry 配置成功"
|
||
} else {
|
||
Write-Warning-Custom "配置可能未生效,请检查"
|
||
}
|
||
|
||
Write-SubStep "测试连接构建机 Registry..."
|
||
$registryTest = Invoke-ProdServer -Command "curl -s http://$BuildServerIP`:5000/v2/_catalog" -Silent
|
||
if ($registryTest -match "repositories") {
|
||
Write-Success "可以访问构建机 Registry"
|
||
} else {
|
||
Write-Warning-Custom "无法访问构建机 Registry,请检查网络"
|
||
}
|
||
|
||
# ==================== 完成 ====================
|
||
Write-Host ""
|
||
Write-Host "╔════════════════════════════════════════════════════════════╗" -ForegroundColor Green
|
||
Write-Host "║ ║" -ForegroundColor Green
|
||
Write-Host "║ ✅ 配置完成! ║" -ForegroundColor Green
|
||
Write-Host "║ ║" -ForegroundColor Green
|
||
Write-Host "╚════════════════════════════════════════════════════════════╝" -ForegroundColor Green
|
||
Write-Host ""
|
||
Write-Host "📊 配置结果" -ForegroundColor Magenta
|
||
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Cyan
|
||
Write-Info "生产服务器:$ProdServerIP"
|
||
Write-Info "构建机 Registry:$BuildServerIP`:5000"
|
||
Write-Info "配置文件:/etc/docker/daemon.json"
|
||
if ($hasExistingConfig) {
|
||
Write-Info "备份文件:/etc/docker/daemon.json.backup.*"
|
||
}
|
||
Write-Host ""
|
||
Write-Host "🎯 下一步操作" -ForegroundColor Magenta
|
||
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Cyan
|
||
Write-Info "1. 测试部署到影子系统:"
|
||
Write-Host " .\deploy-build-server.ps1 -Target shadow" -ForegroundColor Yellow
|
||
Write-Info "2. 如果测试成功,部署到正式系统:"
|
||
Write-Host " .\deploy-build-server.ps1 -Target production" -ForegroundColor Yellow
|
||
Write-Host ""
|
||
}
|
||
|
||
# 执行
|
||
Main
|