Files
tp/main_dc/certbot/documentation/docs.md
T
2025-12-03 06:55:31 +05:00

11 KiB
Raw Blame History

Документация по сервису Certbot

Последнее обновление: 3 декабря 2025 г.

Обзор

Сервис Certbot предназначен для автоматического получения и обновления SSL/TLS сертификатов Let's Encrypt для нескольких доменов в Docker-окружении. Сервис использует webroot-метод для подтверждения владения доменами и работает как автономный контейнер в составе Docker Compose стека.

Архитектура

Основные компоненты

  1. Контейнер Certbot (certbot/certbot образ)
  2. Конфигурационные файлы:
    • certbot.ini - основные настройки Certbot
    • init-certbot.sh - скрипт инициализации и запуска
    • checkRenewCerts.sh - скрипт проверки и обновления сертификатов
    • Индивидуальные скрипты обновления для каждого домена
  3. Cron-задачи для автоматического обновления
  4. Volumes для хранения сертификатов и данных

Поддерживаемые домены

Текущий список обслуживаемых доменов (декабрь 2025):

Домен Переменная окружения Назначение
yalarba.ru DOMAINS_yalarba Основной туристический портал
valitovgaziz.ru DOMAINS_valitovgaziz Персональный сайт
easysite102.ru DOMAINS_easysite102 Сайт туроператора
бегущийбашкир.рф (IDN) DOMAINS_begushiybashkir Спортивный портал (кириллица)
begushiybashkir.ru DOMAINS_begushiybashkir_latin Спортивный портал (латиница)

Конфигурация

Файлы конфигурации

certbot.ini

# Режим staging (используется для тестирования)
staging = False  # Для продакшена установить False

# Контактная информация
email = valitovgaziz@yandex.ru

# Согласие с условиями
agree-tos = True

# Неинтерактивный режим для автоматизации
non-interactive = True

# Путь для webroot-аутентификации
webroot-path = /var/www/certbot

# Настройки криптографии
key-type = ecdsa          # Использовать ECDSA ключи
elliptic-curve = secp384r1  # Кривая для ECDSA

docker-compose.yml (фрагмент для certbot)

certbot:
  build:
    context: ./certbot
    dockerfile: Dockerfile
  container_name: certbot
  volumes:
    - ./certbot/config:/etc/letsencrypt/config
    - certbot_data:/etc/letsencrypt
    - certbot_www:/var/www/certbot
  env_file:
    - .env
  environment:
    - EMAIL=${EMAIL}
    - DOMAINS=${ALL_DOMAINS}
    - STAGING=0
  restart: unless-stopped
  healthcheck:
    test:
      [
        "CMD-SHELL",
        "test -f /etc/letsencrypt/live/$$(echo $${DOMAINS} | cut -d',' -f1)/fullchain.pem || exit 1",
      ]
    interval: 30s
    timeout: 10s
    retries: 3
    start_period: 40s

Переменные окружения

Необходимые переменные в .env файле:

# Общие настройки
EMAIL=valitovgaziz@yandex.ru

# Списки доменов (через запятую)
DOMAINS_yalarba=yalarba.ru,www.yalarba.ru
DOMAINS_valitovgaziz=valitovgaziz.ru,www.valitovgaziz.ru
DOMAINS_easysite102=easysite102.ru,www.easysite102.ru
DOMAINS_begushiybashkir=бегущийбашкир.рф,www.бегущийбашкир.рф
DOMAINS_begushiybashkir_latin=begushiybashkir.ru,www.begushiybashkir.ru

# Агрегированный список для инициализации
ALL_DOMAINS=yalarba.ru,valitovgaziz.ru,easysite102.ru,бегущийбашкир.рф,begushiybashkir.ru

Рабочий процесс

1. Инициализация (init-certbot.sh)

При запуске контейнера выполняются следующие шаги:

  1. Проверка наличия сертификатов для каждого домена
  2. Получение недостающих сертификатов через webroot-метод
  3. Активация cron-демона
  4. Настройка ежедневной проверки сертификатов
  5. Запуск бесконечного процесса для поддержания работы контейнера

2. Ежедневная проверка (checkRenewCerts.sh)

Каждый день в 00:00 выполняется проверка всех сертификатов:

  1. Проверяется срок действия каждого сертификата
  2. Если до истечения осталось ≤ 2 дней, запускается процесс обновления
  3. Используется индивидуальный скрипт для каждого домена

3. Обновление сертификатов

Индивидуальные скрипты обновления:

  • renewYalarbaCert.sh - для yalarba.ru
  • renewValitovGazizCert.sh - для valitovgaziz.ru
  • renewEasysite102.sh - для easysite102.ru
  • renewBegushiyBashkir.sh - для бегущийбашкир.рф
  • renewBegushiyBashkirLatin.sh - для begushiybashkir.ru

Мониторинг и логи

Health Checks

  • Certbot: проверка наличия файла fullchain.pem для первого домена
  • Логи доступны через docker logs certbot

Структура каталогов

/etc/letsencrypt/
├── live/
│   ├── yalarba.ru/
│   │   ├── cert.pem
│   │   ├── chain.pem
│   │   ├── fullchain.pem
│   │   └── privkey.pem
│   ├── valitovgaziz.ru/
│   └── ...
├── archive/           # Архивные версии сертификатов
└── renewal/          # Конфигурации обновления

Расширение системы

Добавление нового домена

  1. Добавить переменную окружения в .env файл:

    DOMAINS_newdomain=newdomain.ru,www.newdomain.ru
    
  2. Обновить список всех доменов:

    ALL_DOMAINS=existing.domains,newdomain.ru
    
  3. Создать скрипт обновления (renewNewdomainCert.sh):

    #!/bin/sh
    echo "Получаем новые сертификаты для ${DOMAINS_newdomain}"
    certbot certonly --webroot \
        --config /etc/letsencrypt/config/certbot.ini \
        -w /var/www/certbot \
        -d ${DOMAINS_newdomain}
    
  4. Обновить init-certbot.sh:

    # Проверяем наличие сертификатов для newdomain.ru
    if [ ! -d "/etc/letsencrypt/live/newdomain.ru" ]; then
      echo "Получаем новые сертификаты newdomain.ru ..."
      certbot certonly --webroot \
        --config /etc/letsencrypt/config/certbot.ini \
        -w /var/www/certbot \
        -d ${DOMAINS_newdomain}
    fi
    
  5. Обновить checkRenewCerts.sh: Добавить новую функцию проверки и вызов в main().

  6. Настроить nginx для использования нового сертификата.

Устранение неполадок

Общие проблемы

  1. Ошибки при получении сертификатов

    • Проверить доступность доменов из контейнера
    • Убедиться, что nginx обслуживает .well-known/acme-challenge/
  2. Сертификаты не обновляются

    • Проверить логи cron: docker exec certbot cat /var/log/cron
    • Убедиться, что скрипты имеют права на выполнение
  3. Health check падает

    • Проверить наличие сертификатов в /etc/letsencrypt/live/
    • Убедиться, что volumes правильно подключены

Команды для диагностики

# Проверить статус контейнера
docker-compose ps certbot

# Посмотреть логи
docker logs certbot

# Проверить cron задачи
docker exec certbot crontab -l

# Проверить срок действия сертификата
docker exec certbot openssl x509 -in /etc/letsencrypt/live/yalarba.ru/cert.pem -noout -dates

# Запустить проверку вручную
docker exec certbot /opt/checkRenewCerts.sh

Безопасность

Рекомендации

  1. Приватные ключи: Хранятся в volume certbot_data, доступ только для certbot и nginx
  2. Staging режим: Для тестирования установить staging = True в certbot.ini
  3. Ротация ключей: Используется ECDSA с кривой secp384r1 для лучшей безопасности
  4. Ограничение доступа: Контейнер не имеет открытых портов

Резервное копирование

Рекомендуется регулярное копирование volume certbot_data:

# Создание бэкапа
docker run --rm -v certbot_data:/data -v $(pwd):/backup alpine tar czf /backup/certbot_backup_$(date +%Y%m%d).tar.gz -C /data .

Часто задаваемые вопросы

Q: Как часто обновляются сертификаты? A: Проверка выполняется ежедневно, обновление - за 2 дня до истечения срока.

Q: Что делать при добавлении поддомена? A: Добавить поддомен в соответствующую переменную DOMAINS_* и перезапустить контейнер.

Q: Как перейти с staging на production? A: Установить staging = False в certbot.ini и перезапустить контейнер.

Q: Как проверить работу cron? A: docker exec certbot crontab -l покажет активные задачи.

Контакты и поддержка

  • Ответственный за обслуживание: Valitov Gaziz
  • Email: valitovgaziz@yandex.ru
  • Дата последнего обновления документации: 3 декабря 2025 г.

Документация будет обновляться при добавлении новых доменов или изменении архитектуры системы.