From 7c929bb5dc08fcf484200f67e41fe47d729b5f35 Mon Sep 17 00:00:00 2001 From: Dmitriy Fofanov Date: Tue, 28 Oct 2025 10:25:10 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D1=80=D1=83=D0=BA=D0=BE=D0=B2=D0=BE=D0=B4=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=BE=20=D0=BF=D0=BE=20=D0=B8=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8E=20letsen?= =?UTF-8?q?crypt=5Fregru.sh:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=88=D0=B0=D0=B3=D0=B8=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D1=81=D0=BA=D0=BE=D0=B9=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8=20=D0=B8=20=D0=BD=D0=B0=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D0=BA=D0=B8=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F,=20=D0=B0=20=D1=82=D0=B0=D0=BA=D0=B6?= =?UTF-8?q?=D0=B5=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20=D1=84=D0=B0=D0=B9=D0=BB=20INS?= =?UTF-8?q?TALL=5FGUIDE.md=20=D1=81=20=D0=BF=D0=BE=D0=B4=D1=80=D0=BE=D0=B1?= =?UTF-8?q?=D0=BD=D1=8B=D0=BC=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=D0=BC=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B8=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F.=20=D0=9E=D0=B1=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF?= =?UTF-8?q?=D1=82=20letsencrypt=5Fregru.sh:=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D1=83=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B5=D0=B9,=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BA=D0=BE=D0=BD=D1=84?= =?UTF-8?q?=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B8=20system?= =?UTF-8?q?d=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0.=20=D0=A1=D0=BE?= =?UTF-8?q?=D0=B7=D0=B4=D0=B0=D0=BD=D1=8B=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B?= =?UTF-8?q?=20systemd=20=D0=B4=D0=BB=D1=8F=20=D0=B0=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=81=D0=B5=D1=80=D1=82=D0=B8=D1=84=D0=B8=D0=BA=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D0=B2:=20letsencrypt-regru.service=20=D0=B8=20lets?= =?UTF-8?q?encrypt-regru.timer.=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=84=D0=B0=D0=B9=D0=BB=20README.md=20=D1=81=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D0=BC=D0=B8=20=D1=80=D0=B0=D0=B7=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B0=D0=BC=D0=B8=20=D0=B8=20=D1=83=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D1=88=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D1=83=D0=BA=D1=82=D1=83=D1=80=D0=BE=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 124 ++++++- docs/INSTALL_GUIDE.md | 348 ++++++++++++++++++++ letsencrypt_regru.sh | 518 ++++++++++++++++++++++++++++++ nginxproxymanager.sh | 179 +++++++++++ systemd/letsencrypt-regru.service | 16 + systemd/letsencrypt-regru.timer | 19 ++ 6 files changed, 1192 insertions(+), 12 deletions(-) create mode 100644 docs/INSTALL_GUIDE.md create mode 100644 letsencrypt_regru.sh create mode 100644 nginxproxymanager.sh create mode 100644 systemd/letsencrypt-regru.service create mode 100644 systemd/letsencrypt-regru.timer diff --git a/README.md b/README.md index 0af7f2e..384861f 100644 --- a/README.md +++ b/README.md @@ -15,18 +15,19 @@ Python скрипт теперь автоматически загружает ## Содержание 1. [Введение](#введение) -2. [Быстрый старт](#-быстрый-старт) -3. [Установка через Makefile](#-установка-через-makefile) -4. [Создание тестовых сертификатов](#-создание-тестового-самоподписанного-сертификата) -5. [Требования](#требования) -6. [Установка зависимостей](#установка-зависимостей) -7. [Настройка](#настройка) -8. [Использование Bash скрипта](#использование-bash-скрипта) -9. [Использование Python скрипта](#использование-python-скрипта) -10. [Интеграция с Nginx Proxy Manager](#интеграция-с-nginx-proxy-manager) -11. [Автоматическая проверка и обновление сертификатов](#автоматическая-проверка-и-обновление-сертификатов) -12. [Автоматизация обновления](#автоматизация-обновления) -13. [Устранение неполадок](#устранение-неполадок) +2. [⚡ Быстрая установка (letsencrypt_regru.sh)](#-быстрая-установка-letsencrypt_regrush) +3. [Быстрый старт](#-быстрый-старт) +4. [Установка через Makefile](#-установка-через-makefile) +5. [Создание тестовых сертификатов](#-создание-тестового-самоподписанного-сертификата) +6. [Требования](#требования) +7. [Установка зависимостей](#установка-зависимостей) +8. [Настройка](#настройка) +9. [Использование Bash скрипта](#использование-bash-скрипта) +10. [Использование Python скрипта](#использование-python-скрипта) +11. [Интеграция с Nginx Proxy Manager](#интеграция-с-nginx-proxy-manager) +12. [Автоматическая проверка и обновление сертификатов](#автоматическая-проверка-и-обновление-сертификатов) +13. [Автоматизация обновления](#автоматизация-обновления) +14. [Устранение неполадок](#устранение-неполадок) --- @@ -51,6 +52,105 @@ Python скрипт теперь автоматически загружает --- +## ⚡ Быстрая установка (letsencrypt_regru.sh) + +**Автоматическая установка всего приложения одной командой!** + +Скрипт `letsencrypt_regru.sh` автоматизирует весь процесс развертывания: +- ✅ Установка всех зависимостей (Python, certbot, библиотеки) +- ✅ Создание виртуального окружения Python +- ✅ Интерактивная настройка конфигурации +- ✅ Настройка systemd для автоматического обновления +- ✅ Создание удобных команд + +### Установка + +```bash +# 1. Клонируйте репозиторий +git clone https://github.com/YOUR_USERNAME/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`: + +```bash +# Проверить срок действия сертификата +letsencrypt-regru --check + +# Получить новый сертификат Let's Encrypt +letsencrypt-regru --obtain + +# Обновить существующий сертификат +letsencrypt-regru --renew + +# Создать тестовый самоподписанный сертификат +letsencrypt-regru --test-cert + +# Автоматическая проверка и обновление при необходимости +letsencrypt-regru --auto +``` + +### Автоматическое обновление + +Скрипт установки настраивает автоматическую проверку сертификатов каждые 12 часов: + +```bash +# Проверить статус автообновления +systemctl status letsencrypt-regru.timer + +# Посмотреть логи +journalctl -u letsencrypt-regru -f + +# Или в файле +tail -f /var/log/letsencrypt-regru/letsencrypt_regru.log +``` + +### Управление установкой + +```bash +# Обновить приложение до последней версии +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` | + +### Редактирование конфигурации + +```bash +# Отредактировать настройки +sudo nano /etc/letsencrypt-regru/config.json + +# Перезапустить таймер после изменений +sudo systemctl restart letsencrypt-regru.timer +``` + +--- + ## 🚀 Установка через Makefile **Самый быстрый способ установки на Linux!** diff --git a/docs/INSTALL_GUIDE.md b/docs/INSTALL_GUIDE.md new file mode 100644 index 0000000..0709a3d --- /dev/null +++ b/docs/INSTALL_GUIDE.md @@ -0,0 +1,348 @@ +# Руководство по использованию letsencrypt_regru.sh + +**Автор:** Фофанов Дмитрий +**Дата:** 28.10.2025 + +## Описание + +`letsencrypt_regru.sh` - это автоматический установщик для Let's Encrypt Manager с интеграцией reg.ru и Nginx Proxy Manager. + +Скрипт автоматизирует: +- Установку всех системных зависимостей +- Создание виртуального окружения Python +- Установку Python библиотек (requests, cryptography, certbot) +- Интерактивную настройку конфигурации +- Создание и настройку systemd сервисов +- Настройку автоматического обновления сертификатов + +## Требования + +- Linux (Debian/Ubuntu, CentOS/RHEL/Fedora) +- Root доступ (sudo) +- Минимум 512MB RAM +- Минимум 1GB свободного места на диске +- Интернет соединение + +## Быстрая установка + +```bash +# 1. Скачайте репозиторий +git clone https://github.com/YOUR_USERNAME/configure_nginx_manager.git +cd configure_nginx_manager + +# 2. Дайте права на выполнение +chmod +x letsencrypt_regru.sh + +# 3. Запустите установку +sudo ./letsencrypt_regru.sh +``` + +## Интерактивная настройка + +Во время установки скрипт спросит: + +1. **Домен** - ваш основной домен (например, `example.com`) +2. **Email** - для уведомлений Let's Encrypt +3. **Учетные данные reg.ru:** + - Имя пользователя + - Пароль +4. **Wildcard сертификат** - создавать ли `*.example.com` (рекомендуется: Да) +5. **Интеграция с NPM** (опционально): + - Адрес NPM (например, `http://192.168.10.14:81`) + - Email для входа в NPM + - Пароль NPM + +## Структура после установки + +``` +/opt/letsencrypt-regru/ # Приложение +├── letsencrypt_regru_api.py # Основной скрипт +├── venv/ # Виртуальное окружение Python +└── docs/ # Документация + +/etc/letsencrypt-regru/ # Конфигурация +└── config.json # Настройки (credentials, домен, NPM) + +/var/log/letsencrypt-regru/ # Логи +└── letsencrypt_regru.log + +/etc/letsencrypt/live/ # Сертификаты Let's Encrypt +└── example.com/ + ├── privkey.pem + ├── cert.pem + ├── chain.pem + └── fullchain.pem + +/etc/systemd/system/ # Systemd сервисы +├── letsencrypt-regru.service # Сервис обновления +└── letsencrypt-regru.timer # Таймер (каждые 12 часов) + +/usr/local/bin/ +└── letsencrypt-regru # Глобальная команда +``` + +## Использование команды letsencrypt-regru + +После установки доступна удобная команда: + +```bash +# Проверить срок действия текущего сертификата +letsencrypt-regru --check + +# Получить новый сертификат Let's Encrypt +letsencrypt-regru --obtain + +# Обновить существующий сертификат +letsencrypt-regru --renew + +# Автоматически проверить и обновить при необходимости +letsencrypt-regru --auto + +# Создать тестовый самоподписанный сертификат +letsencrypt-regru --test-cert + +# Показать справку +letsencrypt-regru --help +``` + +## Автоматическое обновление + +Установщик настраивает systemd timer для автоматической проверки: + +```bash +# Проверить статус таймера +systemctl status letsencrypt-regru.timer + +# Когда следующий запуск +systemctl list-timers letsencrypt-regru.timer + +# Посмотреть историю запусков +journalctl -u letsencrypt-regru + +# Следить за логами в реальном времени +journalctl -u letsencrypt-regru -f +``` + +### Настройки таймера + +По умолчанию: +- Первый запуск: через 15 минут после загрузки системы +- Периодичность: каждые 12 часов +- Случайная задержка: до 1 часа (чтобы не создавать нагрузку) + +Изменить можно в `/etc/systemd/system/letsencrypt-regru.timer`. + +## Редактирование конфигурации + +```bash +# Открыть конфигурацию в редакторе +sudo nano /etc/letsencrypt-regru/config.json + +# После изменений перезапустите таймер +sudo systemctl restart letsencrypt-regru.timer +``` + +### Пример config.json + +```json +{ + "regru_username": "your_username", + "regru_password": "your_password", + "domain": "example.com", + "wildcard": true, + "email": "admin@example.com", + "cert_dir": "/etc/letsencrypt/live", + "log_file": "/var/log/letsencrypt-regru/letsencrypt_regru.log", + "dns_propagation_wait": 60, + "dns_check_attempts": 10, + "dns_check_interval": 10, + "renewal_days": 30, + "npm_enabled": true, + "npm_host": "http://192.168.10.14:81", + "npm_email": "admin@npm.local", + "npm_password": "secure_password" +} +``` + +## Обновление приложения + +```bash +# Скачайте последнюю версию +cd configure_nginx_manager +git pull + +# Запустите обновление +sudo ./letsencrypt_regru.sh update +``` + +Обновление: +- Остановит таймер +- Обновит скрипт +- Обновит Python зависимости +- Перезапустит таймер + +## Удаление + +```bash +# Полное удаление приложения +sudo ./letsencrypt_regru.sh uninstall +``` + +Скрипт удалит: +- Приложение из `/opt/letsencrypt-regru/` +- Systemd сервисы +- Глобальную команду + +Сертификаты в `/etc/letsencrypt/live/` сохраняются! + +Опционально можно удалить: +- Конфигурацию `/etc/letsencrypt-regru/` +- Логи `/var/log/letsencrypt-regru/` + +## Просмотр логов + +```bash +# Логи systemd (рекомендуется) +journalctl -u letsencrypt-regru -f + +# Файл лога +tail -f /var/log/letsencrypt-regru/letsencrypt_regru.log + +# Последние 100 строк +tail -n 100 /var/log/letsencrypt-regru/letsencrypt_regru.log +``` + +## Устранение проблем + +### Проверка установки + +```bash +# Проверить наличие команды +which letsencrypt-regru + +# Проверить Python окружение +ls -la /opt/letsencrypt-regru/venv/ + +# Проверить systemd сервисы +systemctl list-unit-files | grep letsencrypt-regru +``` + +### Ошибки при установке + +**Ошибка: "Permission denied"** +```bash +# Запустите с sudo +sudo ./letsencrypt_regru.sh +``` + +**Ошибка: "Package not found"** +```bash +# Обновите списки пакетов +sudo apt-get update # Debian/Ubuntu +sudo yum update # CentOS/RHEL +``` + +**Ошибка: "Python module not found"** +```bash +# Переустановите виртуальное окружение +sudo rm -rf /opt/letsencrypt-regru/venv +sudo ./letsencrypt_regru.sh +``` + +### Проблемы с сертификатами + +**Сертификат не создается** +```bash +# Проверьте логи +tail -n 50 /var/log/letsencrypt-regru/letsencrypt_regru.log + +# Проверьте конфигурацию +cat /etc/letsencrypt-regru/config.json + +# Попробуйте вручную +letsencrypt-regru --obtain -v +``` + +**DNS не обновляется** +```bash +# Увеличьте время ожидания в config.json +"dns_propagation_wait": 120, +"dns_check_attempts": 20 +``` + +### Проблемы с NPM + +**Не загружается в NPM** +```bash +# Проверьте доступность NPM +curl http://192.168.10.14:81 + +# Проверьте учетные данные в config.json +# Попробуйте вручную +letsencrypt-regru --test-cert -v +``` + +## Поддерживаемые ОС + +✅ Debian 10, 11, 12 +✅ Ubuntu 20.04, 22.04, 24.04 +✅ CentOS 7, 8 +✅ RHEL 7, 8, 9 +✅ Fedora 35+ + +## Дополнительные возможности + +### Тестовый сертификат + +Для тестирования без лимитов Let's Encrypt: + +```bash +letsencrypt-regru --test-cert +``` + +Создаст самоподписанный сертификат на 90 дней. + +### Ручной запуск обновления + +```bash +# Запустить сервис вручную +sudo systemctl start letsencrypt-regru.service + +# Посмотреть статус +systemctl status letsencrypt-regru.service +``` + +### Изменить периодичность проверки + +Отредактируйте `/etc/systemd/system/letsencrypt-regru.timer`: + +```ini +[Timer] +# Каждые 6 часов вместо 12 +OnUnitActiveSec=6h +``` + +Затем: +```bash +sudo systemctl daemon-reload +sudo systemctl restart letsencrypt-regru.timer +``` + +## Безопасность + +- Конфигурация с паролями имеет права `600` (только root) +- Приватные ключи сертификатов имеют права `600` +- Все операции выполняются от root +- Логи доступны только root + +## Поддержка + +- GitHub Issues: https://github.com/YOUR_USERNAME/configure_nginx_manager/issues +- Документация: `/opt/letsencrypt-regru/docs/` +- Email: admin@dfv24.com + +--- + +**Разработано:** Фофанов Дмитрий +**Дата:** 28.10.2025 +**Версия:** 2.0 diff --git a/letsencrypt_regru.sh b/letsencrypt_regru.sh new file mode 100644 index 0000000..ce81f2f --- /dev/null +++ b/letsencrypt_regru.sh @@ -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" < /etc/systemd/system/letsencrypt-regru.service < /etc/systemd/system/letsencrypt-regru.timer < /usr/local/bin/letsencrypt-regru </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 "${@}" diff --git a/nginxproxymanager.sh b/nginxproxymanager.sh new file mode 100644 index 0000000..d639f1f --- /dev/null +++ b/nginxproxymanager.sh @@ -0,0 +1,179 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://nginxproxymanager.com/ + +APP="Nginx Proxy Manager" +var_tags="${var_tags:-proxy}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-1024}" +var_disk="${var_disk:-4}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /lib/systemd/system/npm.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if command -v node &> /dev/null; then + CURRENT_NODE_VERSION=$(node --version | cut -d'v' -f2 | cut -d'.' -f1) + if [[ "$CURRENT_NODE_VERSION" != "22" ]]; then + systemctl stop openresty + apt-get purge -y nodejs npm + apt-get autoremove -y + rm -rf /usr/local/bin/node /usr/local/bin/npm + rm -rf /usr/local/lib/node_modules + rm -rf ~/.npm + rm -rf /root/.npm + fi + fi + + NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs + export NODE_OPTIONS="--openssl-legacy-provider" + + RELEASE=$(curl -fsSL https://api.github.com/repos/NginxProxyManager/nginx-proxy-manager/releases/latest | + grep "tag_name" | + awk '{print substr($2, 3, length($2)-4) }') + + msg_info "Downloading NPM v${RELEASE}" + curl -fsSL "https://codeload.github.com/NginxProxyManager/nginx-proxy-manager/tar.gz/v${RELEASE}" | tar -xz + cd nginx-proxy-manager-"${RELEASE}" || exit + msg_ok "Downloaded NPM v${RELEASE}" + + msg_info "Building Frontend" + ( + sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" backend/package.json + sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" frontend/package.json + cd ./frontend || exit + # Replace node-sass with sass in package.json before installation + sed -i 's/"node-sass".*$/"sass": "^1.92.1",/g' package.json + $STD yarn install --network-timeout 600000 + $STD yarn build + ) + msg_ok "Built Frontend" + + msg_info "Stopping Services" + systemctl stop openresty + systemctl stop npm + msg_ok "Stopped Services" + + msg_info "Cleaning Old Files" + rm -rf /app \ + /var/www/html \ + /etc/nginx \ + /var/log/nginx \ + /var/lib/nginx \ + "$STD" /var/cache/nginx + msg_ok "Cleaned Old Files" + + msg_info "Setting up Environment" + ln -sf /usr/bin/python3 /usr/bin/python + ln -sf /opt/certbot/bin/certbot /usr/local/bin/certbot + ln -sf /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx + ln -sf /usr/local/openresty/nginx/ /etc/nginx + sed -i 's+^daemon+#daemon+g' docker/rootfs/etc/nginx/nginx.conf + NGINX_CONFS=$(find "$(pwd)" -type f -name "*.conf") + for NGINX_CONF in $NGINX_CONFS; do + sed -i 's+include conf.d+include /etc/nginx/conf.d+g' "$NGINX_CONF" + done + mkdir -p /var/www/html /etc/nginx/logs + cp -r docker/rootfs/var/www/html/* /var/www/html/ + cp -r docker/rootfs/etc/nginx/* /etc/nginx/ + cp docker/rootfs/etc/letsencrypt.ini /etc/letsencrypt.ini + cp docker/rootfs/etc/logrotate.d/nginx-proxy-manager /etc/logrotate.d/nginx-proxy-manager + ln -sf /etc/nginx/nginx.conf /etc/nginx/conf/nginx.conf + rm -f /etc/nginx/conf.d/dev.conf + mkdir -p /tmp/nginx/body \ + /run/nginx \ + /data/nginx \ + /data/custom_ssl \ + /data/logs \ + /data/access \ + /data/nginx/default_host \ + /data/nginx/default_www \ + /data/nginx/proxy_host \ + /data/nginx/redirection_host \ + /data/nginx/stream \ + /data/nginx/dead_host \ + /data/nginx/temp \ + /var/lib/nginx/cache/public \ + /var/lib/nginx/cache/private \ + /var/cache/nginx/proxy_temp + chmod -R 777 /var/cache/nginx + chown root /tmp/nginx + echo resolver "$(awk 'BEGIN{ORS=" "} $1=="nameserver" {print ($2 ~ ":")? "["$2"]": $2}' /etc/resolv.conf);" >/etc/nginx/conf.d/include/resolvers.conf + if [ ! -f /data/nginx/dummycert.pem ] || [ ! -f /data/nginx/dummykey.pem ]; then + $STD openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -subj "/O=Nginx Proxy Manager/OU=Dummy Certificate/CN=localhost" -keyout /data/nginx/dummykey.pem -out /data/nginx/dummycert.pem + fi + mkdir -p /app/global /app/frontend/images + cp -r frontend/dist/* /app/frontend + cp -r frontend/app-images/* /app/frontend/images + cp -r backend/* /app + cp -r global/* /app/global + + # Update Certbot and plugins in virtual environment + if [ -d /opt/certbot ]; then + $STD /opt/certbot/bin/pip install --upgrade pip setuptools wheel + $STD /opt/certbot/bin/pip install --upgrade certbot certbot-dns-cloudflare + fi + msg_ok "Setup Environment" + + msg_info "Initializing Backend" + $STD rm -rf /app/config/default.json + if [ ! -f /app/config/production.json ]; then + cat <<'EOF' >/app/config/production.json +{ + "database": { + "engine": "knex-native", + "knex": { + "client": "sqlite3", + "connection": { + "filename": "/data/database.sqlite" + } + } + } +} +EOF + fi + cd /app || exit + export NODE_OPTIONS="--openssl-legacy-provider" + $STD yarn install --network-timeout 600000 + msg_ok "Initialized Backend" + + msg_info "Starting Services" + sed -i 's/user npm/user root/g; s/^pid/#pid/g' /usr/local/openresty/nginx/conf/nginx.conf + sed -i 's/su npm npm/su root root/g' /etc/logrotate.d/nginx-proxy-manager + sed -i 's/include-system-site-packages = false/include-system-site-packages = true/g' /opt/certbot/pyvenv.cfg + systemctl enable -q --now openresty + systemctl enable -q --now npm + msg_ok "Started Services" + + msg_info "Cleaning up" + rm -rf ~/nginx-proxy-manager-* + msg_ok "Cleaned" + + msg_ok "Updated Successfully" + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:81${CL}" diff --git a/systemd/letsencrypt-regru.service b/systemd/letsencrypt-regru.service new file mode 100644 index 0000000..7316ec3 --- /dev/null +++ b/systemd/letsencrypt-regru.service @@ -0,0 +1,16 @@ +[Unit] +Description=Let's Encrypt Certificate Manager for reg.ru +After=network-online.target +Wants=network-online.target + +[Service] +Type=oneshot +User=root +WorkingDirectory=/opt/letsencrypt-regru +ExecStart=/opt/letsencrypt-regru/venv/bin/python /opt/letsencrypt-regru/letsencrypt_regru_api.py --config /etc/letsencrypt-regru/config.json --auto +StandardOutput=journal +StandardError=journal +SyslogIdentifier=letsencrypt-regru + +[Install] +WantedBy=multi-user.target diff --git a/systemd/letsencrypt-regru.timer b/systemd/letsencrypt-regru.timer new file mode 100644 index 0000000..eaff9e0 --- /dev/null +++ b/systemd/letsencrypt-regru.timer @@ -0,0 +1,19 @@ +[Unit] +Description=Let's Encrypt Certificate Auto-Renewal Timer +Requires=letsencrypt-regru.service + +[Timer] +# Запустить через 15 минут после загрузки системы +OnBootSec=15min + +# Запускать каждые 12 часов +OnUnitActiveSec=12h + +# Добавить случайную задержку до 1 часа +RandomizedDelaySec=1h + +# Сохранять информацию о последнем запуске +Persistent=true + +[Install] +WantedBy=timers.target