# Deploy script with password support param( [string]$Server = "45.249.208.118", [string]$User = "root", [string]$Password = "lxvhNYFZ4160", [string]$ProjectPath = "/root/youyidian-3d" ) $ErrorActionPreference = "Stop" Write-Host "========================================" -ForegroundColor Cyan Write-Host "Deploy Script with Password" -ForegroundColor Green Write-Host "========================================" -ForegroundColor Cyan Write-Host "" # Check if in project root if (-not (Test-Path "package.json")) { Write-Host "Error: Please run this script from project root directory" -ForegroundColor Red exit 1 } # Step 1: Package project files Write-Host "[1/5] Packaging project files..." -ForegroundColor Yellow $excludes = @( "node_modules", ".next", ".git", ".env.local", ".env*.local", "dist", "build", ".DS_Store", "Thumbs.db", ".vscode", ".idea", ".cursor", "*.swp", "*.swo", "docs", "*.md", "README.md", "scripts", "*.sh", "*.ps1", "*.bat", "uploads", "backups", "*.tar.gz", "*.zip" ) $excludeArgs = $excludes | ForEach-Object { "--exclude=$_" } $timestamp = Get-Date -Format "yyyyMMdd-HHmmss" $tempFile = Join-Path $env:TEMP "project-deploy-$timestamp.tar.gz" Write-Host " Packaging..." -ForegroundColor Gray & tar -czf $tempFile $excludeArgs * if (-not (Test-Path $tempFile)) { Write-Host " Failed to package" -ForegroundColor Red exit 1 } $fileSize = (Get-Item $tempFile).Length / 1MB Write-Host " Package complete: $([math]::Round($fileSize, 2)) MB" -ForegroundColor Green Write-Host "" # Step 2: Check for plink/pscp (PuTTY tools) Write-Host "[2/5] Checking SSH tools..." -ForegroundColor Yellow $plinkPath = "C:\Program Files\PuTTY\plink.exe" $pscpPath = "C:\Program Files\PuTTY\pscp.exe" $usePlink = (Test-Path $plinkPath) -and (Test-Path $pscpPath) if ($usePlink) { Write-Host " Using plink/pscp (PuTTY tools)" -ForegroundColor Green } else { Write-Host " Using OpenSSH (will prompt for password)" -ForegroundColor Yellow Write-Host " Note: If SSH key is not configured, you may need to enter password manually" -ForegroundColor Gray } Write-Host "" # Step 3: Upload to server Write-Host "[3/5] Uploading to server..." -ForegroundColor Yellow Write-Host " Server: $Server" -ForegroundColor Gray Write-Host " User: $User" -ForegroundColor Gray Write-Host " Project Path: $ProjectPath" -ForegroundColor Gray Write-Host "" $remoteFileName = "project-deploy.tar.gz" Write-Host " Uploading package..." -ForegroundColor Gray if ($usePlink) { # Use pscp with password $pscpCmd = "`"$pscpPath`" -pw `"$Password`" -batch `"$tempFile`" ${User}@${Server}:${ProjectPath}/$remoteFileName" $result = cmd /c $pscpCmd 2>&1 if ($LASTEXITCODE -ne 0) { Write-Host " Upload failed" -ForegroundColor Red Write-Host $result -ForegroundColor Red Remove-Item $tempFile -Force -ErrorAction SilentlyContinue exit 1 } } else { # Use OpenSSH scp (may need SSH key or manual password entry) scp $tempFile "${User}@${Server}:${ProjectPath}/$remoteFileName" if ($LASTEXITCODE -ne 0) { Write-Host " Upload failed" -ForegroundColor Red Remove-Item $tempFile -Force -ErrorAction SilentlyContinue exit 1 } } Write-Host " Upload successful" -ForegroundColor Green Write-Host "" # Step 4: Create and upload deployment script Write-Host "[4/5] Creating deployment script..." -ForegroundColor Yellow $scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path $templatePath = Join-Path $scriptDir "deploy-remote.sh.template" if (-not (Test-Path $templatePath)) { Write-Host " Error: Template not found: $templatePath" -ForegroundColor Red exit 1 } $bashScriptTemplate = Get-Content -Path $templatePath -Raw -Encoding UTF8 $bashScript = $bashScriptTemplate -replace "PROJECT_PATH_PLACEHOLDER", $ProjectPath $bashScript = $bashScript -replace "REMOTE_FILE_NAME_PLACEHOLDER", $remoteFileName # Convert Windows line endings to Unix line endings $bashScript = $bashScript -replace "`r`n", "`n" -replace "`r", "`n" $localDeployScript = Join-Path $env:TEMP "deploy-$timestamp.sh" $utf8NoBom = New-Object System.Text.UTF8Encoding $false # Write with Unix line endings $bytes = $utf8NoBom.GetBytes($bashScript) [System.IO.File]::WriteAllBytes($localDeployScript, $bytes) $remoteDeployScript = "/tmp/deploy-$timestamp.sh" Write-Host " Uploading deployment script..." -ForegroundColor Gray if ($usePlink) { $pscpCmd = "`"$pscpPath`" -pw `"$Password`" -batch `"$localDeployScript`" ${User}@${Server}:$remoteDeployScript" $result = cmd /c $pscpCmd 2>&1 if ($LASTEXITCODE -ne 0) { Write-Host " Failed to upload deployment script" -ForegroundColor Red Write-Host $result -ForegroundColor Red Remove-Item $localDeployScript -Force -ErrorAction SilentlyContinue Remove-Item $tempFile -Force -ErrorAction SilentlyContinue exit 1 } } else { scp $localDeployScript "${User}@${Server}:$remoteDeployScript" if ($LASTEXITCODE -ne 0) { Write-Host " Failed to upload deployment script" -ForegroundColor Red Remove-Item $localDeployScript -Force -ErrorAction SilentlyContinue Remove-Item $tempFile -Force -ErrorAction SilentlyContinue exit 1 } } Write-Host " Deployment script uploaded" -ForegroundColor Green Write-Host "" # Step 5: Execute deployment on server Write-Host "[5/5] Executing deployment on server..." -ForegroundColor Yellow Write-Host " This may take several minutes..." -ForegroundColor Gray Write-Host "" $deployCmd = "chmod +x $remoteDeployScript; bash $remoteDeployScript; rm -f $remoteDeployScript" if ($usePlink) { $plinkCmd = "`"$plinkPath`" -ssh -pw `"$Password`" -batch ${User}@${Server} `"$deployCmd`"" Write-Host " Executing deployment..." -ForegroundColor Gray cmd /c $plinkCmd if ($LASTEXITCODE -ne 0) { Write-Host " Deployment failed on server" -ForegroundColor Red Remove-Item $localDeployScript -Force -ErrorAction SilentlyContinue Remove-Item $tempFile -Force -ErrorAction SilentlyContinue exit 1 } } else { ssh "${User}@${Server}" $deployCmd if ($LASTEXITCODE -ne 0) { Write-Host " Deployment failed on server" -ForegroundColor Red Remove-Item $localDeployScript -Force -ErrorAction SilentlyContinue Remove-Item $tempFile -Force -ErrorAction SilentlyContinue exit 1 } } # Cleanup Remove-Item $localDeployScript -Force -ErrorAction SilentlyContinue Remove-Item $tempFile -Force -ErrorAction SilentlyContinue Write-Host "" Write-Host "========================================" -ForegroundColor Cyan Write-Host "Deployment Complete!" -ForegroundColor Green Write-Host "========================================" -ForegroundColor Cyan Write-Host "" Write-Host "Next steps:" -ForegroundColor Yellow Write-Host " 1. Check website status" -ForegroundColor White Write-Host " 2. Test key features" -ForegroundColor White Write-Host " 3. Check logs: ssh ${User}@${Server} `"cd ${ProjectPath}; docker compose logs app --tail=100`"" -ForegroundColor White Write-Host ""