148 lines
3.6 KiB
Bash
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" |