Руководство по использованию скриптов для управления SSL сертификатами Let's Encrypt с DNS-валидацией через API reg.ru

🆕 Новое в версии 2.0

Автоматическая интеграция с Nginx Proxy Manager!

Python скрипт теперь автоматически загружает созданные сертификаты в Nginx Proxy Manager.

  • Автоматическая загрузка сертификатов в NPM
  • Автоматическое обновление существующих сертификатов
  • Полная интеграция через API NPM
  • Поддержка wildcard сертификатов

Содержание

  1. Введение
  2. Быстрая установка (letsencrypt_regru.sh)
  3. Быстрый старт
  4. Установка через Makefile
  5. Создание тестовых сертификатов
  6. Требования
  7. Установка зависимостей
  8. Настройка
  9. Использование Bash скрипта
  10. Использование Python скрипта
  11. Интеграция с Nginx Proxy Manager
  12. Автоматическая проверка и обновление сертификатов
  13. Автоматизация обновления
  14. Устранение неполадок

Введение

В проекте представлены два скрипта для автоматического создания и обновления SSL сертификатов Let's Encrypt с использованием DNS-валидации через API reg.ru:

  1. letsencrypt_regru_dns.sh - Bash скрипт с использованием плагина certbot-dns-regru
  2. letsencrypt_regru_api.py - Python скрипт с прямым взаимодействием с API reg.ru и интеграцией с NPM

Оба скрипта поддерживают:

  • Создание wildcard сертификатов (*.domain.com)
  • Автоматическое обновление сертификатов
  • DNS-валидацию через API reg.ru
  • Логирование всех операций
  • Перезагрузку веб-сервера после обновления

Дополнительно Python скрипт поддерживает:

  • Автоматическую загрузку в Nginx Proxy Manager
  • Автоматическое обновление сертификатов в NPM
  • API интеграцию с NPM

Быстрая установка (letsencrypt_regru.sh)

Автоматическая установка всего приложения одной командой!

Скрипт letsencrypt_regru.sh автоматизирует весь процесс развертывания:

  • Установка всех зависимостей (Python, certbot, библиотеки)
  • Создание виртуального окружения Python
  • Интерактивная настройка конфигурации
  • Настройка systemd для автоматического обновления
  • Создание удобных команд

Установка

Вариант 1: Автоматическая установка одной командой

# Скачать и запустить установочный скрипт напрямую с GitHub
sudo bash -c "$(curl -fsSL https://github.com/DFofanov/configure_nginx_manager/raw/refs/heads/master/letsencrypt_regru.sh)"

Вариант 2: Клонирование репозитория

# 1. Клонируйте репозиторий
git clone https://github.com/DFofanov/configure_nginx_manager.git
cd configure_nginx_manager

# 2. Запустите установку
sudo bash letsencrypt_regru.sh

Интерактивная настройка:

Скрипт спросит:

  • Домен (например, example.com)
  • Email для Let's Encrypt
  • Учетные данные reg.ru
  • Настройки NPM (опционально)

Использование после установки

После установки доступна глобальная команда letsencrypt-regru:

# Проверить срок действия сертификата
letsencrypt-regru --check

# Получить новый сертификат Let's Encrypt
letsencrypt-regru --obtain

# Обновить существующий сертификат
letsencrypt-regru --renew

# Создать тестовый самоподписанный сертификат
letsencrypt-regru --test-cert

# Автоматическая проверка и обновление при необходимости
letsencrypt-regru --auto

Автоматическое обновление

Скрипт установки настраивает автоматическую проверку сертификатов каждые 12 часов:

# Проверить статус автообновления
systemctl status letsencrypt-regru.timer

# Посмотреть логи
journalctl -u letsencrypt-regru -f

# Или в файле
tail -f /var/log/letsencrypt-regru/letsencrypt_regru.log

Управление установкой

# Обновить приложение до последней версии
sudo bash letsencrypt_regru.sh update

# Полностью удалить приложение
sudo bash letsencrypt_regru.sh uninstall

Расположение файлов

После установки файлы находятся:

Тип Путь
Приложение /opt/letsencrypt-regru/
Конфигурация /etc/letsencrypt-regru/config.json
Логи /var/log/letsencrypt-regru/
Сертификаты /etc/letsencrypt/live/
Systemd сервис /etc/systemd/system/letsencrypt-regru.service
Systemd таймер /etc/systemd/system/letsencrypt-regru.timer

Редактирование конфигурации

# Отредактировать настройки
sudo nano /etc/letsencrypt-regru/config.json

# Перезапустить таймер после изменений
sudo systemctl restart letsencrypt-regru.timer

🚀 Установка через Makefile

Самый быстрый способ установки на Linux!

Makefile автоматизирует весь процесс установки, настройки systemd-сервисов и cron-заданий.

Быстрая установка

# 1. Установка (требует root)
sudo make install

# 2. Редактирование конфигурации
sudo nano /etc/letsencrypt/regru_config.json

# 3. Проверка конфигурации
sudo make check-config

# 4. Тестовый запуск
sudo make test-run

Доступные команды Makefile

Основные команды

# Установка всего: создание директорий, копирование скрипта, настройка systemd и cron
sudo make install

# Полное удаление: удаление службы, cron-задания, файлов
sudo make uninstall

# Показать статус установки, systemd и cron
sudo make status

# Справка по всем командам
make help

Утилиты

# Проверка JSON конфигурации на валидность
sudo make check-config

# Тестовый запуск без обновления cron/systemd
sudo make test-run

# Просмотр логов
sudo make logs

# Запуск скрипта напрямую
sudo make run

# Получение нового сертификата
sudo make obtain

# Обновление существующего сертификата
sudo make renew

# Создание тестового самоподписанного сертификата
sudo make test-cert

# Очистка логов
sudo make clean

Что делает make install

  1. Создает директории

    • /opt/letsencrypt-regru/ - директория установки
    • /var/log/letsencrypt/ - директория логов
  2. Устанавливает зависимости

    pip3 install certbot requests cryptography
    
  3. Копирует скрипт

    • Копирует letsencrypt_regru_api.py в /opt/letsencrypt-regru/
    • Устанавливает права на выполнение
  4. Создает конфигурацию

    • Создает /etc/letsencrypt/regru_config.json (если не существует)
    • Устанавливает права 600 для безопасности
  5. Настраивает systemd

    • Создает letsencrypt-regru.service - разовый запуск
    • Создает letsencrypt-regru.timer - таймер для ежедневного запуска
    • Включает и запускает таймер
  6. Настраивает cron

    • Добавляет задание для запуска каждый день в 3:00 AM
    0 3 * * * /opt/letsencrypt-regru/letsencrypt_regru_api.py --config /etc/letsencrypt/regru_config.json --auto >> /var/log/letsencrypt/letsencrypt_regru.log 2>&1
    

Что делает make uninstall

  1. Останавливает и удаляет службы

    • Останавливает systemd timer и service
    • Удаляет файлы служб из /etc/systemd/system/
    • Перезагружает конфигурацию systemd
  2. Удаляет cron-задание

    • Удаляет запись из crontab
  3. Удаляет файлы (с подтверждением)

    • Удаляет /opt/letsencrypt-regru/
    • Опционально удаляет конфигурацию и логи

Пример: Полная установка от А до Я

# 1. Клонируем или скачиваем проект
cd /tmp
git clone <repository-url>
cd configure_nginx_manager

# 2. Устанавливаем через Makefile
sudo make install

# 3. Редактируем конфигурацию
sudo nano /etc/letsencrypt/regru_config.json

# Вставляем реальные данные:
{
    "regru_username": "myuser",
    "regru_password": "mypassword",
    "domain": "example.com",
    "wildcard": true,
    "email": "admin@example.com",
    "renewal_days": 30,
    "npm_enabled": true,
    "npm_host": "https://npm.example.com",
    "npm_email": "admin@example.com",
    "npm_password": "npm_password"
}

# 4. Проверяем конфигурацию
sudo make check-config

# 5. Тестируем
sudo make test-run

# 6. Проверяем статус
sudo make status

# 7. Смотрим логи
sudo make logs

Структура после установки

/opt/letsencrypt-regru/
├── letsencrypt_regru_api.py          # Основной скрипт

/etc/letsencrypt/
├── regru_config.json                 # Конфигурация (600)
└── live/                             # Сертификаты Let's Encrypt
    └── example.com/
        ├── fullchain.pem
        └── privkey.pem

/var/log/letsencrypt/
└── letsencrypt_regru.log             # Логи

/etc/systemd/system/
├── letsencrypt-regru.service         # Systemd сервис
└── letsencrypt-regru.timer           # Systemd таймер (ежедневно)

Проверка работы автоматизации

# Статус systemd таймера
sudo systemctl status letsencrypt-regru.timer

# Когда будет следующий запуск
sudo systemctl list-timers letsencrypt-regru.timer

# Проверка cron
sudo crontab -l | grep letsencrypt

# Ручной запуск службы (для теста)
sudo systemctl start letsencrypt-regru.service

# Просмотр логов службы
sudo journalctl -u letsencrypt-regru.service -f

Удаление

# Полное удаление
sudo make uninstall

# Система спросит подтверждение перед удалением конфигурации и логов

🧪 Создание тестового самоподписанного сертификата

Идеально для тестирования без ограничений Let's Encrypt!

Let's Encrypt имеет ограничения на количество сертификатов (5 в неделю на домен). Для тестирования и разработки можно использовать самоподписанные сертификаты.

Преимущества тестовых сертификатов

Нет ограничений - создавайте сколько угодно сертификатов
Мгновенное создание - без DNS-валидации и ожидания
Тестирование NPM - проверка интеграции с Nginx Proxy Manager
Офлайн работа - не требуется интернет и API reg.ru
Идентичная структура - те же файлы, что и Let's Encrypt

⚠️ Ограничения: Браузеры не доверяют самоподписанным сертификатам

Быстрое создание

# Создать тестовый сертификат
sudo make test-cert

Команда автоматически:

  1. Генерирует RSA ключ 2048 бит
  2. Создает самоподписанный сертификат на 90 дней
  3. Поддерживает wildcard домены (если настроено)
  4. Создает все необходимые файлы (privkey.pem, cert.pem, fullchain.pem, chain.pem)
  5. Опционально загружает в Nginx Proxy Manager

Использование Python скрипта напрямую

# Создать тестовый сертификат с подробным выводом
sudo python3 /opt/letsencrypt-regru/letsencrypt_regru_api.py \
    --config /etc/letsencrypt/regru_config.json \
    --test-cert -v

Что создается

После выполнения команды будут созданы файлы:

/etc/letsencrypt/live/example.com/
├── privkey.pem      # Приватный ключ RSA 2048 бит
├── cert.pem         # Сертификат
├── fullchain.pem    # Полная цепочка (для nginx)
└── chain.pem        # Цепочка CA (пустой для самоподписанного)

Интеграция с NPM

Если в конфигурации включена интеграция с NPM (npm_enabled: true), тестовый сертификат автоматически загрузится в Nginx Proxy Manager:

{
    "npm_enabled": true,
    "npm_host": "https://npm.example.com",
    "npm_email": "admin@example.com",
    "npm_password": "password"
}

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

═══════════════════════════════════════════════════════════════
ГЕНЕРАЦИЯ ТЕСТОВОГО САМОПОДПИСАННОГО СЕРТИФИКАТА
═══════════════════════════════════════════════════════════════
Домен: example.com
Wildcard: True
Срок действия: 90 дней
⚠️  ВНИМАНИЕ: Это тестовый сертификат, не для production!

✓ Приватный ключ сохранен: /etc/letsencrypt/live/example.com/privkey.pem
✓ Сертификат сохранен: /etc/letsencrypt/live/example.com/cert.pem
✓ Fullchain сохранен: /etc/letsencrypt/live/example.com/fullchain.pem
✓ Chain файл создан: /etc/letsencrypt/live/example.com/chain.pem

═══════════════════════════════════════════════════════════════
ИНФОРМАЦИЯ О СЕРТИФИКАТЕ
═══════════════════════════════════════════════════════════════
Домен: example.com
Wildcard: *.example.com
Действителен с: 2025-10-27 12:00:00
Действителен до: 2026-01-25 12:00:00

Когда использовать тестовые сертификаты

Используйте для:

  • Локальной разработки и тестирования
  • Проверки интеграции с Nginx Proxy Manager
  • Тестирования автоматизации
  • Разработки без доступа к интернету
  • Избежания лимитов Let's Encrypt при частом тестировании

НЕ используйте для:

  • Production окружения
  • Публичных веб-сайтов
  • Любых случаев, где требуется доверие браузеров

Переход с тестового на production

После успешного тестирования легко переключиться на настоящий Let's Encrypt сертификат:

# 1. Удалить тестовый сертификат
sudo rm -rf /etc/letsencrypt/live/example.com/

# 2. Получить настоящий сертификат
sudo make obtain

# Или автоматически
sudo make run

Требования

Общие требования

  • Операционная система: Linux (Ubuntu/Debian/CentOS)
  • Права: root или sudo
  • Домен зарегистрирован на reg.ru
  • Доступ к API reg.ru (имя пользователя и пароль)

Для Bash скрипта

  • certbot
  • certbot-dns-regru (плагин)
  • curl
  • jq
  • openssl

Для Python скрипта

  • Python 3.6+
  • certbot
  • pip3
  • Модули Python: requests, cryptography

Установка зависимостей

Ubuntu/Debian

# Обновление пакетов
sudo apt-get update

# Установка базовых зависимостей
sudo apt-get install -y certbot curl jq openssl python3 python3-pip

# Для Python скрипта
sudo pip3 install certbot-dns-regru requests cryptography

# Для Bash скрипта (если используете)
sudo pip3 install certbot-dns-regru

CentOS/RHEL

# Обновление пакетов
sudo yum update -y

# Установка EPEL репозитория
sudo yum install -y epel-release

# Установка базовых зависимостей
sudo yum install -y certbot curl jq openssl python3 python3-pip

# Установка плагина
sudo pip3 install certbot-dns-regru requests cryptography

Настройка

1. Получение учетных данных API reg.ru

  1. Войдите в личный кабинет на сайте reg.ru
  2. Перейдите в раздел "Управление API"
  3. Используйте ваше имя пользователя и пароль для доступа к API
  4. Убедитесь, что у вас есть права на управление DNS-записями

2. Настройка конфигурации

Для Python скрипта

Создайте файл конфигурации на основе примера:

# Создание примера конфигурации
sudo python3 letsencrypt_regru_api.py --create-config /etc/letsencrypt/regru_config.json

# Редактирование конфигурации
sudo nano /etc/letsencrypt/regru_config.json

Отредактируйте параметры:

{
    "regru_username": "your_actual_username",
    "regru_password": "your_actual_password",
    "domain": "dfv24.com",
    "wildcard": true,
    "email": "admin@dfv24.com",
    "cert_dir": "/etc/letsencrypt/live",
    "log_file": "/var/log/letsencrypt_regru.log",
    "dns_propagation_wait": 60,
    "dns_check_attempts": 10,
    "dns_check_interval": 10
}

Для Bash скрипта

Отредактируйте переменные в начале скрипта:

sudo nano letsencrypt_regru_dns.sh

Измените следующие параметры:

REGRU_USERNAME="your_actual_username"
REGRU_PASSWORD="your_actual_password"
DOMAIN="dfv24.com"
WILDCARD_DOMAIN="*.dfv24.com"
EMAIL="admin@dfv24.com"

3. Установка прав доступа

# Для Bash скрипта
sudo chmod +x letsencrypt_regru_dns.sh

# Для Python скрипта
sudo chmod +x letsencrypt_regru_api.py

# Защита файла конфигурации
sudo chmod 600 /etc/letsencrypt/regru_config.json

Использование Bash скрипта

Первый запуск (получение сертификата)

sudo ./letsencrypt_regru_dns.sh

Скрипт автоматически:

  1. Проверит зависимости
  2. Создаст файл с учетными данными
  3. Установит плагин certbot-dns-regru (если не установлен)
  4. Проверит наличие существующего сертификата
  5. Получит новый сертификат или обновит существующий
  6. Перезагрузит веб-сервер

Просмотр логов

sudo tail -f /var/log/letsencrypt_regru.log

Ручная проверка сертификата

sudo certbot certificates

Использование Python скрипта

Создание примера конфигурации

sudo python3 letsencrypt_regru_api.py --create-config /etc/letsencrypt/regru_config.json

Получение нового сертификата

# С использованием конфигурационного файла
sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json --obtain

# С подробным выводом
sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json --obtain -v

Обновление существующего сертификата

sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json --renew

Проверка срока действия сертификата

sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json --check

Автоматический режим (проверка и обновление)

# Скрипт сам определит, нужно ли обновление
sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json

Опции командной строки

-c, --config FILE       Путь к файлу конфигурации (JSON)
--create-config FILE    Создать пример файла конфигурации
--obtain                Получить новый сертификат
--renew                 Обновить существующий сертификат
--check                 Проверить срок действия сертификата
-v, --verbose           Подробный вывод

🚀 Быстрый старт

За 3 простых шага получите SSL сертификат в Nginx Proxy Manager!

Шаг 1: Создайте конфигурацию

sudo python3 letsencrypt_regru_api.py --create-config /etc/letsencrypt/regru_config.json

Шаг 2: Отредактируйте параметры

sudo nano /etc/letsencrypt/regru_config.json

Заполните:

{
    "regru_username": аш_логин_regru",
    "regru_password": аш_пароль_regru",
    "domain": "dfv24.com",
    "wildcard": true,
    "email": "admin@dfv24.com",
    
    "npm_enabled": true,
    "npm_host": "http://192.168.10.14:81",
    "npm_email": "admin@example.com",
    "npm_password": "changeme"
}

Шаг 3: Получите сертификат

sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json --obtain

Готово!

Откройте Nginx Proxy Manager → SSL Certificates

Ваш сертификат *.dfv24.com готов к использованию! 🎉

Что произошло:

  1. Создан wildcard сертификат через Let's Encrypt
  2. Выполнена DNS-валидация через API reg.ru
  3. Сертификат автоматически загружен в Nginx Proxy Manager
  4. Веб-сервер перезагружен

Интеграция с Nginx Proxy Manager

Обзор возможностей

Скрипт letsencrypt_regru_api.py поддерживает автоматическое добавление и обновление SSL сертификатов в Nginx Proxy Manager через его API.

Возможности:

  • Автоматическое добавление новых сертификатов в NPM
  • Обновление существующих сертификатов в NPM
  • Поиск сертификатов по доменному имени
  • Поддержка wildcard сертификатов
  • Полная синхронизация после создания/обновления

Настройка интеграции

1. Параметры конфигурации NPM

Параметр Описание Пример
npm_enabled Включить интеграцию с NPM true или false
npm_host URL адрес NPM http://192.168.10.14:81
npm_email Email для входа в NPM admin@example.com
npm_password Пароль администратора NPM changeme

2. Получение учетных данных NPM

  1. Войдите в Nginx Proxy Manager: http://192.168.10.14:81
  2. Используйте email и пароль администратора
  3. По умолчанию:
    • Email: admin@example.com
    • Password: changeme
  4. ВАЖНО: Измените пароль по умолчанию!

Использование

Автоматическая синхронизация

После создания или обновления сертификата скрипт автоматически:

  1. Авторизуется в Nginx Proxy Manager
  2. Проверит, существует ли сертификат для домена
  3. Создаст новый сертификат или обновит существующий
  4. Загрузит файлы сертификата в NPM

Создание нового сертификата с автоматической загрузкой в NPM

sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json --obtain

Скрипт выполнит:

  • Создание сертификата через Let's Encrypt
  • DNS-валидация через reg.ru API
  • Автоматическая загрузка в NPM
  • Перезагрузка веб-сервера

Обновление существующего сертификата

sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json --renew

Скрипт выполнит:

  • Обновление сертификата через certbot
  • Автоматическое обновление в NPM
  • Перезагрузка веб-сервера

Автоматический режим

sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json

Скрипт автоматически определит:

  • Нужно ли создать новый сертификат
  • Требуется ли обновление (если осталось < 30 дней)
  • Выполнит синхронизацию с NPM

Работа с API Nginx Proxy Manager

Класс NginxProxyManagerAPI

Скрипт использует класс NginxProxyManagerAPI для работы с NPM:

from letsencrypt_regru_api import NginxProxyManagerAPI

# Инициализация
npm_api = NginxProxyManagerAPI(
    host="http://192.168.10.14:81",
    email="admin@example.com",
    password="changeme",
    logger=logger
)

# Авторизация
npm_api.login()

# Получение списка сертификатов
certificates = npm_api.get_certificates()

# Поиск сертификата по домену
cert = npm_api.find_certificate_by_domain("dfv24.com")

# Синхронизация сертификата
npm_api.sync_certificate("dfv24.com", "/etc/letsencrypt/live/dfv24.com")

API Endpoints

Скрипт использует следующие endpoints NPM API:

Endpoint Метод Описание
/api/tokens POST Авторизация
/api/nginx/certificates GET Список сертификатов
/api/nginx/certificates POST Создание сертификата
/api/nginx/certificates/{id} PUT Обновление сертификата

Логи и отладка

Просмотр логов

# Основной лог скрипта
sudo tail -f /var/log/letsencrypt_regru.log

# Подробный режим
sudo python3 letsencrypt_regru_api.py -c config.json --obtain -v

Примеры логов при успешной синхронизации

2025-10-27 10:30:15 - INFO - === Синхронизация сертификата с Nginx Proxy Manager ===
2025-10-27 10:30:15 - INFO - Авторизация в Nginx Proxy Manager...
2025-10-27 10:30:16 - INFO - Авторизация в NPM успешна
2025-10-27 10:30:16 - DEBUG - Получение списка сертификатов из NPM...
2025-10-27 10:30:16 - DEBUG - Получено 3 сертификатов
2025-10-27 10:30:16 - INFO - Создание нового сертификата в NPM
2025-10-27 10:30:16 - INFO - Загрузка сертификата для dfv24.com в NPM...
2025-10-27 10:30:17 - INFO - Сертификат успешно загружен в NPM (ID: 4)
2025-10-27 10:30:17 - INFO - Сертификат успешно добавлен в Nginx Proxy Manager

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

Ошибка: Не удалось авторизоваться в NPM

Причины:

  • Неверный email или пароль
  • NPM недоступен по указанному адресу
  • Сетевые проблемы

Решение:

# Проверьте доступность NPM
curl http://192.168.10.14:81/api/

# Проверьте учетные данные
# Войдите в NPM через браузер с теми же учетными данными

Ошибка: Сертификат не загружен в NPM

Причины:

  • Файлы сертификата не найдены
  • Неправильный формат сертификата
  • Проблемы с API NPM

Решение:

# Проверьте наличие файлов сертификата
ls -la /etc/letsencrypt/live/dfv24.com/

# Проверьте права доступа
sudo chmod 644 /etc/letsencrypt/live/dfv24.com/*.pem

# Попробуйте вручную
sudo python3 -c "
from letsencrypt_regru_api import NginxProxyManagerAPI
import logging
logger = logging.getLogger()
npm = NginxProxyManagerAPI('http://192.168.10.14:81', 'admin@example.com', 'changeme', logger)
npm.login()
print(npm.get_certificates())
"

Ошибка: API NPM возвращает 401 (Unauthorized)

Решение:

  • Проверьте учетные данные в конфигурации
  • Убедитесь, что пароль был изменен с дефолтного
  • Попробуйте войти через веб-интерфейс

Ошибка: Сертификат создан, но не обновляется в NPM

Причина: Скрипт не может найти существующий сертификат

Решение:

# Просмотрите список сертификатов в NPM
# SSL Certificates → найдите сертификат для вашего домена

# Удалите старый сертификат вручную через UI
# Запустите скрипт снова - будет создан новый

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

Защита учетных данных

# Установите правильные права на конфигурацию
sudo chmod 600 /etc/letsencrypt/regru_config.json
sudo chown root:root /etc/letsencrypt/regru_config.json

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

  1. Измените пароль NPM по умолчанию

    Старый пароль: changeme
    Новый пароль: надежный_пароль
    
  2. Используйте HTTPS для NPM (если доступно)

    "npm_host": "https://192.168.10.14:443"
    
  3. Ограничьте доступ к API NPM

    • Настройте firewall
    • Используйте VPN для удаленного доступа

Проверка результата

В логах скрипта

sudo tail -n 50 /var/log/letsencrypt_regru.log | grep -i npm

В веб-интерфейсе NPM

  1. Откройте NPM: http://192.168.10.14:81
  2. Войдите в систему
  3. Перейдите в SSL Certificates
  4. Проверьте наличие сертификата для вашего домена
  5. Проверьте дату истечения

В командной строке

# Список сертификатов в NPM через API
curl -X POST http://192.168.10.14:81/api/tokens \
  -H "Content-Type: application/json" \
  -d '{"identity":"admin@example.com","secret":"changeme"}' \
  | jq -r '.token' > /tmp/npm_token

curl -H "Authorization: Bearer $(cat /tmp/npm_token)" \
  http://192.168.10.14:81/api/nginx/certificates \
  | jq '.'

Дополнительные возможности

Отключение синхронизации с NPM

Если нужно временно отключить синхронизацию:

{
    "npm_enabled": false
}

Использование с несколькими доменами

Создайте отдельные конфигурационные файлы:

# Для домена 1
sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/domain1_config.json

# Для домена 2
sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/domain2_config.json

Автоматическая проверка и обновление сертификатов

Как это работает

Скрипт в автоматическом режиме (без флагов --obtain или --renew) выполняет интеллектуальную проверку:

1. Проверка наличия сертификата

sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json

Если сертификата нет:

  • Создает новый сертификат через Let's Encrypt
  • Выполняет DNS-валидацию через reg.ru
  • Загружает сертификат в Nginx Proxy Manager (если включено)
  • Перезагружает веб-сервер

2. Проверка срока действия

Если сертификат существует:

  • 🔍 Проверяет сколько дней осталось до истечения
  • 📅 Сравнивает с порогом обновления (по умолчанию 30 дней)

Если осталось меньше 30 дней:

  • 🔄 Автоматически обновляет сертификат
  • Синхронизирует с Nginx Proxy Manager
  • Перезагружает веб-сервер

Если сертификат действителен (более 30 дней):

  • Выводит информацию о сертификате
  • Проверяет наличие в NPM и синхронизирует при необходимости
  • ⏭️ Завершает работу (обновление не требуется)

Настройка порога обновления

В конфигурации можно изменить порог обновления:

{
    "renewal_days": 30,  # За сколько дней до истечения обновлять
}

Рекомендуемые значения:

  • 30 - по умолчанию (рекомендуется)
  • 14 - для более консервативного подхода
  • 60 - для раннего обновления

Примеры работы скрипта

Сценарий 1: Сертификата нет

$ sudo python3 letsencrypt_regru_api.py -c config.json

============================================================
АВТОМАТИЧЕСКАЯ ПРОВЕРКА И ОБНОВЛЕНИЕ СЕРТИФИКАТА
============================================================
Порог обновления: 30 дней до истечения
Сертификат не найден
============================================================
СТАТУС: Сертификат не найден
ДЕЙСТВИЕ: Создание нового сертификата
============================================================
=== Запрос нового SSL сертификата ===
...
Сертификат успешно получен!
============================================================
СИНХРОНИЗАЦИЯ С NGINX PROXY MANAGER
============================================================
✅ Сертификат успешно создан в Nginx Proxy Manager
============================================================
ОПЕРАЦИЯ ЗАВЕРШЕНА УСПЕШНО
============================================================

Сценарий 2: Сертификат истекает через 20 дней

$ sudo python3 letsencrypt_regru_api.py -c config.json

============================================================
АВТОМАТИЧЕСКАЯ ПРОВЕРКА И ОБНОВЛЕНИЕ СЕРТИФИКАТА
============================================================
Порог обновления: 30 дней до истечения
Сертификат истекает: 2025-11-16
Осталось дней: 20
============================================================
СТАТУС: Сертификат истекает через 20 дней
ДЕЙСТВИЕ: Обновление сертификата (порог: 30 дней)
============================================================
=== Обновление SSL сертификата ===
...
Проверка обновления завершена
============================================================
РЕЗУЛЬТАТ: Сертификат успешно обновлен
============================================================
✅ Сертификат успешно обновлен в Nginx Proxy Manager

Сценарий 3: Сертификат действителен (60 дней)

$ sudo python3 letsencrypt_regru_api.py -c config.json

============================================================
АВТОМАТИЧЕСКАЯ ПРОВЕРКА И ОБНОВЛЕНИЕ СЕРТИФИКАТА
============================================================
Порог обновления: 30 дней до истечения
Сертификат истекает: 2025-12-26
Осталось дней: 60
============================================================
СТАТУС: Сертификат действителен (60 дней)
ДЕЙСТВИЕ: Обновление не требуется
============================================================
Проверка синхронизации с Nginx Proxy Manager...
Сертификат найден в NPM (ID: 4)

Ежедневная автоматическая проверка

Для ежедневной проверки и автоматического обновления настройте cron:

# Редактируем crontab
sudo crontab -e

# Добавляем задачу - проверка каждый день в 3:00 утра
0 3 * * * /usr/bin/python3 /path/to/letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json >> /var/log/letsencrypt_cron.log 2>&1

Что будет происходить каждый день:

  1. 🕒 В 3:00 утра запускается скрипт
  2. 🔍 Проверяет наличие и срок действия сертификата
  3. 📊 Записывает результат в лог
  4. 🔄 Обновляет сертификат только если нужно (< 30 дней)
  5. Синхронизирует с NPM при обновлении

Мониторинг работы

Просмотр логов ежедневной проверки

# Последние проверки
sudo tail -n 100 /var/log/letsencrypt_cron.log

# Фильтр по статусу
sudo grep "СТАТУС:" /var/log/letsencrypt_cron.log

# Фильтр по действиям
sudo grep "ДЕЙСТВИЕ:" /var/log/letsencrypt_cron.log

# Только успешные операции
sudo grep "ОПЕРАЦИЯ ЗАВЕРШЕНА УСПЕШНО" /var/log/letsencrypt_cron.log

Проверка следующего запуска cron

# Список задач cron
sudo crontab -l

# Статус cron службы
sudo systemctl status cron

Уведомления при обновлении

Добавьте email уведомления в cron:

# В начале crontab добавьте
MAILTO=admin@dfv24.com

# Задача с уведомлениями
0 3 * * * /usr/bin/python3 /path/to/letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json 2>&1 | mail -s "SSL Certificate Check - $(date)" admin@dfv24.com

Автоматизация обновления

Let's Encrypt сертификаты действительны 90 дней. Рекомендуется настроить автоматическое обновление.

Использование cron (для обоих скриптов)

Для Python скрипта

# Открыть crontab
sudo crontab -e

# Добавить задачу (проверка каждый день в 3:00 AM)
0 3 * * * /usr/bin/python3 /path/to/letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json >> /var/log/letsencrypt_cron.log 2>&1

Для Bash скрипта

# Открыть crontab
sudo crontab -e

# Добавить задачу (проверка каждый день в 3:00 AM)
0 3 * * * /path/to/letsencrypt_regru_dns.sh >> /var/log/letsencrypt_cron.log 2>&1

Использование systemd timer

Создайте systemd service и timer для более гибкого управления:

Создание service файла

sudo nano /etc/systemd/system/letsencrypt-regru.service

Содержимое:

[Unit]
Description=Let's Encrypt Certificate Renewal with reg.ru DNS
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/python3 /path/to/letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Создание timer файла

sudo nano /etc/systemd/system/letsencrypt-regru.timer

Содержимое:

[Unit]
Description=Daily Let's Encrypt Certificate Check and Renewal
Requires=letsencrypt-regru.service

[Timer]
OnCalendar=daily
Persistent=true
RandomizedDelaySec=1h

[Install]
WantedBy=timers.target

Активация timer

# Перезагрузка systemd
sudo systemctl daemon-reload

# Включение и запуск timer
sudo systemctl enable letsencrypt-regru.timer
sudo systemctl start letsencrypt-regru.timer

# Проверка статуса
sudo systemctl status letsencrypt-regru.timer
sudo systemctl list-timers

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

Проблема: Ошибка аутентификации API reg.ru

Решение:

  • Проверьте правильность имени пользователя и пароля
  • Убедитесь, что у вашего аккаунта есть доступ к API
  • Проверьте, что домен находится под управлением вашего аккаунта
# Проверка доступа к API
curl -X POST "https://api.reg.ru/api/regru2/user/get_balance" \
  -d "username=YOUR_USERNAME" \
  -d "password=YOUR_PASSWORD" \
  -d "output_format=json"

Проблема: DNS запись не распространяется

Решение:

  • Увеличьте параметр dns_propagation_wait в конфигурации (например, до 120 секунд)
  • Проверьте DNS записи вручную:
nslookup -type=TXT _acme-challenge.dfv24.com
# или
dig TXT _acme-challenge.dfv24.com

Проблема: Certbot не установлен

Решение:

# Ubuntu/Debian
sudo apt-get install certbot

# CentOS/RHEL
sudo yum install certbot

# Или через snap
sudo snap install --classic certbot

Проблема: Плагин certbot-dns-regru не найден

Решение:

# Установка через pip
sudo pip3 install certbot-dns-regru

# Или через pip3 с обновлением
sudo pip3 install --upgrade certbot-dns-regru

Проблема: Недостаточно прав

Решение:

  • Убедитесь, что запускаете скрипт от имени root или с sudo
  • Проверьте права доступа к директории /etc/letsencrypt/
sudo chmod 755 /etc/letsencrypt/
sudo chown -R root:root /etc/letsencrypt/

Проблема: Ошибка при перезагрузке веб-сервера

Решение:

  • Проверьте, какой веб-сервер используется:
systemctl status nginx
systemctl status apache2
  • Вручную перезагрузите веб-сервер:
# Для Nginx
sudo systemctl reload nginx

# Для Apache
sudo systemctl reload apache2

Просмотр подробных логов certbot

# Логи certbot
sudo tail -f /var/log/letsencrypt/letsencrypt.log

# Логи скрипта
sudo tail -f /var/log/letsencrypt_regru.log

Тестовый режим (staging)

Для тестирования используйте staging окружение Let's Encrypt:

# Добавьте опцию --staging к команде certbot
certbot certonly --staging --dns-regru ...

Проверка полученного сертификата

Просмотр информации о сертификате

# Просмотр всех сертификатов
sudo certbot certificates

# Просмотр конкретного сертификата
sudo openssl x509 -in /etc/letsencrypt/live/dfv24.com/cert.pem -text -noout

# Проверка даты истечения
sudo openssl x509 -enddate -noout -in /etc/letsencrypt/live/dfv24.com/cert.pem

Проверка сертификата в браузере

  1. Откройте ваш сайт в браузере: https://dfv24.com
  2. Нажмите на иконку замка в адресной строке
  3. Проверьте информацию о сертификате
  4. Убедитесь, что сертификат выдан Let's Encrypt и покрывает wildcard домен

Онлайн проверка SSL


Использование сертификата в Nginx Proxy Manager

После получения сертификата вы можете использовать его в Nginx Proxy Manager:

Вариант 1: Импорт существующего сертификата

  1. Войдите в Nginx Proxy Manager: http://192.168.10.14:81/
  2. Перейдите в SSL CertificatesAdd SSL Certificate
  3. Выберите Custom
  4. Вставьте содержимое файлов:
    • Certificate Key: /etc/letsencrypt/live/dfv24.com/privkey.pem
    • Certificate: /etc/letsencrypt/live/dfv24.com/fullchain.pem
  5. Сохраните сертификат

Вариант 2: Прямая настройка Nginx

Если вы используете Nginx напрямую, добавьте в конфигурацию:

server {
    listen 443 ssl http2;
    server_name dfv24.com *.dfv24.com;
    
    ssl_certificate /etc/letsencrypt/live/dfv24.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/dfv24.com/privkey.pem;
    
    # Дополнительные SSL настройки
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    
    # ... остальная конфигурация
}

Дополнительная документация

  • 📘 TESTING_GUIDE.md - Полное руководство по созданию и использованию тестовых сертификатов
  • <EFBFBD> GITEA_SYNC.md - Настройка автоматической синхронизации Gitea → GitHub
  • 📘 CHEATSHEET.md - Быстрая шпаргалка по командам
  • <EFBFBD>🚀 Makefile - Автоматизация установки и управления
  • 📝 config.json.example - Пример конфигурации

Поддержка и вопросы

При возникновении проблем:

  1. Проверьте логи: /var/log/letsencrypt_regru.log
  2. Проверьте логи certbot: /var/log/letsencrypt/letsencrypt.log
  3. Используйте подробный режим: -v для Python скрипта
  4. Проверьте документацию reg.ru API: https://www.reg.ru/support/api
  5. Проверьте документацию Let's Encrypt: https://letsencrypt.org/docs/
  6. Для тестирования: См. TESTING_GUIDE.md

Заключение

Оба скрипта предоставляют надежное решение для автоматического управления SSL сертификатами Let's Encrypt с использованием DNS-валидации через API reg.ru.

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

  • Используйте Python скрипт для более гибкой настройки и интеграции
  • Используйте Bash скрипт для простоты и минимальных зависимостей
  • Используйте тестовые сертификаты для разработки (без лимитов Let's Encrypt)
  • Настройте автоматическое обновление через cron или systemd timer
  • Регулярно проверяйте логи и статус сертификатов
  • Храните учетные данные в безопасности (chmod 600)

Быстрый старт для тестирования:

sudo make install           # Установка
sudo make test-cert         # Создать тестовый сертификат
sudo make obtain            # Получить production сертификат

Успешной автоматизации! 🔒


🔄 Синхронизация Gitea → GitHub

Проект поддерживает автоматическую синхронизацию из Gitea в GitHub.

Быстрая настройка

Метод 1: Git Hook (мгновенно)

# На сервере Gitea скопируйте hook
cp gitea-hooks/post-receive /path/to/repo.git/hooks/
chmod +x /path/to/repo.git/hooks/post-receive

Метод 2: GitHub Actions (каждый час)

  • Workflow уже настроен в .github/workflows/sync-from-gitea.yml
  • Добавьте секреты GITEA_URL и GITEA_TOKEN в GitHub

Подробная документация: См. GITEA_SYNC.md


Description
Комплексное решение для автоматизации создания, обновления и управления SSL сертификатами Let's Encrypt для доменов, зарегистрированных на reg.ru. Поддерживает DNS-01 валидацию, wildcard сертификаты, автоматическую загрузку в Nginx Proxy Manager и генерацию тестовых сертификатов для разработки.
Readme 208 KiB
Languages
Python 49.5%
Makefile 18.2%
Shell 17.3%
PowerShell 15%