#!/bin/bash # ============================================================================== # SCRIPT DE GERAÇÃO DE CERTIFICADOS SSL EM LOTE # # Descrição: Este script automatiza a obtenção de certificados Let's Encrypt # para todos os sites configurados no Nginx. # ============================================================================== # --- Variáveis de Configuração --- SITES_DIR="/etc/nginx/sites-available" # Use um email válido para as notificações do Let's Encrypt ADMIN_EMAIL="operacoes@itguys.com.br" # --- Funções de Ajuda --- info() { echo -e "\e[32m[INFO]\e[0m $1"; } error() { echo -e "\e[31m[ERRO]\e[0m $1"; } warn() { echo -e "\e[33m[AVISO]\e[0m $1"; } # --- Início da Execução --- info "Iniciando o processo de geração de certificados para os sites em ${SITES_DIR}..." if [ "$EUID" -ne 0 ]; then error "Este script precisa de ser executado como root." fi # Arrays para guardar os resultados SUCCESS_SITES=() FAILED_SITES=() # Percorre cada ficheiro de configuração no diretório de sites disponíveis. for file in "$SITES_DIR"/*.conf; do # Verifica se é um ficheiro regular. if [[ ! -f "$file" ]]; then continue fi echo "" info "----------------------------------------------------------------------" info "A processar o ficheiro: $(basename "$file")" info "----------------------------------------------------------------------" # Extrai todos os server_names do ficheiro, ignorando os comentados. # Esta regex lida com múltiplas linhas de server_name e múltiplos domínios por linha. DOMAINS=$(grep -v '^\s*#' "$file" | grep "server_name" | sed 's/server_name//' | sed 's/;//' | xargs) # Se não encontrar nenhum server_name, salta para o próximo ficheiro. if [ -z "$DOMAINS" ]; then warn "Nenhum 'server_name' encontrado em $file. A ignorar." continue fi # Constrói a lista de argumentos '-d' para o Certbot. CERTBOT_DOMAIN_ARGS="" for domain in $DOMAINS; do CERTBOT_DOMAIN_ARGS+=" -d $domain" done info "Domínios encontrados: $DOMAINS" info "A executar o Certbot..." # Executa o Certbot. # O comando 'if' verifica o código de saída do Certbot para saber se foi bem-sucedido. if sudo certbot --nginx --non-interactive --agree-tos --no-eff-email --redirect ${CERTBOT_DOMAIN_ARGS} -m "$ADMIN_EMAIL"; then info "Certificado para os domínios em $(basename "$file") gerado com sucesso!" SUCCESS_SITES+=("$(basename "$file")") else error "Falha ao gerar o certificado para os domínios em $(basename "$file")." FAILED_SITES+=("$(basename "$file")") fi done # --- Relatório Final --- echo "" echo "======================================================================" echo " RELATÓRIO FINAL DE GERAÇÃO DE CERTIFICADOS" echo "======================================================================" echo "" if [ ${#SUCCESS_SITES[@]} -ne 0 ]; then info "Certificados gerados com SUCESSO para:" for site in "${SUCCESS_SITES[@]}"; do echo " - $site" done fi echo "" if [ ${#FAILED_SITES[@]} -ne 0 ]; then error "FALHA ao gerar certificados para:" for site in "${FAILED_SITES[@]}"; do echo " - $site" done warn "Verifique se os registos de DNS para os domínios acima estão a apontar corretamente para este servidor e tente novamente." else info "Todos os certificados foram gerados sem erros!" fi echo "" info "Processo concluído."