Обновлено руководство по использованию letsencrypt_regru.sh: добавлены шаги для автоматической установки и настройки приложения, а также улучшена структура документации.

Добавлен новый файл INSTALL_GUIDE.md с подробным описанием установки и использования.
Обновлен скрипт letsencrypt_regru.sh: добавлены функции для установки зависимостей, создания конфигурации и настройки systemd сервиса.
Созданы файлы systemd для автоматического обновления сертификатов: letsencrypt-regru.service и letsencrypt-regru.timer.
Обновлен файл README.md с новыми разделами и улучшенной структурой.
This commit is contained in:
Dmitriy Fofanov
2025-10-28 10:25:10 +03:00
parent 7619f98615
commit 7c929bb5dc
6 changed files with 1192 additions and 12 deletions

518
letsencrypt_regru.sh Normal file
View File

@@ -0,0 +1,518 @@
#!/usr/bin/env bash
# ==============================================================================
# Скрипт автоматической установки Let's Encrypt Manager для reg.ru
# Автор: Фофанов Дмитрий
# Дата: 28.10.2025
# ==============================================================================
set -euo pipefail
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Конфигурация по умолчанию
APP_NAME="Let's Encrypt Manager"
APP_DIR="/opt/letsencrypt-regru"
CONFIG_DIR="/etc/letsencrypt-regru"
LOG_DIR="/var/log/letsencrypt-regru"
CERT_DIR="/etc/letsencrypt/live"
VENV_DIR="${APP_DIR}/venv"
PYTHON_VERSION="3"
# ==============================================================================
# Вспомогательные функции
# ==============================================================================
msg_info() {
echo -e "${BLUE} ${NC}$1"
}
msg_ok() {
echo -e "${GREEN}${NC} $1"
}
msg_error() {
echo -e "${RED}${NC} $1"
}
msg_warn() {
echo -e "${YELLOW}${NC} $1"
}
header() {
echo ""
echo -e "${CYAN}════════════════════════════════════════════════════════════════${NC}"
echo -e "${CYAN} $1${NC}"
echo -e "${CYAN}════════════════════════════════════════════════════════════════${NC}"
echo ""
}
# Проверка запуска от root
check_root() {
if [[ $EUID -ne 0 ]]; then
msg_error "Этот скрипт должен быть запущен от имени root"
msg_info "Используйте: sudo $0"
exit 1
fi
}
# Определение дистрибутива
detect_os() {
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$ID
VER=$VERSION_ID
else
msg_error "Не удалось определить операционную систему"
exit 1
fi
msg_info "Обнаружена ОС: $OS $VER"
}
# Проверка доступных ресурсов
check_resources() {
local total_ram=$(free -m | awk 'NR==2{print $2}')
local available_disk=$(df -m / | awk 'NR==2{print $4}')
msg_info "Доступно RAM: ${total_ram}MB, Свободно на диске: ${available_disk}MB"
if [ "$total_ram" -lt 512 ]; then
msg_warn "Рекомендуется минимум 512MB RAM"
fi
if [ "$available_disk" -lt 1024 ]; then
msg_warn "Рекомендуется минимум 1GB свободного места"
fi
}
# Установка зависимостей
install_dependencies() {
header "Установка зависимостей"
case $OS in
ubuntu|debian)
msg_info "Обновление списка пакетов..."
apt-get update -qq
msg_info "Установка базовых пакетов..."
apt-get install -y -qq \
python3 \
python3-pip \
python3-venv \
python3-dev \
build-essential \
libssl-dev \
libffi-dev \
curl \
git \
dnsutils \
certbot \
openssl
;;
centos|rhel|fedora)
msg_info "Обновление списка пакетов..."
yum update -y -q
msg_info "Установка базовых пакетов..."
yum install -y -q \
python3 \
python3-pip \
python3-devel \
gcc \
openssl-devel \
libffi-devel \
curl \
git \
bind-utils \
certbot \
openssl
;;
*)
msg_error "Неподдерживаемая ОС: $OS"
exit 1
;;
esac
msg_ok "Зависимости установлены"
}
# Создание структуры директорий
create_directories() {
header "Создание директорий"
msg_info "Создание структуры директорий..."
mkdir -p "$APP_DIR"
mkdir -p "$CONFIG_DIR"
mkdir -p "$LOG_DIR"
mkdir -p "$CERT_DIR"
chmod 755 "$APP_DIR"
chmod 750 "$CONFIG_DIR"
chmod 755 "$LOG_DIR"
chmod 755 "$CERT_DIR"
msg_ok "Директории созданы"
}
# Создание виртуального окружения Python
setup_python_venv() {
header "Настройка Python окружения"
msg_info "Создание виртуального окружения..."
python3 -m venv "$VENV_DIR"
msg_info "Активация виртуального окружения..."
source "${VENV_DIR}/bin/activate"
msg_info "Обновление pip..."
pip install --quiet --upgrade pip setuptools wheel
msg_info "Установка Python зависимостей..."
pip install --quiet requests cryptography certbot
msg_ok "Python окружение настроено"
}
# Копирование файлов приложения
install_application() {
header "Установка приложения"
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
msg_info "Копирование основного скрипта..."
cp "${script_dir}/letsencrypt_regru_api.py" "${APP_DIR}/"
chmod 755 "${APP_DIR}/letsencrypt_regru_api.py"
msg_info "Копирование файлов конфигурации..."
if [ -f "${script_dir}/config.json.example" ]; then
cp "${script_dir}/config.json.example" "${CONFIG_DIR}/"
fi
msg_info "Копирование документации..."
if [ -d "${script_dir}/docs" ]; then
cp -r "${script_dir}/docs" "${APP_DIR}/"
fi
msg_ok "Приложение установлено"
}
# Создание конфигурационного файла
create_config() {
header "Создание конфигурации"
local config_file="${CONFIG_DIR}/config.json"
if [ -f "$config_file" ]; then
msg_warn "Файл конфигурации уже существует: $config_file"
read -p "Перезаписать? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
msg_info "Пропуск создания конфигурации"
return
fi
fi
msg_info "Интерактивная настройка конфигурации..."
echo ""
read -p "Введите ваш домен (например, example.com): " domain
read -p "Введите email для уведомлений Let's Encrypt: " email
read -p "Введите имя пользователя reg.ru: " regru_user
read -s -p "Введите пароль reg.ru: " regru_pass
echo ""
read -p "Создать wildcard сертификат (*.${domain})? (Y/n): " -n 1 -r
echo ""
wildcard="true"
if [[ $REPLY =~ ^[Nn]$ ]]; then
wildcard="false"
fi
read -p "Включить интеграцию с Nginx Proxy Manager? (y/N): " -n 1 -r
echo ""
npm_enabled="false"
npm_host="http://192.168.10.14:81"
npm_email="admin@example.com"
npm_password="changeme"
if [[ $REPLY =~ ^[Yy]$ ]]; then
npm_enabled="true"
read -p "Введите адрес NPM (например, http://192.168.10.14:81): " npm_host
read -p "Введите email для входа в NPM: " npm_email
read -s -p "Введите пароль NPM: " npm_password
echo ""
fi
cat > "$config_file" <<EOF
{
"regru_username": "${regru_user}",
"regru_password": "${regru_pass}",
"domain": "${domain}",
"wildcard": ${wildcard},
"email": "${email}",
"cert_dir": "${CERT_DIR}",
"log_file": "${LOG_DIR}/letsencrypt_regru.log",
"dns_propagation_wait": 60,
"dns_check_attempts": 10,
"dns_check_interval": 10,
"renewal_days": 30,
"npm_enabled": ${npm_enabled},
"npm_host": "${npm_host}",
"npm_email": "${npm_email}",
"npm_password": "${npm_password}"
}
EOF
chmod 600 "$config_file"
msg_ok "Конфигурация создана: $config_file"
}
# Создание systemd сервиса для автоматического обновления
create_systemd_service() {
header "Настройка systemd сервиса"
msg_info "Создание systemd service..."
cat > /etc/systemd/system/letsencrypt-regru.service <<EOF
[Unit]
Description=Let's Encrypt Certificate Manager for reg.ru
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
User=root
WorkingDirectory=${APP_DIR}
ExecStart=${VENV_DIR}/bin/python ${APP_DIR}/letsencrypt_regru_api.py --config ${CONFIG_DIR}/config.json --auto
StandardOutput=journal
StandardError=journal
SyslogIdentifier=letsencrypt-regru
[Install]
WantedBy=multi-user.target
EOF
msg_info "Создание systemd timer для автоматической проверки..."
cat > /etc/systemd/system/letsencrypt-regru.timer <<EOF
[Unit]
Description=Let's Encrypt Certificate Auto-Renewal Timer
Requires=letsencrypt-regru.service
[Timer]
OnBootSec=15min
OnUnitActiveSec=12h
RandomizedDelaySec=1h
Persistent=true
[Install]
WantedBy=timers.target
EOF
msg_info "Перезагрузка systemd..."
systemctl daemon-reload
msg_info "Включение timer..."
systemctl enable letsencrypt-regru.timer
systemctl start letsencrypt-regru.timer
msg_ok "Systemd сервис настроен и запущен"
}
# Создание удобных алиасов
create_aliases() {
header "Создание алиасов команд"
msg_info "Создание символической ссылки для команды..."
cat > /usr/local/bin/letsencrypt-regru <<EOF
#!/bin/bash
${VENV_DIR}/bin/python ${APP_DIR}/letsencrypt_regru_api.py --config ${CONFIG_DIR}/config.json "\$@"
EOF
chmod +x /usr/local/bin/letsencrypt-regru
msg_ok "Команда 'letsencrypt-regru' доступна глобально"
}
# Тестовая генерация сертификата
test_certificate() {
header "Тестирование генерации сертификата"
read -p "Хотите сгенерировать тестовый самоподписанный сертификат? (Y/n): " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Nn]$ ]]; then
msg_info "Генерация тестового сертификата..."
${VENV_DIR}/bin/python ${APP_DIR}/letsencrypt_regru_api.py \
--config ${CONFIG_DIR}/config.json \
--test-cert
if [ $? -eq 0 ]; then
msg_ok "Тестовый сертификат успешно создан"
else
msg_error "Ошибка при создании тестового сертификата"
fi
fi
}
# Вывод итоговой информации
display_summary() {
header "Установка завершена!"
echo -e "${GREEN}${APP_NAME} успешно установлен!${NC}"
echo ""
echo "📁 Расположение файлов:"
echo " • Приложение: ${APP_DIR}"
echo " • Конфигурация: ${CONFIG_DIR}/config.json"
echo " • Логи: ${LOG_DIR}"
echo " • Сертификаты: ${CERT_DIR}"
echo ""
echo "🔧 Доступные команды:"
echo " • letsencrypt-regru --check # Проверить срок действия"
echo " • letsencrypt-regru --obtain # Получить новый сертификат"
echo " • letsencrypt-regru --renew # Обновить сертификат"
echo " • letsencrypt-regru --test-cert # Создать тестовый сертификат"
echo " • letsencrypt-regru --auto # Автоматическая проверка и обновление"
echo ""
echo "⏰ Автоматическое обновление:"
echo " • Сервис запускается каждые 12 часов"
echo " • Управление: systemctl status letsencrypt-regru.timer"
echo ""
echo "📊 Просмотр логов:"
echo " • journalctl -u letsencrypt-regru -f"
echo " • tail -f ${LOG_DIR}/letsencrypt_regru.log"
echo ""
echo "📖 Документация:"
echo " • README: ${APP_DIR}/README.md"
echo " • Docs: ${APP_DIR}/docs/"
echo ""
if grep -q '"npm_enabled": true' "${CONFIG_DIR}/config.json" 2>/dev/null; then
echo "🔗 Интеграция с Nginx Proxy Manager: ВКЛЮЧЕНА"
echo " Сертификаты будут автоматически синхронизироваться с NPM"
echo ""
fi
msg_warn "ВАЖНО: Отредактируйте конфигурацию при необходимости:"
echo " nano ${CONFIG_DIR}/config.json"
echo ""
}
# Функция обновления
update_application() {
header "Обновление приложения"
msg_info "Остановка сервиса..."
systemctl stop letsencrypt-regru.timer || true
msg_info "Обновление файлов..."
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cp "${script_dir}/letsencrypt_regru_api.py" "${APP_DIR}/"
chmod 755 "${APP_DIR}/letsencrypt_regru_api.py"
msg_info "Обновление Python зависимостей..."
source "${VENV_DIR}/bin/activate"
pip install --quiet --upgrade requests cryptography certbot
msg_info "Перезапуск сервиса..."
systemctl daemon-reload
systemctl start letsencrypt-regru.timer
msg_ok "Приложение обновлено"
}
# Функция удаления
uninstall_application() {
header "Удаление приложения"
msg_warn "ВНИМАНИЕ: Это удалит все файлы приложения"
msg_warn "Сертификаты в ${CERT_DIR} будут сохранены"
echo ""
read -p "Продолжить удаление? (y/N): " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
msg_info "Отмена удаления"
exit 0
fi
msg_info "Остановка и отключение сервисов..."
systemctl stop letsencrypt-regru.timer || true
systemctl disable letsencrypt-regru.timer || true
msg_info "Удаление systemd файлов..."
rm -f /etc/systemd/system/letsencrypt-regru.service
rm -f /etc/systemd/system/letsencrypt-regru.timer
systemctl daemon-reload
msg_info "Удаление файлов приложения..."
rm -rf "$APP_DIR"
rm -f /usr/local/bin/letsencrypt-regru
msg_info "Удаление конфигурации и логов..."
read -p "Удалить конфигурацию и логи? (y/N): " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Yy]$ ]]; then
rm -rf "$CONFIG_DIR"
rm -rf "$LOG_DIR"
fi
msg_ok "Приложение удалено"
}
# ==============================================================================
# Основная логика
# ==============================================================================
main() {
clear
header "${APP_NAME} - Установка"
# Проверка аргументов
case "${1:-install}" in
install)
check_root
detect_os
check_resources
install_dependencies
create_directories
setup_python_venv
install_application
create_config
create_systemd_service
create_aliases
test_certificate
display_summary
;;
update)
check_root
update_application
msg_ok "Обновление завершено"
;;
uninstall)
check_root
uninstall_application
;;
*)
echo "Использование: $0 {install|update|uninstall}"
echo ""
echo " install - Установить приложение (по умолчанию)"
echo " update - Обновить приложение"
echo " uninstall - Удалить приложение"
exit 1
;;
esac
}
# Запуск
main "${@}"