#!/bin/bash #=============================================================================== # ШАГ 8: ПОЛУЧЕНИЕ SSL-СЕРТИФИКАТА #=============================================================================== # Запуск: sudo bash 02-k-git-server-deploy.08.sh # # Получает SSL-сертификат от Let's Encrypt через Certbot #=============================================================================== SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) source "$SCRIPT_DIR/02-k-git-server-deploy.00.sh" init_log check_root print_header "ШАГ 8: ПОЛУЧЕНИЕ SSL-СЕРТИФИКАТА" #------------------------------------------------------------------------------- # 8.1 Установка Certbot #------------------------------------------------------------------------------- print_subheader "Установка Certbot" install_packages certbot python3-certbot-nginx print_success "Certbot установлен" #------------------------------------------------------------------------------- # 8.2 Проверка DNS #------------------------------------------------------------------------------- print_subheader "Проверка DNS" if ! check_dns; then print_error "Домен $GIT_DOMAIN не резолвится. Невозможно получить сертификат." echo "" echo "Проверьте DNS A-запись для $GIT_DOMAIN" echo "Она должна указывать на внешний IP этого сервера" exit 1 fi #------------------------------------------------------------------------------- # 8.3 Проверка доступности порта 80 #------------------------------------------------------------------------------- print_subheader "Проверка доступности" print_info "Проверка доступности http://$GIT_DOMAIN..." if curl -sI "http://$GIT_DOMAIN" | head -1 | grep -q "200\|301\|302"; then print_success "Сервер доступен по HTTP" else print_warning "Не удалось проверить доступность. Продолжаем..." fi #------------------------------------------------------------------------------- # 8.4 Проверка существующего сертификата #------------------------------------------------------------------------------- print_subheader "Проверка сертификата" CERT_PATH="/etc/letsencrypt/live/$GIT_DOMAIN/fullchain.pem" if [[ -f "$CERT_PATH" ]]; then print_warning "SSL-сертификат уже существует" # Показать информацию о сертификате EXPIRE_DATE=$(openssl x509 -enddate -noout -in "$CERT_PATH" 2>/dev/null | cut -d= -f2) print_info "Текущий сертификат истекает: $EXPIRE_DATE" read -p "Получить новый сертификат? [y/N]: " RENEW if [[ ! "$RENEW" =~ ^[Yy]$ ]]; then print_info "Используется существующий сертификат" print_success "Шаг 8 завершён (пропуск)" exit 0 fi fi #------------------------------------------------------------------------------- # 8.5 Получение сертификата #------------------------------------------------------------------------------- print_subheader "Получение сертификата" print_info "Email для Let's Encrypt: $CERT_EMAIL" print_info "Домен: $GIT_DOMAIN" # Используем webroot метод (более надёжный) if certbot certonly --webroot \ -w /var/www/certbot \ -d "$GIT_DOMAIN" \ --email "$CERT_EMAIL" \ --agree-tos \ --no-eff-email \ --non-interactive; then print_success "SSL-сертификат получен" else print_error "Не удалось получить сертификат" echo "" echo "Возможные причины:" echo " 1. DNS A-запись не указывает на этот сервер" echo " 2. Порт 80 заблокирован firewall" echo " 3. Nginx не запущен или неправильно настроен" echo "" echo "Проверьте:" echo " dig $GIT_DOMAIN" echo " curl -I http://$GIT_DOMAIN" echo " systemctl status nginx" exit 1 fi #------------------------------------------------------------------------------- # 8.6 Настройка автообновления #------------------------------------------------------------------------------- print_subheader "Настройка автообновления" systemctl enable certbot.timer systemctl start certbot.timer print_success "Автообновление сертификатов настроено" #------------------------------------------------------------------------------- # 8.7 Проверка сертификата #------------------------------------------------------------------------------- print_subheader "Проверка сертификата" if [[ -f "$CERT_PATH" ]]; then print_success "Сертификат установлен: $CERT_PATH" # Показать детали openssl x509 -subject -issuer -dates -noout -in "$CERT_PATH" 2>/dev/null else print_error "Сертификат не найден" exit 1 fi print_success "Шаг 8 завершён: SSL-сертификат получен"