Files
gitserver/02/02-k-git-server-deploy.08.sh
2026-02-19 20:05:04 +03:00

133 lines
5.3 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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-сертификат получен"