BCards-Scripts-Server/nginx/setup-ssl.sh
2025-07-22 21:24:07 -03:00

148 lines
3.6 KiB
Bash

#!/bin/bash
# Script para configurar SSL com Let's Encrypt para bcards.site
set -e
DOMAIN="bcards.site"
EMAIL="admin@bcards.site" # Altere para um email válido
# Cores para output
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
log() {
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}"
}
error() {
echo -e "${RED}[ERROR] $1${NC}"
exit 1
}
warn() {
echo -e "${YELLOW}[WARNING] $1${NC}"
}
# Verificar se Docker está rodando
if ! docker info >/dev/null 2>&1; then
error "Docker não está rodando"
fi
# Criar diretórios necessários
log "Criando diretórios para SSL..."
sudo mkdir -p /etc/letsencrypt /var/www/certbot
# Criar configuração temporária do NGINX para validação
log "Criando configuração temporária do NGINX..."
cat > /tmp/nginx-temp.conf << EOF
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name $DOMAIN www.$DOMAIN;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://\$server_name\$request_uri;
}
}
}
EOF
# Parar NGINX se estiver rodando
log "Parando NGINX existente..."
docker stop bcards-nginx 2>/dev/null || true
docker rm bcards-nginx 2>/dev/null || true
# Iniciar NGINX temporário para validação
log "Iniciando NGINX temporário para validação Let's Encrypt..."
docker run -d \
--name nginx-temp \
-p 80:80 \
-v /tmp/nginx-temp.conf:/etc/nginx/nginx.conf:ro \
-v /var/www/certbot:/var/www/certbot \
nginx:alpine
# Aguardar NGINX inicializar
sleep 5
# Obter certificado SSL
log "Obtendo certificado SSL para $DOMAIN..."
docker run --rm \
-v /etc/letsencrypt:/etc/letsencrypt \
-v /var/www/certbot:/var/www/certbot \
certbot/certbot \
certonly \
--webroot \
--webroot-path=/var/www/certbot \
--email $EMAIL \
--agree-tos \
--no-eff-email \
-d $DOMAIN \
-d www.$DOMAIN
# Verificar se o certificado foi criado
if [ ! -f "/etc/letsencrypt/live/$DOMAIN/fullchain.pem" ]; then
error "Falha ao obter certificado SSL"
fi
log "Certificado SSL obtido com sucesso!"
# Parar NGINX temporário
docker stop nginx-temp
docker rm nginx-temp
# Testar configuração NGINX principal
log "Testando configuração NGINX principal..."
docker run --rm \
-v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /etc/letsencrypt:/etc/letsencrypt:ro \
nginx:alpine \
nginx -t
log "Configuração NGINX válida!"
# Criar script de renovação automática
log "Criando script de renovação automática..."
cat > /tmp/renew-ssl.sh << 'EOF'
#!/bin/bash
# Script de renovação automática de certificados SSL
docker run --rm \
-v /etc/letsencrypt:/etc/letsencrypt \
-v /var/www/certbot:/var/www/certbot \
certbot/certbot renew
# Recarregar NGINX se certificados foram renovados
if [ $? -eq 0 ]; then
docker exec bcards-nginx nginx -s reload
fi
EOF
sudo mv /tmp/renew-ssl.sh /usr/local/bin/renew-ssl.sh
sudo chmod +x /usr/local/bin/renew-ssl.sh
# Configurar cron para renovação automática
log "Configurando renovação automática..."
(crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/renew-ssl.sh >> /var/log/letsencrypt/renew.log 2>&1") | crontab -
# Criar diretório de logs
sudo mkdir -p /var/log/letsencrypt
log "SSL configurado com sucesso!"
log "Certificados localizados em: /etc/letsencrypt/live/$DOMAIN/"
log "Renovação automática configurada para executar diariamente às 02:00"
# Mostrar informações do certificado
log "Informações do certificado:"
sudo openssl x509 -in /etc/letsencrypt/live/$DOMAIN/fullchain.pem -text -noout | grep -A 2 "Validity"