#!/bin/bash set -e PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" cd "$PROJECT_DIR" DOMAIN="ai.qpid.pro" EMAIL="admin@qpid.pro" echo "=== [1/5] Проверка и создание директорий Certbot ===" mkdir -p "$PROJECT_DIR/certbot/conf" "$PROJECT_DIR/certbot/www" chmod -R 755 "$PROJECT_DIR/certbot/www" echo "=== [2/5] Проверка существующих SSL сертификатов ===" CERT_PATH="$PROJECT_DIR/certbot/conf/live/$DOMAIN/fullchain.pem" if [ -f "$CERT_PATH" ]; then echo "Сертификат для $DOMAIN уже существует." cp "$PROJECT_DIR/nginx/conf.d/ai.qpid.pro.conf.ssl" "$PROJECT_DIR/nginx/conf.d/ai.qpid.pro.conf" docker compose up -d --build echo "Nginx и Certbot запущены с существующим SSL." else echo "Сертификат не найден. Запуск временного HTTP-сервера для верификации ACME..." cp "$PROJECT_DIR/nginx/conf.d/ai.qpid.pro.conf.http" "$PROJECT_DIR/nginx/conf.d/ai.qpid.pro.conf" # Сборка и запуск nginx в HTTP-режиме docker compose up -d --build nginx echo "Ожидание готовности Nginx на порту 80..." sleep 3 echo "=== [3/5] Запрос SSL-сертификата через Certbot ===" SUCCESS=0 for ATTEMPT in 1 2 3; do echo "Попытка $ATTEMPT получения сертификата через Certbot..." if docker compose run --rm certbot certonly \ --webroot \ --webroot-path=/var/www/certbot \ -d "$DOMAIN" \ --email "$EMAIL" \ --agree-tos \ --no-eff-email \ --non-interactive; then SUCCESS=1 echo "Сертификат успешно получен!" break else echo "Попытка $ATTEMPT не удалась. Пауза 5 секунд..." sleep 5 fi done if [ "$SUCCESS" -ne 1 ]; then echo "❌ Ошибка: Не удалось получить SSL-сертификат для $DOMAIN." echo "Проверьте, что DNS A-запись для $DOMAIN указывает на публичный IP этого сервера." exit 1 fi echo "=== [4/5] Применение полной SSL-конфигурации Nginx ===" cp "$PROJECT_DIR/nginx/conf.d/ai.qpid.pro.conf.ssl" "$PROJECT_DIR/nginx/conf.d/ai.qpid.pro.conf" docker compose restart nginx fi echo "=== [5/5] Настройка регулярного обновления сертификатов ===" chmod +x "$PROJECT_DIR/scripts/renew-certs.sh" # Добавление задачи обновления в cron (если еще не добавлена) CRON_JOB="0 3 * * * $PROJECT_DIR/scripts/renew-certs.sh >> /var/log/certbot-renew.log 2>&1" (crontab -l 2>/dev/null | grep -Fv "$PROJECT_DIR/scripts/renew-certs.sh" ; echo "$CRON_JOB") | crontab - || true echo "=== Развертывание и настройка SSL успешно завершены! ==="