# SSL Certificate Setup Script for VPS Deployment (PowerShell)
# This script helps set up SSL certificates for your nginx configuration
param(
[string]$Domain = "candivista.com",
[string]$Email = "your-email@example.com"
)
$ErrorActionPreference = "Stop"
$NginxConfDir = ".\nginx"
$SslDir = ".\nginx\ssl"
Write-Host "Setting up SSL certificates for $Domain" -ForegroundColor Green
# Create SSL directory if it doesn't exist
if (!(Test-Path $SslDir)) {
New-Item -ItemType Directory -Path $SslDir -Force
}
# Check if we have a domain name or just IP
if ($Domain -match '^\d+\.\d+\.\d+\.\d+$') {
Write-Host "IP address detected: $Domain" -ForegroundColor Yellow
Write-Host "For IP addresses, you'll need to use self-signed certificates or a service like Cloudflare" -ForegroundColor Yellow
Write-Host "Generating self-signed certificate..." -ForegroundColor Yellow
# Check if OpenSSL is available
try {
$opensslVersion = & openssl version 2>$null
if ($LASTEXITCODE -ne 0) {
throw "OpenSSL not found"
}
}
catch {
Write-Host "OpenSSL not found. Please install OpenSSL or use WSL/Linux subsystem." -ForegroundColor Red
Write-Host "Alternative: Use Cloudflare for SSL termination" -ForegroundColor Yellow
exit 1
}
# Generate self-signed certificate
& openssl req -x509 -nodes -days 365 -newkey rsa:2048 `
-keyout "$SslDir\key.pem" `
-out "$SslDir\cert.pem" `
-subj "/C=US/ST=State/L=City/O=Organization/CN=$Domain"
if ($LASTEXITCODE -eq 0) {
Write-Host "Self-signed certificate generated successfully!" -ForegroundColor Green
Write-Host "Note: Browsers will show a security warning for self-signed certificates." -ForegroundColor Yellow
Write-Host "For production, consider using Cloudflare or a domain name with Let's Encrypt." -ForegroundColor Yellow
} else {
Write-Host "Failed to generate self-signed certificate" -ForegroundColor Red
exit 1
}
} else {
Write-Host "Domain name detected: $Domain" -ForegroundColor Green
Write-Host "Setting up Let's Encrypt certificate..." -ForegroundColor Green
# Check if certbot is available
try {
$certbotVersion = & certbot --version 2>$null
if ($LASTEXITCODE -ne 0) {
throw "Certbot not found"
}
}
catch {
Write-Host "Certbot not found. Please install certbot first:" -ForegroundColor Red
Write-Host " Windows: Use WSL or install via pip" -ForegroundColor Yellow
Write-Host " Linux: sudo apt-get install certbot" -ForegroundColor Yellow
Write-Host " macOS: brew install certbot" -ForegroundColor Yellow
exit 1
}
# Create webroot directory for Let's Encrypt challenge
$webrootDir = "$SslDir\webroot\.well-known\acme-challenge"
if (!(Test-Path $webrootDir)) {
New-Item -ItemType Directory -Path $webrootDir -Force
}
# Get certificate
& certbot certonly --webroot `
-w "$SslDir\webroot" `
-d $Domain `
--email $Email `
--agree-tos `
--non-interactive
if ($LASTEXITCODE -eq 0) {
# Copy certificates to our SSL directory
Copy-Item "/etc/letsencrypt/live/$Domain/fullchain.pem" "$SslDir\cert.pem"
Copy-Item "/etc/letsencrypt/live/$Domain/privkey.pem" "$SslDir\key.pem"
Write-Host "Let's Encrypt certificate installed successfully!" -ForegroundColor Green
# Create renewal script
$renewScript = @"
#!/bin/bash
certbot renew --quiet
docker-compose restart nginx
"@
$renewScript | Out-File -FilePath "$SslDir\renew.sh" -Encoding UTF8
Write-Host "Auto-renewal script created!" -ForegroundColor Green
} else {
Write-Host "Failed to obtain Let's Encrypt certificate" -ForegroundColor Red
exit 1
}
}
Write-Host "SSL setup complete!" -ForegroundColor Green
Write-Host "Certificate: $SslDir\cert.pem" -ForegroundColor Cyan
Write-Host "Private key: $SslDir\key.pem" -ForegroundColor Cyan
Write-Host ""
Write-Host "Next steps:" -ForegroundColor Yellow
Write-Host "1. Update your .env file with production values" -ForegroundColor White
Write-Host "2. Run: docker-compose -f docker-compose.yml --env-file env.production up -d" -ForegroundColor White
Write-Host "3. Test your setup: https://$Domain" -ForegroundColor White