Дополнение: Добавлен скрипт управления DNS-сервером Let's Encrypt RegRu и связанные с ним службы systemd
- Реализован скрипт letsencrypt_regru_dns.sh для автоматического управления SSL-сертификатами с использованием проверки DNS-01 через API reg.ru. - Создан скрипт nginxproxymanager.sh для управления установкой и обновлениями Nginx Proxy Manager. - Добавлен файл requirements.txt с необходимыми зависимостями Python. - Внедрена служба systemd и таймер для автоматического обновления сертификатов Let's Encrypt. - Разработан скрипт test_certificate.sh для генерации самоподписанных SSL-сертификатов в целях тестирования.
This commit is contained in:
@@ -0,0 +1,330 @@
|
||||
# Настройка Gitea Actions для автоматической сборки
|
||||
|
||||
## 📋 Предварительные требования
|
||||
|
||||
### 1. Gitea с поддержкой Actions
|
||||
|
||||
Убедитесь, что ваш Gitea имеет включенные Actions:
|
||||
|
||||
```ini
|
||||
# В app.ini Gitea
|
||||
[actions]
|
||||
ENABLED = true
|
||||
DEFAULT_ACTIONS_URL = https://gitea.com
|
||||
```
|
||||
|
||||
### 2. Gitea Runner
|
||||
|
||||
Установите и настройте Gitea Act Runner:
|
||||
|
||||
```bash
|
||||
# Скачать runner
|
||||
wget https://dl.gitea.com/act_runner/latest/act_runner-linux-amd64 -O act_runner
|
||||
chmod +x act_runner
|
||||
|
||||
# Зарегистрировать runner
|
||||
./act_runner register --no-interactive \
|
||||
--instance https://your-gitea-instance.com \
|
||||
--token YOUR_RUNNER_TOKEN \
|
||||
--name my-runner
|
||||
|
||||
# Запустить runner
|
||||
./act_runner daemon
|
||||
```
|
||||
|
||||
Или через Docker:
|
||||
|
||||
```bash
|
||||
docker run -d \
|
||||
--name gitea-runner \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-v $PWD/runner-data:/data \
|
||||
-e GITEA_INSTANCE_URL=https://your-gitea-instance.com \
|
||||
-e GITEA_RUNNER_REGISTRATION_TOKEN=YOUR_TOKEN \
|
||||
gitea/act_runner:latest
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Использование
|
||||
|
||||
### Создание релиза автоматически
|
||||
|
||||
1. **Создайте и отправьте тег:**
|
||||
|
||||
```bash
|
||||
# Создать тег
|
||||
git tag -a v1.0.0 -m "Release version 1.0.0"
|
||||
|
||||
# Отправить тег на сервер
|
||||
git push origin v1.0.0
|
||||
```
|
||||
|
||||
2. **Gitea автоматически:**
|
||||
- Запустит workflow `.gitea/workflows/release.yml`
|
||||
- Соберет Linux версию на Ubuntu runner
|
||||
- Соберет Windows версию на Windows runner
|
||||
- Создаст релиз с артефактами
|
||||
- Добавит контрольные суммы SHA256 и MD5
|
||||
|
||||
### Ручной запуск workflow
|
||||
|
||||
В веб-интерфейсе Gitea:
|
||||
|
||||
1. Перейдите в **Repository → Actions**
|
||||
2. Выберите workflow **Build and Release**
|
||||
3. Нажмите **Run workflow**
|
||||
4. Укажите версию (опционально)
|
||||
|
||||
---
|
||||
|
||||
## 📂 Структура workflows
|
||||
|
||||
```
|
||||
.gitea/
|
||||
└── workflows/
|
||||
├── build-release.yml # Простой workflow (совместим с GitHub)
|
||||
└── release.yml # Расширенный workflow с уведомлениями
|
||||
```
|
||||
|
||||
### build-release.yml
|
||||
|
||||
Базовый workflow, совместимый с GitHub Actions:
|
||||
- Сборка для Linux и Windows
|
||||
- Создание пакетов
|
||||
- Генерация контрольных сумм
|
||||
- Создание релиза
|
||||
|
||||
**Использование:**
|
||||
```bash
|
||||
git tag v1.0.0
|
||||
git push origin v1.0.0
|
||||
```
|
||||
|
||||
### release.yml
|
||||
|
||||
Расширенный workflow с дополнительными возможностями:
|
||||
- Детальные release notes
|
||||
- MD5 + SHA256 checksums
|
||||
- Уведомления после релиза
|
||||
- Поддержка ручного запуска
|
||||
|
||||
**Использование:**
|
||||
```bash
|
||||
# Автоматически при теге
|
||||
git tag v1.0.0
|
||||
git push origin v1.0.0
|
||||
|
||||
# Или вручную через веб-интерфейс
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Настройка
|
||||
|
||||
### Переменные окружения
|
||||
|
||||
Workflow использует следующие переменные:
|
||||
|
||||
| Переменная | Описание | Где установить |
|
||||
|------------|----------|----------------|
|
||||
| `GITEA_TOKEN` | Токен для создания релиза | Repository Secrets |
|
||||
| `GITHUB_TOKEN` | Автоматически (fallback) | Встроенный |
|
||||
|
||||
### Создание GITEA_TOKEN
|
||||
|
||||
1. В Gitea: **Settings → Applications → Generate New Token**
|
||||
2. Выберите права: `repo`, `write:packages`
|
||||
3. Скопируйте токен
|
||||
4. В репозитории: **Settings → Secrets → Add Secret**
|
||||
- Name: `GITEA_TOKEN`
|
||||
- Value: ваш токен
|
||||
|
||||
---
|
||||
|
||||
## 📦 Артефакты релиза
|
||||
|
||||
После успешной сборки в релизе будут доступны:
|
||||
|
||||
```
|
||||
letsencrypt-regru-linux-x86_64.tar.gz
|
||||
letsencrypt-regru-linux-x86_64.tar.gz.sha256
|
||||
letsencrypt-regru-linux-x86_64.tar.gz.md5
|
||||
letsencrypt-regru-windows-x86_64.zip
|
||||
letsencrypt-regru-windows-x86_64.zip.sha256
|
||||
letsencrypt-regru-windows-x86_64.zip.md5
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
### Workflow не запускается
|
||||
|
||||
**Проблема:** После push тега workflow не запускается
|
||||
|
||||
**Решение:**
|
||||
1. Проверьте, что Actions включены в настройках репозитория
|
||||
2. Проверьте `.gitea/workflows/*.yml` на синтаксические ошибки
|
||||
3. Убедитесь, что runner зарегистрирован и запущен
|
||||
|
||||
```bash
|
||||
# Проверить статус runner
|
||||
./act_runner status
|
||||
|
||||
# Посмотреть логи runner
|
||||
./act_runner daemon --debug
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Ошибка при сборке Windows
|
||||
|
||||
**Проблема:** `make: command not found` на Windows
|
||||
|
||||
**Решение:**
|
||||
|
||||
Установите Make для Windows или используйте альтернативный workflow:
|
||||
|
||||
```yaml
|
||||
- name: Build Windows executable (без make)
|
||||
run: |
|
||||
pyinstaller --onefile --name letsencrypt-regru letsencrypt_regru_api.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Релиз создается без файлов
|
||||
|
||||
**Проблема:** Релиз создан, но артефакты отсутствуют
|
||||
|
||||
**Решение:**
|
||||
|
||||
Проверьте логи job `create-release`:
|
||||
|
||||
1. Перейдите в **Actions → Build and Release → create-release**
|
||||
2. Проверьте шаг "Download artifacts"
|
||||
3. Убедитесь, что предыдущие jobs (`build-linux`, `build-windows`) завершились успешно
|
||||
|
||||
---
|
||||
|
||||
### Permission denied при создании релиза
|
||||
|
||||
**Проблема:** `Error: Resource not accessible by integration`
|
||||
|
||||
**Решение:**
|
||||
|
||||
1. Проверьте права токена:
|
||||
- `GITEA_TOKEN` должен иметь права `repo` и `write:packages`
|
||||
|
||||
2. Или используйте встроенный `GITHUB_TOKEN`:
|
||||
- Убедитесь, что в настройках репозитория включены Actions
|
||||
|
||||
---
|
||||
|
||||
## 📊 Мониторинг сборок
|
||||
|
||||
### Просмотр логов
|
||||
|
||||
1. **Web UI:**
|
||||
- Repository → Actions
|
||||
- Выберите workflow run
|
||||
- Кликните на job для просмотра логов
|
||||
|
||||
2. **API:**
|
||||
```bash
|
||||
curl -H "Authorization: token YOUR_TOKEN" \
|
||||
https://your-gitea.com/api/v1/repos/USER/REPO/actions/runs
|
||||
```
|
||||
|
||||
### Статус badges
|
||||
|
||||
Добавьте в README.md:
|
||||
|
||||
```markdown
|
||||
[](https://your-gitea.com/USER/REPO/actions)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Автоматизация релизов
|
||||
|
||||
### Semantic Versioning
|
||||
|
||||
Используйте теги с семантическим версионированием:
|
||||
|
||||
```bash
|
||||
# Major release (несовместимые изменения)
|
||||
git tag v2.0.0
|
||||
|
||||
# Minor release (новые функции)
|
||||
git tag v1.1.0
|
||||
|
||||
# Patch release (исправления)
|
||||
git tag v1.0.1
|
||||
```
|
||||
|
||||
### Pre-release
|
||||
|
||||
Для тестовых релизов используйте suffix:
|
||||
|
||||
```bash
|
||||
git tag v1.0.0-beta.1
|
||||
git tag v1.0.0-rc.1
|
||||
```
|
||||
|
||||
В workflow автоматически будет установлен `prerelease: true` для таких тегов.
|
||||
|
||||
---
|
||||
|
||||
## 📝 Changelog автоматизация
|
||||
|
||||
### Использование conventional commits
|
||||
|
||||
```bash
|
||||
git commit -m "feat: добавлена поддержка wildcard сертификатов"
|
||||
git commit -m "fix: исправлена ошибка загрузки в NPM"
|
||||
git commit -m "docs: обновлена документация"
|
||||
```
|
||||
|
||||
### Генерация CHANGELOG.md
|
||||
|
||||
Добавьте в workflow:
|
||||
|
||||
```yaml
|
||||
- name: Generate Changelog
|
||||
run: |
|
||||
git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"- %s" > CHANGELOG.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Рекомендации
|
||||
|
||||
1. **Используйте теги только для стабильных релизов**
|
||||
- Тестируйте перед созданием тега
|
||||
- Проверяйте сборку локально: `make release`
|
||||
|
||||
2. **Проверяйте контрольные суммы**
|
||||
- Всегда включайте SHA256 и MD5
|
||||
- Документируйте процесс проверки для пользователей
|
||||
|
||||
3. **Версионирование**
|
||||
- Следуйте семантическому версионированию
|
||||
- Документируйте breaking changes
|
||||
|
||||
4. **Тестирование**
|
||||
- Запускайте workflow вручную перед тегированием
|
||||
- Проверяйте артефакты после сборки
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Полезные ссылки
|
||||
|
||||
- [Gitea Actions Documentation](https://docs.gitea.com/next/usage/actions/overview)
|
||||
- [Act Runner GitHub](https://github.com/nektos/act)
|
||||
- [Workflow Syntax](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions)
|
||||
|
||||
---
|
||||
|
||||
**Примечание:** Эти workflows совместимы с GitHub Actions и могут использоваться на обеих платформах.
|
||||
@@ -0,0 +1,211 @@
|
||||
name: Build Releases
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*' # Срабатывает на теги вида v1.0, v2.0.1 и т.д.
|
||||
workflow_dispatch: # Возможность запустить вручную
|
||||
|
||||
jobs:
|
||||
build-linux:
|
||||
name: Build Linux Executable
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.9'
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install pyinstaller
|
||||
pip install -r requirements.txt
|
||||
|
||||
- name: Build Linux executable
|
||||
run: |
|
||||
make build-linux
|
||||
|
||||
- name: Test Linux executable
|
||||
run: |
|
||||
chmod +x dist/letsencrypt-regru
|
||||
dist/letsencrypt-regru --help
|
||||
|
||||
- name: Create Linux package
|
||||
run: |
|
||||
make package-linux
|
||||
|
||||
- name: Upload Linux artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: linux-executable
|
||||
path: dist/letsencrypt-regru-linux-x86_64.tar.gz
|
||||
|
||||
- name: Generate SHA256 checksum
|
||||
run: |
|
||||
cd dist
|
||||
sha256sum letsencrypt-regru-linux-x86_64.tar.gz > letsencrypt-regru-linux-x86_64.tar.gz.sha256
|
||||
|
||||
- name: Upload checksum
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: linux-checksum
|
||||
path: dist/letsencrypt-regru-linux-x86_64.tar.gz.sha256
|
||||
|
||||
build-windows:
|
||||
name: Build Windows Executable
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.9'
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install pyinstaller
|
||||
pip install -r requirements.txt
|
||||
|
||||
- name: Build Windows executable
|
||||
run: |
|
||||
make build-windows
|
||||
|
||||
- name: Test Windows executable
|
||||
run: |
|
||||
dist\letsencrypt-regru.exe --help
|
||||
|
||||
- name: Create Windows package
|
||||
run: |
|
||||
make package-windows
|
||||
|
||||
- name: Upload Windows artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: windows-executable
|
||||
path: dist/letsencrypt-regru-windows-x86_64.zip
|
||||
|
||||
- name: Generate SHA256 checksum
|
||||
run: |
|
||||
cd dist
|
||||
certutil -hashfile letsencrypt-regru-windows-x86_64.zip SHA256 > letsencrypt-regru-windows-x86_64.zip.sha256
|
||||
|
||||
- name: Upload checksum
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: windows-checksum
|
||||
path: dist/letsencrypt-regru-windows-x86_64.zip.sha256
|
||||
|
||||
create-release:
|
||||
name: Create Gitea Release
|
||||
needs: [build-linux, build-windows]
|
||||
runs-on: ubuntu-latest
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Download Linux artifact
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: linux-executable
|
||||
path: ./artifacts
|
||||
|
||||
- name: Download Linux checksum
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: linux-checksum
|
||||
path: ./artifacts
|
||||
|
||||
- name: Download Windows artifact
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: windows-executable
|
||||
path: ./artifacts
|
||||
|
||||
- name: Download Windows checksum
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: windows-checksum
|
||||
path: ./artifacts
|
||||
|
||||
- name: Get tag name
|
||||
id: get_version
|
||||
run: echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Create Release
|
||||
uses: actions/gitea-release@v1
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
tag_name: ${{ steps.get_version.outputs.VERSION }}
|
||||
name: Let's Encrypt RegRu Manager ${{ steps.get_version.outputs.VERSION }}
|
||||
body: |
|
||||
## Let's Encrypt RegRu Manager ${{ steps.get_version.outputs.VERSION }}
|
||||
|
||||
### 📦 Релизные пакеты
|
||||
|
||||
**Linux (Ubuntu/Debian/CentOS):**
|
||||
- `letsencrypt-regru-linux-x86_64.tar.gz` - Исполняемый файл + файлы
|
||||
- `letsencrypt-regru-linux-x86_64.tar.gz.sha256` - Контрольная сумма
|
||||
|
||||
**Windows:**
|
||||
- `letsencrypt-regru-windows-x86_64.zip` - Исполняемый файл + файлы
|
||||
- `letsencrypt-regru-windows-x86_64.zip.sha256` - Контрольная сумма
|
||||
|
||||
### 🚀 Быстрая установка
|
||||
|
||||
**Linux:**
|
||||
```bash
|
||||
wget https://your-gitea-instance.com/${{ github.repository }}/releases/download/${{ steps.get_version.outputs.VERSION }}/letsencrypt-regru-linux-x86_64.tar.gz
|
||||
tar -xzf letsencrypt-regru-linux-x86_64.tar.gz
|
||||
sudo mv letsencrypt-regru /usr/local/bin/
|
||||
sudo chmod +x /usr/local/bin/letsencrypt-regru
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
Скачайте `letsencrypt-regru-windows-x86_64.zip` и распакуйте.
|
||||
|
||||
### 📖 Документация
|
||||
|
||||
- [README.md](README.md)
|
||||
- [BUILD_GUIDE.md](BUILD_GUIDE.md)
|
||||
- [INSTALL_GUIDE.md](docs/INSTALL_GUIDE.md)
|
||||
|
||||
### ⚠️ Важно
|
||||
|
||||
- Исполняемые файлы требуют установленного `certbot` в системе
|
||||
- Linux версия требует права root (sudo)
|
||||
- Windows версия не поддерживает certbot напрямую (используйте WSL)
|
||||
|
||||
### 🔐 Проверка контрольных сумм
|
||||
|
||||
**Linux:**
|
||||
```bash
|
||||
sha256sum -c letsencrypt-regru-linux-x86_64.tar.gz.sha256
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
```powershell
|
||||
certutil -hashfile letsencrypt-regru-windows-x86_64.zip SHA256
|
||||
```
|
||||
|
||||
### 📝 Changelog
|
||||
|
||||
- Автоматическая сборка релиза ${{ steps.get_version.outputs.VERSION }}
|
||||
- См. коммиты для деталей изменений
|
||||
files: |
|
||||
./artifacts/letsencrypt-regru-linux-x86_64.tar.gz
|
||||
./artifacts/letsencrypt-regru-linux-x86_64.tar.gz.sha256
|
||||
./artifacts/letsencrypt-regru-windows-x86_64.zip
|
||||
./artifacts/letsencrypt-regru-windows-x86_64.zip.sha256
|
||||
draft: false
|
||||
prerelease: false
|
||||
@@ -0,0 +1,387 @@
|
||||
name: Build and Release (Gitea Native)
|
||||
|
||||
# Этот workflow оптимизирован для Gitea
|
||||
# Использует нативные возможности Gitea Actions
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*'
|
||||
- 'release-*'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
description: 'Version tag (e.g., v1.0.0)'
|
||||
required: false
|
||||
default: 'dev'
|
||||
|
||||
env:
|
||||
APP_NAME: letsencrypt-regru
|
||||
PYTHON_VERSION: '3.9'
|
||||
|
||||
jobs:
|
||||
# ============================================================================
|
||||
# Сборка для Linux
|
||||
# ============================================================================
|
||||
build-linux:
|
||||
name: 🐧 Build Linux
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: 📥 Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: 🐍 Set up Python ${{ env.PYTHON_VERSION }}
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: ${{ env.PYTHON_VERSION }}
|
||||
cache: 'pip'
|
||||
|
||||
- name: 📦 Install system dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y build-essential
|
||||
|
||||
- name: 📚 Install Python dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip setuptools wheel
|
||||
pip install pyinstaller
|
||||
if [ -f requirements.txt ]; then
|
||||
pip install -r requirements.txt
|
||||
else
|
||||
pip install requests certbot cryptography
|
||||
fi
|
||||
|
||||
- name: ℹ️ Build info
|
||||
run: |
|
||||
make build-info
|
||||
|
||||
- name: 🔨 Build Linux executable
|
||||
run: |
|
||||
make build-linux
|
||||
|
||||
- name: ✅ Test executable
|
||||
run: |
|
||||
chmod +x dist/${{ env.APP_NAME }}
|
||||
./dist/${{ env.APP_NAME }} --help
|
||||
./dist/${{ env.APP_NAME }} --create-config /tmp/test_config.json
|
||||
|
||||
- name: 📦 Create distribution package
|
||||
run: |
|
||||
make package-linux
|
||||
|
||||
- name: 🔐 Generate checksums
|
||||
run: |
|
||||
cd dist
|
||||
sha256sum ${{ env.APP_NAME }}-linux-x86_64.tar.gz > ${{ env.APP_NAME }}-linux-x86_64.tar.gz.sha256
|
||||
md5sum ${{ env.APP_NAME }}-linux-x86_64.tar.gz > ${{ env.APP_NAME }}-linux-x86_64.tar.gz.md5
|
||||
cat ${{ env.APP_NAME }}-linux-x86_64.tar.gz.sha256
|
||||
|
||||
- name: 📤 Upload Linux package
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: linux-package
|
||||
path: |
|
||||
dist/${{ env.APP_NAME }}-linux-x86_64.tar.gz
|
||||
dist/${{ env.APP_NAME }}-linux-x86_64.tar.gz.sha256
|
||||
dist/${{ env.APP_NAME }}-linux-x86_64.tar.gz.md5
|
||||
retention-days: 7
|
||||
|
||||
# ============================================================================
|
||||
# Сборка для Windows
|
||||
# ============================================================================
|
||||
build-windows:
|
||||
name: 🪟 Build Windows
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- name: 📥 Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: 🐍 Set up Python ${{ env.PYTHON_VERSION }}
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: ${{ env.PYTHON_VERSION }}
|
||||
cache: 'pip'
|
||||
|
||||
- name: 📚 Install Python dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip setuptools wheel
|
||||
pip install pyinstaller
|
||||
if (Test-Path requirements.txt) {
|
||||
pip install -r requirements.txt
|
||||
} else {
|
||||
pip install requests certbot cryptography
|
||||
}
|
||||
|
||||
- name: 🔨 Build Windows executable
|
||||
run: |
|
||||
make build-windows
|
||||
|
||||
- name: ✅ Test executable
|
||||
run: |
|
||||
dist\${{ env.APP_NAME }}.exe --help
|
||||
dist\${{ env.APP_NAME }}.exe --create-config test_config.json
|
||||
|
||||
- name: 📦 Create distribution package
|
||||
run: |
|
||||
make package-windows
|
||||
|
||||
- name: 🔐 Generate checksums
|
||||
run: |
|
||||
cd dist
|
||||
certutil -hashfile ${{ env.APP_NAME }}-windows-x86_64.zip SHA256 > ${{ env.APP_NAME }}-windows-x86_64.zip.sha256
|
||||
certutil -hashfile ${{ env.APP_NAME }}-windows-x86_64.zip MD5 > ${{ env.APP_NAME }}-windows-x86_64.zip.md5
|
||||
type ${{ env.APP_NAME }}-windows-x86_64.zip.sha256
|
||||
|
||||
- name: 📤 Upload Windows package
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: windows-package
|
||||
path: |
|
||||
dist/${{ env.APP_NAME }}-windows-x86_64.zip
|
||||
dist/${{ env.APP_NAME }}-windows-x86_64.zip.sha256
|
||||
dist/${{ env.APP_NAME }}-windows-x86_64.zip.md5
|
||||
retention-days: 7
|
||||
|
||||
# ============================================================================
|
||||
# Создание релиза в Gitea
|
||||
# ============================================================================
|
||||
create-release:
|
||||
name: 📦 Create Release
|
||||
needs: [build-linux, build-windows]
|
||||
runs-on: ubuntu-latest
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
|
||||
steps:
|
||||
- name: 📥 Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: 📥 Download Linux artifacts
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: linux-package
|
||||
path: ./release
|
||||
|
||||
- name: 📥 Download Windows artifacts
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: windows-package
|
||||
path: ./release
|
||||
|
||||
- name: 📋 List release files
|
||||
run: |
|
||||
echo "Release files:"
|
||||
ls -lh ./release/
|
||||
|
||||
- name: 🏷️ Get version info
|
||||
id: version
|
||||
run: |
|
||||
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
||||
VERSION="${{ github.event.inputs.version }}"
|
||||
else
|
||||
VERSION="${GITHUB_REF#refs/tags/}"
|
||||
fi
|
||||
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
|
||||
echo "Release version: $VERSION"
|
||||
|
||||
- name: 📝 Generate release notes
|
||||
id: release_notes
|
||||
run: |
|
||||
cat > release_notes.md << 'EOF'
|
||||
## 🎉 Let's Encrypt RegRu Manager ${{ steps.version.outputs.VERSION }}
|
||||
|
||||
Автоматическое управление SSL сертификатами Let's Encrypt для доменов на reg.ru с интеграцией в Nginx Proxy Manager.
|
||||
|
||||
### 📦 Файлы релиза
|
||||
|
||||
#### Linux (Ubuntu 20.04+, Debian 10+, CentOS 8+)
|
||||
- **letsencrypt-regru-linux-x86_64.tar.gz** - Исполняемый файл (ELF 64-bit)
|
||||
- **letsencrypt-regru-linux-x86_64.tar.gz.sha256** - SHA256 контрольная сумма
|
||||
- **letsencrypt-regru-linux-x86_64.tar.gz.md5** - MD5 контрольная сумма
|
||||
|
||||
#### Windows (10/11, Server 2019+)
|
||||
- **letsencrypt-regru-windows-x86_64.zip** - Исполняемый файл (PE32+)
|
||||
- **letsencrypt-regru-windows-x86_64.zip.sha256** - SHA256 контрольная сумма
|
||||
- **letsencrypt-regru-windows-x86_64.zip.md5** - MD5 контрольная сумма
|
||||
|
||||
---
|
||||
|
||||
### 🚀 Быстрая установка
|
||||
|
||||
#### Linux (одна команда):
|
||||
```bash
|
||||
curl -fsSL https://your-gitea.com/api/v1/repos/${{ github.repository }}/releases/tags/${{ steps.version.outputs.VERSION }} | \
|
||||
jq -r '.assets[] | select(.name | contains("linux")) | .browser_download_url' | \
|
||||
xargs wget -O letsencrypt-regru.tar.gz && \
|
||||
tar -xzf letsencrypt-regru.tar.gz && \
|
||||
sudo mv letsencrypt-regru /usr/local/bin/ && \
|
||||
sudo chmod +x /usr/local/bin/letsencrypt-regru
|
||||
```
|
||||
|
||||
#### Или вручную:
|
||||
```bash
|
||||
# 1. Скачать
|
||||
wget https://your-gitea.com/${{ github.repository }}/releases/download/${{ steps.version.outputs.VERSION }}/letsencrypt-regru-linux-x86_64.tar.gz
|
||||
|
||||
# 2. Проверить контрольную сумму
|
||||
wget https://your-gitea.com/${{ github.repository }}/releases/download/${{ steps.version.outputs.VERSION }}/letsencrypt-regru-linux-x86_64.tar.gz.sha256
|
||||
sha256sum -c letsencrypt-regru-linux-x86_64.tar.gz.sha256
|
||||
|
||||
# 3. Распаковать и установить
|
||||
tar -xzf letsencrypt-regru-linux-x86_64.tar.gz
|
||||
sudo mv letsencrypt-regru /usr/local/bin/
|
||||
sudo chmod +x /usr/local/bin/letsencrypt-regru
|
||||
|
||||
# 4. Проверить
|
||||
letsencrypt-regru --help
|
||||
```
|
||||
|
||||
#### Windows:
|
||||
```powershell
|
||||
# Скачать и распаковать
|
||||
Invoke-WebRequest -Uri "https://your-gitea.com/${{ github.repository }}/releases/download/${{ steps.version.outputs.VERSION }}/letsencrypt-regru-windows-x86_64.zip" -OutFile "letsencrypt-regru.zip"
|
||||
Expand-Archive -Path letsencrypt-regru.zip -DestinationPath "C:\Program Files\LetsEncrypt-RegRu"
|
||||
|
||||
# Проверить
|
||||
& "C:\Program Files\LetsEncrypt-RegRu\letsencrypt-regru.exe" --help
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### ✨ Основные возможности
|
||||
|
||||
- ✅ Автоматическое получение Let's Encrypt сертификатов
|
||||
- ✅ DNS-валидация через API reg.ru
|
||||
- ✅ Поддержка wildcard сертификатов (*.domain.com)
|
||||
- ✅ Автоматическая загрузка в Nginx Proxy Manager
|
||||
- ✅ Автоматическое обновление сертификатов
|
||||
- ✅ Systemd интеграция для автоматизации
|
||||
- ✅ Подробное логирование
|
||||
- ✅ Генерация тестовых самоподписанных сертификатов
|
||||
|
||||
---
|
||||
|
||||
### 📋 Системные требования
|
||||
|
||||
#### Linux:
|
||||
- Ubuntu 20.04+ / Debian 10+ / CentOS 8+ / RHEL 8+
|
||||
- certbot (устанавливается автоматически через `letsencrypt_regru.sh`)
|
||||
- 50 MB свободного места
|
||||
- Права root (sudo)
|
||||
|
||||
#### Windows:
|
||||
- Windows 10/11 или Server 2019+
|
||||
- **Важно:** certbot не поддерживается напрямую на Windows
|
||||
- Рекомендуется использовать WSL (Windows Subsystem for Linux)
|
||||
|
||||
---
|
||||
|
||||
### 📖 Документация
|
||||
|
||||
- **[README.md](README.md)** - Полное руководство пользователя
|
||||
- **[BUILD_GUIDE.md](BUILD_GUIDE.md)** - Руководство по сборке из исходников
|
||||
- **[INSTALL_GUIDE.md](docs/INSTALL_GUIDE.md)** - Детальная инструкция по установке
|
||||
- **[MAKEFILE_COMMANDS.md](MAKEFILE_COMMANDS.md)** - Справка по командам Makefile
|
||||
|
||||
---
|
||||
|
||||
### ⚠️ Важная информация
|
||||
|
||||
1. **Certbot зависимость:**
|
||||
- Исполняемый файл НЕ включает certbot
|
||||
- certbot должен быть установлен в системе
|
||||
- Используется через subprocess
|
||||
|
||||
2. **Размер файла:**
|
||||
- Linux: ~45-55 MB (включая Python runtime)
|
||||
- Windows: ~40-50 MB (включая Python runtime)
|
||||
|
||||
3. **Первый запуск:**
|
||||
- Может занять 5-10 секунд (распаковка)
|
||||
- Последующие запуски быстрее (~1-2 сек)
|
||||
|
||||
4. **Безопасность:**
|
||||
- Файлы подписаны контрольными суммами SHA256 и MD5
|
||||
- Всегда проверяйте контрольные суммы перед использованием
|
||||
|
||||
---
|
||||
|
||||
### 🔐 Проверка контрольных сумм
|
||||
|
||||
#### Linux:
|
||||
```bash
|
||||
# SHA256
|
||||
sha256sum -c letsencrypt-regru-linux-x86_64.tar.gz.sha256
|
||||
|
||||
# MD5
|
||||
md5sum -c letsencrypt-regru-linux-x86_64.tar.gz.md5
|
||||
```
|
||||
|
||||
#### Windows:
|
||||
```powershell
|
||||
# SHA256
|
||||
certutil -hashfile letsencrypt-regru-windows-x86_64.zip SHA256
|
||||
|
||||
# MD5
|
||||
certutil -hashfile letsencrypt-regru-windows-x86_64.zip MD5
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 🐛 Проблемы и поддержка
|
||||
|
||||
Если у вас возникли проблемы:
|
||||
|
||||
1. Проверьте [Issues](../../issues)
|
||||
2. Создайте новый [Issue](../../issues/new)
|
||||
3. См. раздел [Troubleshooting](BUILD_GUIDE.md#troubleshooting) в BUILD_GUIDE.md
|
||||
|
||||
---
|
||||
|
||||
### 📝 Changelog
|
||||
|
||||
См. [коммиты](${{ github.server_url }}/${{ github.repository }}/commits/${{ steps.version.outputs.VERSION }}) для деталей изменений.
|
||||
|
||||
---
|
||||
|
||||
**Автор:** Фофанов Дмитрий
|
||||
**Дата релиза:** $(date -u +"%Y-%m-%d %H:%M:%S UTC")
|
||||
**Версия:** ${{ steps.version.outputs.VERSION }}
|
||||
EOF
|
||||
|
||||
cat release_notes.md
|
||||
|
||||
- name: 🚀 Create Gitea Release
|
||||
uses: actions/gitea-release@v1
|
||||
env:
|
||||
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
files: |
|
||||
release/*
|
||||
tag_name: ${{ steps.version.outputs.VERSION }}
|
||||
name: "Let's Encrypt RegRu Manager ${{ steps.version.outputs.VERSION }}"
|
||||
body_path: release_notes.md
|
||||
draft: false
|
||||
prerelease: false
|
||||
|
||||
# ============================================================================
|
||||
# Уведомление о релизе (опционально)
|
||||
# ============================================================================
|
||||
notify:
|
||||
name: 📢 Notify
|
||||
needs: [create-release]
|
||||
runs-on: ubuntu-latest
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
|
||||
steps:
|
||||
- name: 📧 Send notification
|
||||
run: |
|
||||
echo "Release created successfully!"
|
||||
echo "Tag: ${{ github.ref_name }}"
|
||||
echo "Repository: ${{ github.repository }}"
|
||||
# Здесь можно добавить отправку уведомлений через webhook, email и т.д.
|
||||
@@ -0,0 +1,201 @@
|
||||
name: Build Releases
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*' # Срабатывает на теги вида v1.0, v2.0.1 и т.д.
|
||||
workflow_dispatch: # Возможность запустить вручную
|
||||
|
||||
jobs:
|
||||
build-linux:
|
||||
name: Build Linux Executable
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.9'
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install pyinstaller
|
||||
pip install -r requirements.txt
|
||||
|
||||
- name: Build Linux executable
|
||||
run: |
|
||||
make build-linux
|
||||
|
||||
- name: Test Linux executable
|
||||
run: |
|
||||
chmod +x dist/letsencrypt-regru
|
||||
dist/letsencrypt-regru --help
|
||||
|
||||
- name: Create Linux package
|
||||
run: |
|
||||
make package-linux
|
||||
|
||||
- name: Upload Linux artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: linux-executable
|
||||
path: dist/letsencrypt-regru-linux-x86_64.tar.gz
|
||||
|
||||
- name: Generate SHA256 checksum
|
||||
run: |
|
||||
cd dist
|
||||
sha256sum letsencrypt-regru-linux-x86_64.tar.gz > letsencrypt-regru-linux-x86_64.tar.gz.sha256
|
||||
|
||||
- name: Upload checksum
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: linux-checksum
|
||||
path: dist/letsencrypt-regru-linux-x86_64.tar.gz.sha256
|
||||
|
||||
build-windows:
|
||||
name: Build Windows Executable
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.9'
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install pyinstaller
|
||||
pip install -r requirements.txt
|
||||
|
||||
- name: Build Windows executable
|
||||
run: |
|
||||
make build-windows
|
||||
|
||||
- name: Test Windows executable
|
||||
run: |
|
||||
dist\letsencrypt-regru.exe --help
|
||||
|
||||
- name: Create Windows package
|
||||
run: |
|
||||
make package-windows
|
||||
|
||||
- name: Upload Windows artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: windows-executable
|
||||
path: dist/letsencrypt-regru-windows-x86_64.zip
|
||||
|
||||
- name: Generate SHA256 checksum
|
||||
run: |
|
||||
cd dist
|
||||
certutil -hashfile letsencrypt-regru-windows-x86_64.zip SHA256 > letsencrypt-regru-windows-x86_64.zip.sha256
|
||||
|
||||
- name: Upload checksum
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: windows-checksum
|
||||
path: dist/letsencrypt-regru-windows-x86_64.zip.sha256
|
||||
|
||||
create-release:
|
||||
name: Create GitHub Release
|
||||
needs: [build-linux, build-windows]
|
||||
runs-on: ubuntu-latest
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Download Linux artifact
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: linux-executable
|
||||
path: ./artifacts
|
||||
|
||||
- name: Download Linux checksum
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: linux-checksum
|
||||
path: ./artifacts
|
||||
|
||||
- name: Download Windows artifact
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: windows-executable
|
||||
path: ./artifacts
|
||||
|
||||
- name: Download Windows checksum
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: windows-checksum
|
||||
path: ./artifacts
|
||||
|
||||
- name: Create Release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
files: |
|
||||
./artifacts/letsencrypt-regru-linux-x86_64.tar.gz
|
||||
./artifacts/letsencrypt-regru-linux-x86_64.tar.gz.sha256
|
||||
./artifacts/letsencrypt-regru-windows-x86_64.zip
|
||||
./artifacts/letsencrypt-regru-windows-x86_64.zip.sha256
|
||||
body: |
|
||||
## Let's Encrypt RegRu Manager ${{ github.ref_name }}
|
||||
|
||||
### 📦 Релизные пакеты
|
||||
|
||||
**Linux (Ubuntu/Debian/CentOS):**
|
||||
- `letsencrypt-regru-linux-x86_64.tar.gz` - Исполняемый файл + файлы
|
||||
- `letsencrypt-regru-linux-x86_64.tar.gz.sha256` - Контрольная сумма
|
||||
|
||||
**Windows:**
|
||||
- `letsencrypt-regru-windows-x86_64.zip` - Исполняемый файл + файлы
|
||||
- `letsencrypt-regru-windows-x86_64.zip.sha256` - Контрольная сумма
|
||||
|
||||
### 🚀 Быстрая установка
|
||||
|
||||
**Linux:**
|
||||
```bash
|
||||
wget https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/letsencrypt-regru-linux-x86_64.tar.gz
|
||||
tar -xzf letsencrypt-regru-linux-x86_64.tar.gz
|
||||
sudo mv letsencrypt-regru /usr/local/bin/
|
||||
sudo chmod +x /usr/local/bin/letsencrypt-regru
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
Скачайте `letsencrypt-regru-windows-x86_64.zip` и распакуйте.
|
||||
|
||||
### 📖 Документация
|
||||
|
||||
- [README.md](https://github.com/${{ github.repository }}/blob/${{ github.ref_name }}/README.md)
|
||||
- [BUILD_GUIDE.md](https://github.com/${{ github.repository }}/blob/${{ github.ref_name }}/BUILD_GUIDE.md)
|
||||
- [INSTALL_GUIDE.md](https://github.com/${{ github.repository }}/blob/${{ github.ref_name }}/docs/INSTALL_GUIDE.md)
|
||||
|
||||
### ⚠️ Важно
|
||||
|
||||
- Исполняемые файлы требуют установленного `certbot` в системе
|
||||
- Linux версия требует права root (sudo)
|
||||
- Windows версия не поддерживает certbot напрямую (используйте WSL)
|
||||
|
||||
### 🔐 Проверка контрольных сумм
|
||||
|
||||
**Linux:**
|
||||
```bash
|
||||
sha256sum -c letsencrypt-regru-linux-x86_64.tar.gz.sha256
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
```powershell
|
||||
certutil -hashfile letsencrypt-regru-windows-x86_64.zip SHA256
|
||||
```
|
||||
draft: false
|
||||
prerelease: false
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -0,0 +1,100 @@
|
||||
name: Sync from Gitea
|
||||
|
||||
# Запускается вручную или по webhook от Gitea
|
||||
on:
|
||||
workflow_dispatch:
|
||||
repository_dispatch:
|
||||
types: [gitea-push]
|
||||
schedule:
|
||||
# Проверка каждый час
|
||||
- cron: '0 * * * *'
|
||||
|
||||
jobs:
|
||||
sync:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout GitHub repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Configure Git
|
||||
run: |
|
||||
git config --global user.name "Sync Bot"
|
||||
git config --global user.email "bot@example.com"
|
||||
|
||||
- name: Add Gitea remote
|
||||
env:
|
||||
GITEA_URL: ${{ secrets.GITEA_URL }}
|
||||
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||
run: |
|
||||
if [ -z "$GITEA_URL" ]; then
|
||||
echo "⚠️ GITEA_URL не настроен, пропускаем синхронизацию"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Добавляем Gitea remote с токеном
|
||||
git remote add gitea "https://oauth2:${GITEA_TOKEN}@${GITEA_URL#https://}"
|
||||
git remote -v
|
||||
|
||||
- name: Fetch from Gitea
|
||||
run: |
|
||||
if git remote | grep -q gitea; then
|
||||
echo "🔄 Получение изменений из Gitea..."
|
||||
git fetch gitea --tags
|
||||
else
|
||||
echo "⚠️ Gitea remote не настроен"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
- name: Check for new commits
|
||||
id: check
|
||||
run: |
|
||||
# Проверяем есть ли новые коммиты в Gitea
|
||||
LOCAL=$(git rev-parse HEAD)
|
||||
REMOTE=$(git rev-parse gitea/main 2>/dev/null || git rev-parse gitea/master 2>/dev/null || echo $LOCAL)
|
||||
|
||||
if [ "$LOCAL" != "$REMOTE" ]; then
|
||||
echo "new_commits=true" >> $GITHUB_OUTPUT
|
||||
echo "✅ Обнаружены новые изменения в Gitea"
|
||||
else
|
||||
echo "new_commits=false" >> $GITHUB_OUTPUT
|
||||
echo "ℹ️ Нет новых изменений"
|
||||
fi
|
||||
|
||||
- name: Merge changes from Gitea
|
||||
if: steps.check.outputs.new_commits == 'true'
|
||||
run: |
|
||||
# Определяем главную ветку
|
||||
if git show-ref --verify --quiet refs/remotes/gitea/main; then
|
||||
BRANCH="main"
|
||||
else
|
||||
BRANCH="master"
|
||||
fi
|
||||
|
||||
echo "🔀 Слияние изменений из gitea/${BRANCH}..."
|
||||
git merge "gitea/${BRANCH}" --allow-unrelated-histories -m "Sync from Gitea: $(date)"
|
||||
|
||||
- name: Push to GitHub
|
||||
if: steps.check.outputs.new_commits == 'true'
|
||||
run: |
|
||||
echo "⬆️ Отправка изменений в GitHub..."
|
||||
git push origin HEAD:main --force-with-lease
|
||||
git push origin --tags
|
||||
echo "✅ Синхронизация завершена"
|
||||
|
||||
- name: Summary
|
||||
if: always()
|
||||
run: |
|
||||
echo "## 🔄 Отчет о синхронизации" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
if [ "${{ steps.check.outputs.new_commits }}" == "true" ]; then
|
||||
echo "✅ **Статус**: Синхронизировано успешно" >> $GITHUB_STEP_SUMMARY
|
||||
echo "📦 **Коммиты**: Новые изменения получены и объединены" >> $GITHUB_STEP_SUMMARY
|
||||
else
|
||||
echo "ℹ️ **Статус**: Нет новых изменений" >> $GITHUB_STEP_SUMMARY
|
||||
fi
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "🕐 **Время**: $(date)" >> $GITHUB_STEP_SUMMARY
|
||||
+193
@@ -0,0 +1,193 @@
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
PIPE_MANIFEST
|
||||
|
||||
# PyInstaller
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# PyInstaller build artifacts
|
||||
build/
|
||||
dist/
|
||||
*.tar.gz
|
||||
*.zip
|
||||
*.sha256
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
cover/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
db.sqlite3-journal
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
.pybuilder/
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# IPython
|
||||
profile_default/
|
||||
ipython_config.py
|
||||
|
||||
# pyenv
|
||||
.python-version
|
||||
|
||||
# pipenv
|
||||
Pipfile.lock
|
||||
|
||||
# poetry
|
||||
poetry.lock
|
||||
|
||||
# pdm
|
||||
.pdm.toml
|
||||
|
||||
# PEP 582
|
||||
__pypackages__/
|
||||
|
||||
# Celery stuff
|
||||
celerybeat-schedule
|
||||
celerybeat.pid
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
.spyproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
# mkdocs documentation
|
||||
/site
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# pytype static type analyzer
|
||||
.pytype/
|
||||
|
||||
# Cython debug symbols
|
||||
cython_debug/
|
||||
|
||||
# IDE
|
||||
.idea/
|
||||
.vscode/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# SSL Certificates and Keys (CRITICAL - DO NOT COMMIT!)
|
||||
*.pem
|
||||
*.key
|
||||
*.crt
|
||||
*.csr
|
||||
*.pfx
|
||||
*.p12
|
||||
/ssl/
|
||||
/certs/
|
||||
|
||||
# Configuration files with credentials
|
||||
config.yml
|
||||
config.json
|
||||
.regru_credentials
|
||||
credentials.txt
|
||||
*.secret
|
||||
config.json
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
logs/
|
||||
/var/log/
|
||||
|
||||
# OS-specific
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
desktop.ini
|
||||
|
||||
# Test certificates
|
||||
test_certs/
|
||||
*.test.pem
|
||||
*.test.key
|
||||
|
||||
# Backup files
|
||||
*.bak
|
||||
*.backup
|
||||
*~
|
||||
|
||||
# Temporary files
|
||||
tmp/
|
||||
temp/
|
||||
*.tmp
|
||||
@@ -0,0 +1,768 @@
|
||||
# ==============================================================================
|
||||
# Makefile для установки и удаления скрипта управления SSL сертификатами
|
||||
# Let's Encrypt с DNS-валидацией через API reg.ru
|
||||
# ==============================================================================
|
||||
|
||||
# Переменные
|
||||
INSTALL_DIR = /opt/letsencrypt-regru
|
||||
SCRIPT_NAME = letsencrypt_regru_api.py
|
||||
CONFIG_EXAMPLE = config.json.example
|
||||
SERVICE_NAME = letsencrypt-regru
|
||||
SERVICE_FILE = $(SERVICE_NAME).service
|
||||
TIMER_FILE = $(SERVICE_NAME).timer
|
||||
CONFIG_DIR = /etc/letsencrypt
|
||||
CONFIG_FILE = $(CONFIG_DIR)/regru_config.json
|
||||
LOG_DIR = /var/log
|
||||
LOG_FILE = $(LOG_DIR)/letsencrypt_regru.log
|
||||
CRON_LOG = $(LOG_DIR)/letsencrypt_cron.log
|
||||
SYSTEMD_DIR = /etc/systemd/system
|
||||
PYTHON = python3
|
||||
|
||||
# Цвета для вывода
|
||||
RED = \033[0;31m
|
||||
GREEN = \033[0;32m
|
||||
YELLOW = \033[1;33m
|
||||
BLUE = \033[0;34m
|
||||
NC = \033[0m # No Color
|
||||
|
||||
.PHONY: help install uninstall status check-root setup-dirs install-script install-service install-cron clean build build-linux build-windows build-all package-linux package-windows release
|
||||
|
||||
# Переменные для сборки
|
||||
PYINSTALLER = pyinstaller
|
||||
APP_NAME = letsencrypt-regru
|
||||
DIST_DIR = dist
|
||||
BUILD_DIR_PY = build
|
||||
SPEC_FILE = $(APP_NAME).spec
|
||||
|
||||
# ==============================================================================
|
||||
# Помощь
|
||||
# ==============================================================================
|
||||
|
||||
help:
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ Makefile для управления Let's Encrypt SSL сертификатами ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@echo "$(GREEN)Команды для установки:$(NC)"
|
||||
@echo ""
|
||||
@echo " $(YELLOW)make install$(NC) - Установить скрипт и настроить автоматизацию"
|
||||
@echo " $(YELLOW)make uninstall$(NC) - Удалить скрипт и очистить систему"
|
||||
@echo " $(YELLOW)make status$(NC) - Проверить статус установки"
|
||||
@echo " $(YELLOW)make check-config$(NC) - Проверить конфигурацию"
|
||||
@echo " $(YELLOW)make test-run$(NC) - Тестовый запуск скрипта"
|
||||
@echo " $(YELLOW)make test-cert$(NC) - Создать тестовый самоподписанный сертификат"
|
||||
@echo " $(YELLOW)make logs$(NC) - Показать логи"
|
||||
@echo ""
|
||||
@echo "$(GREEN)Команды для сборки (PyInstaller):$(NC)"
|
||||
@echo ""
|
||||
@echo " $(YELLOW)make build$(NC) - Собрать исполняемый файл для текущей ОС"
|
||||
@echo " $(YELLOW)make build-linux$(NC) - Собрать исполняемый файл для Linux"
|
||||
@echo " $(YELLOW)make build-windows$(NC) - Собрать исполняемый файл для Windows"
|
||||
@echo " $(YELLOW)make build-all$(NC) - Собрать для всех платформ"
|
||||
@echo " $(YELLOW)make package-linux$(NC) - Создать tar.gz пакет для Linux"
|
||||
@echo " $(YELLOW)make package-windows$(NC) - Создать zip пакет для Windows"
|
||||
@echo " $(YELLOW)make release$(NC) - Полный цикл релиза (build + package)"
|
||||
@echo " $(YELLOW)make clean-build$(NC) - Очистить артефакты сборки"
|
||||
@echo ""
|
||||
@echo " $(YELLOW)make help$(NC) - Показать эту справку"
|
||||
@echo ""
|
||||
|
||||
# ==============================================================================
|
||||
# Проверка прав root
|
||||
# ==============================================================================
|
||||
|
||||
check-root:
|
||||
@if [ "$$(id -u)" != "0" ]; then \
|
||||
echo "$(RED)✗ Ошибка: Требуются права root$(NC)"; \
|
||||
echo "$(YELLOW)Запустите: sudo make install$(NC)"; \
|
||||
exit 1; \
|
||||
fi
|
||||
|
||||
# ==============================================================================
|
||||
# Установка
|
||||
# ==============================================================================
|
||||
|
||||
install: check-root
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ Установка Let's Encrypt SSL Manager ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@$(MAKE) setup-dirs
|
||||
@$(MAKE) install-dependencies
|
||||
@$(MAKE) install-script
|
||||
@$(MAKE) install-service
|
||||
@$(MAKE) install-cron
|
||||
@echo ""
|
||||
@echo "$(GREEN)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(GREEN)║ ✓ Установка завершена успешно! ║$(NC)"
|
||||
@echo "$(GREEN)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Следующие шаги:$(NC)"
|
||||
@echo " 1. Отредактируйте конфигурацию:"
|
||||
@echo " $(BLUE)sudo nano $(CONFIG_FILE)$(NC)"
|
||||
@echo ""
|
||||
@echo " 2. Проверьте конфигурацию:"
|
||||
@echo " $(BLUE)make check-config$(NC)"
|
||||
@echo ""
|
||||
@echo " 3. Запустите тестовую проверку:"
|
||||
@echo " $(BLUE)make test-run$(NC)"
|
||||
@echo ""
|
||||
@echo " 4. Проверьте статус службы:"
|
||||
@echo " $(BLUE)make status$(NC)"
|
||||
@echo ""
|
||||
|
||||
# Создание директорий
|
||||
setup-dirs:
|
||||
@echo "$(YELLOW)→ Создание директорий...$(NC)"
|
||||
@mkdir -p $(INSTALL_DIR)
|
||||
@mkdir -p $(CONFIG_DIR)
|
||||
@mkdir -p $(LOG_DIR)
|
||||
@echo "$(GREEN)✓ Директории созданы$(NC)"
|
||||
|
||||
# Установка зависимостей
|
||||
install-dependencies:
|
||||
@echo "$(YELLOW)→ Установка зависимостей Python...$(NC)"
|
||||
@if command -v pip3 >/dev/null 2>&1; then \
|
||||
pip3 install -q requests cryptography 2>/dev/null || pip3 install requests cryptography; \
|
||||
elif command -v pip >/dev/null 2>&1; then \
|
||||
pip install -q requests cryptography 2>/dev/null || pip install requests cryptography; \
|
||||
elif command -v python3 >/dev/null 2>&1; then \
|
||||
if python3 -m pip --version >/dev/null 2>&1; then \
|
||||
python3 -m pip install -q requests cryptography 2>/dev/null || python3 -m pip install requests cryptography; \
|
||||
else \
|
||||
echo "$(RED)✗ pip не установлен. Выполните:$(NC)"; \
|
||||
echo " $(CYAN)sudo apt-get update && sudo apt-get install -y python3-pip$(NC)"; \
|
||||
echo " или"; \
|
||||
echo " $(CYAN)curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && python3 get-pip.py$(NC)"; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
elif command -v python >/dev/null 2>&1; then \
|
||||
if python -m pip --version >/dev/null 2>&1; then \
|
||||
python -m pip install -q requests cryptography 2>/dev/null || python -m pip install requests cryptography; \
|
||||
else \
|
||||
echo "$(RED)✗ pip не установлен. Выполните:$(NC)"; \
|
||||
echo " $(CYAN)sudo apt-get update && sudo apt-get install -y python3-pip$(NC)"; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
else \
|
||||
echo "$(RED)✗ Python не найден. Установите Python 3:$(NC)"; \
|
||||
echo " $(CYAN)sudo apt-get update && sudo apt-get install -y python3 python3-pip$(NC)"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@echo "$(GREEN)✓ Зависимости установлены$(NC)"
|
||||
|
||||
# Копирование скрипта
|
||||
install-script:
|
||||
@echo "$(YELLOW)→ Установка скрипта...$(NC)"
|
||||
@if [ ! -f "$(SCRIPT_NAME)" ]; then \
|
||||
echo "$(RED)✗ Файл $(SCRIPT_NAME) не найден!$(NC)"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@cp $(SCRIPT_NAME) $(INSTALL_DIR)/
|
||||
@chmod +x $(INSTALL_DIR)/$(SCRIPT_NAME)
|
||||
@echo "$(GREEN)✓ Скрипт установлен в $(INSTALL_DIR)/$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)→ Создание конфигурации...$(NC)"
|
||||
@if [ ! -f "$(CONFIG_FILE)" ]; then \
|
||||
if [ -f "$(CONFIG_EXAMPLE)" ]; then \
|
||||
cp $(CONFIG_EXAMPLE) $(CONFIG_FILE); \
|
||||
chmod 600 $(CONFIG_FILE); \
|
||||
echo "$(GREEN)✓ Создан файл конфигурации: $(CONFIG_FILE)$(NC)"; \
|
||||
echo "$(YELLOW)⚠ ВНИМАНИЕ: Отредактируйте конфигурацию перед использованием!$(NC)"; \
|
||||
else \
|
||||
echo "$(YELLOW)⚠ Файл config.json.example не найден$(NC)"; \
|
||||
$(PYTHON) $(INSTALL_DIR)/$(SCRIPT_NAME) --create-config $(CONFIG_FILE); \
|
||||
chmod 600 $(CONFIG_FILE); \
|
||||
echo "$(GREEN)✓ Создана конфигурация по умолчанию$(NC)"; \
|
||||
fi \
|
||||
else \
|
||||
echo "$(GREEN)✓ Конфигурация уже существует: $(CONFIG_FILE)$(NC)"; \
|
||||
fi
|
||||
|
||||
# Установка systemd service и timer
|
||||
install-service:
|
||||
@echo "$(YELLOW)→ Создание systemd service...$(NC)"
|
||||
@echo "[Unit]" > $(SYSTEMD_DIR)/$(SERVICE_FILE)
|
||||
@echo "Description=Let's Encrypt Certificate Manager with reg.ru DNS" >> $(SYSTEMD_DIR)/$(SERVICE_FILE)
|
||||
@echo "After=network.target" >> $(SYSTEMD_DIR)/$(SERVICE_FILE)
|
||||
@echo "" >> $(SYSTEMD_DIR)/$(SERVICE_FILE)
|
||||
@echo "[Service]" >> $(SYSTEMD_DIR)/$(SERVICE_FILE)
|
||||
@echo "Type=oneshot" >> $(SYSTEMD_DIR)/$(SERVICE_FILE)
|
||||
@echo "ExecStart=$(PYTHON) $(INSTALL_DIR)/$(SCRIPT_NAME) -c $(CONFIG_FILE)" >> $(SYSTEMD_DIR)/$(SERVICE_FILE)
|
||||
@echo "StandardOutput=journal" >> $(SYSTEMD_DIR)/$(SERVICE_FILE)
|
||||
@echo "StandardError=journal" >> $(SYSTEMD_DIR)/$(SERVICE_FILE)
|
||||
@echo "User=root" >> $(SYSTEMD_DIR)/$(SERVICE_FILE)
|
||||
@echo "" >> $(SYSTEMD_DIR)/$(SERVICE_FILE)
|
||||
@echo "[Install]" >> $(SYSTEMD_DIR)/$(SERVICE_FILE)
|
||||
@echo "WantedBy=multi-user.target" >> $(SYSTEMD_DIR)/$(SERVICE_FILE)
|
||||
@echo "$(GREEN)✓ Service файл создан$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)→ Создание systemd timer...$(NC)"
|
||||
@echo "[Unit]" > $(SYSTEMD_DIR)/$(TIMER_FILE)
|
||||
@echo "Description=Daily Let's Encrypt Certificate Check and Renewal" >> $(SYSTEMD_DIR)/$(TIMER_FILE)
|
||||
@echo "Requires=$(SERVICE_FILE)" >> $(SYSTEMD_DIR)/$(TIMER_FILE)
|
||||
@echo "" >> $(SYSTEMD_DIR)/$(TIMER_FILE)
|
||||
@echo "[Timer]" >> $(SYSTEMD_DIR)/$(TIMER_FILE)
|
||||
@echo "OnCalendar=daily" >> $(SYSTEMD_DIR)/$(TIMER_FILE)
|
||||
@echo "Persistent=true" >> $(SYSTEMD_DIR)/$(TIMER_FILE)
|
||||
@echo "RandomizedDelaySec=1h" >> $(SYSTEMD_DIR)/$(TIMER_FILE)
|
||||
@echo "" >> $(SYSTEMD_DIR)/$(TIMER_FILE)
|
||||
@echo "[Install]" >> $(SYSTEMD_DIR)/$(TIMER_FILE)
|
||||
@echo "WantedBy=timers.target" >> $(SYSTEMD_DIR)/$(TIMER_FILE)
|
||||
@echo "$(GREEN)✓ Timer файл создан$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)→ Активация systemd службы...$(NC)"
|
||||
@systemctl daemon-reload
|
||||
@systemctl enable $(SERVICE_FILE) 2>/dev/null || true
|
||||
@systemctl enable $(TIMER_FILE) 2>/dev/null || true
|
||||
@systemctl start $(TIMER_FILE) 2>/dev/null || true
|
||||
@echo "$(GREEN)✓ Systemd служба активирована$(NC)"
|
||||
|
||||
# Установка cron задачи
|
||||
install-cron:
|
||||
@echo "$(YELLOW)→ Настройка cron задачи...$(NC)"
|
||||
@CRON_CMD="0 3 * * * $(PYTHON) $(INSTALL_DIR)/$(SCRIPT_NAME) -c $(CONFIG_FILE) >> $(CRON_LOG) 2>&1"; \
|
||||
(crontab -l 2>/dev/null | grep -v "$(SCRIPT_NAME)" ; echo "$$CRON_CMD") | crontab -
|
||||
@echo "$(GREEN)✓ Cron задача добавлена (ежедневно в 3:00 AM)$(NC)"
|
||||
|
||||
# ==============================================================================
|
||||
# Удаление
|
||||
# ==============================================================================
|
||||
|
||||
uninstall: check-root
|
||||
@echo "$(RED)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(RED)║ Удаление Let's Encrypt SSL Manager ║$(NC)"
|
||||
@echo "$(RED)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@printf "Вы уверены? Это удалит все файлы и настройки [y/N]: "; \
|
||||
read REPLY; \
|
||||
case "$$REPLY" in \
|
||||
[Yy]* ) \
|
||||
$(MAKE) remove-service; \
|
||||
$(MAKE) remove-cron; \
|
||||
$(MAKE) remove-files; \
|
||||
echo ""; \
|
||||
echo "$(GREEN)✓ Удаление завершено$(NC)"; \
|
||||
;; \
|
||||
* ) \
|
||||
echo "$(YELLOW)Удаление отменено$(NC)"; \
|
||||
;; \
|
||||
esac
|
||||
|
||||
# Удаление systemd service
|
||||
remove-service:
|
||||
@echo "$(YELLOW)→ Остановка и удаление systemd служб...$(NC)"
|
||||
@systemctl stop $(TIMER_FILE) 2>/dev/null || true
|
||||
@systemctl stop $(SERVICE_FILE) 2>/dev/null || true
|
||||
@systemctl disable $(TIMER_FILE) 2>/dev/null || true
|
||||
@systemctl disable $(SERVICE_FILE) 2>/dev/null || true
|
||||
@rm -f $(SYSTEMD_DIR)/$(SERVICE_FILE)
|
||||
@rm -f $(SYSTEMD_DIR)/$(TIMER_FILE)
|
||||
@systemctl daemon-reload
|
||||
@echo "$(GREEN)✓ Systemd службы удалены$(NC)"
|
||||
|
||||
# Удаление cron задачи
|
||||
remove-cron:
|
||||
@echo "$(YELLOW)→ Удаление cron задачи...$(NC)"
|
||||
@crontab -l 2>/dev/null | grep -v "$(SCRIPT_NAME)" | crontab - 2>/dev/null || true
|
||||
@echo "$(GREEN)✓ Cron задача удалена$(NC)"
|
||||
|
||||
# Удаление файлов
|
||||
remove-files:
|
||||
@echo "$(YELLOW)→ Удаление файлов...$(NC)"
|
||||
@rm -rf $(INSTALL_DIR)
|
||||
@echo "$(GREEN)✓ Директория $(INSTALL_DIR) удалена$(NC)"
|
||||
@echo ""
|
||||
@printf "Удалить конфигурацию $(CONFIG_FILE)? [y/N]: "; \
|
||||
read REPLY; \
|
||||
case "$$REPLY" in \
|
||||
[Yy]* ) \
|
||||
rm -f $(CONFIG_FILE); \
|
||||
echo "$(GREEN)✓ Конфигурация удалена$(NC)"; \
|
||||
;; \
|
||||
* ) \
|
||||
echo "$(YELLOW)Конфигурация сохранена$(NC)"; \
|
||||
;; \
|
||||
esac
|
||||
@echo ""
|
||||
@printf "Удалить логи? [y/N]: "; \
|
||||
read REPLY; \
|
||||
case "$$REPLY" in \
|
||||
[Yy]* ) \
|
||||
rm -f $(LOG_FILE) $(CRON_LOG); \
|
||||
echo "$(GREEN)✓ Логи удалены$(NC)"; \
|
||||
;; \
|
||||
* ) \
|
||||
echo "$(YELLOW)Логи сохранены$(NC)"; \
|
||||
;; \
|
||||
esac
|
||||
|
||||
# ==============================================================================
|
||||
# Утилиты
|
||||
# ==============================================================================
|
||||
|
||||
# Проверка статуса
|
||||
status:
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ Статус Let's Encrypt SSL Manager ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)→ Установка:$(NC)"
|
||||
@if [ -d "$(INSTALL_DIR)" ]; then \
|
||||
echo " $(GREEN)✓ Директория: $(INSTALL_DIR)$(NC)"; \
|
||||
else \
|
||||
echo " $(RED)✗ Директория не найдена$(NC)"; \
|
||||
fi
|
||||
@if [ -f "$(INSTALL_DIR)/$(SCRIPT_NAME)" ]; then \
|
||||
echo " $(GREEN)✓ Скрипт установлен$(NC)"; \
|
||||
else \
|
||||
echo " $(RED)✗ Скрипт не найден$(NC)"; \
|
||||
fi
|
||||
@if [ -f "$(CONFIG_FILE)" ]; then \
|
||||
echo " $(GREEN)✓ Конфигурация: $(CONFIG_FILE)$(NC)"; \
|
||||
else \
|
||||
echo " $(YELLOW)⚠ Конфигурация не найдена$(NC)"; \
|
||||
fi
|
||||
@echo ""
|
||||
@echo "$(YELLOW)→ Systemd служба:$(NC)"
|
||||
@systemctl is-enabled $(SERVICE_FILE) 2>/dev/null && echo " $(GREEN)✓ Service включен$(NC)" || echo " $(RED)✗ Service отключен$(NC)"
|
||||
@systemctl is-active $(SERVICE_FILE) 2>/dev/null && echo " $(GREEN)✓ Service активен$(NC)" || echo " $(YELLOW)⚠ Service неактивен (oneshot)$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)→ Systemd timer:$(NC)"
|
||||
@systemctl is-enabled $(TIMER_FILE) 2>/dev/null && echo " $(GREEN)✓ Timer включен$(NC)" || echo " $(RED)✗ Timer отключен$(NC)"
|
||||
@systemctl is-active $(TIMER_FILE) 2>/dev/null && echo " $(GREEN)✓ Timer активен$(NC)" || echo " $(RED)✗ Timer неактивен$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)→ Следующий запуск:$(NC)"
|
||||
@systemctl list-timers $(TIMER_FILE) --no-pager 2>/dev/null || echo " $(RED)✗ Timer не найден$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)→ Cron задача:$(NC)"
|
||||
@if crontab -l 2>/dev/null | grep -q "$(SCRIPT_NAME)"; then \
|
||||
echo " $(GREEN)✓ Cron задача настроена$(NC)"; \
|
||||
crontab -l 2>/dev/null | grep "$(SCRIPT_NAME)"; \
|
||||
else \
|
||||
echo " $(RED)✗ Cron задача не найдена$(NC)"; \
|
||||
fi
|
||||
|
||||
# Проверка конфигурации
|
||||
check-config:
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ Проверка конфигурации ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@if [ ! -f "$(CONFIG_FILE)" ]; then \
|
||||
echo "$(RED)✗ Конфигурация не найдена: $(CONFIG_FILE)$(NC)"; \
|
||||
echo "$(YELLOW)Совет: Скопируйте config.json.example в $(CONFIG_FILE)$(NC)"; \
|
||||
echo " $(CYAN)sudo cp config.json.example $(CONFIG_FILE)$(NC)"; \
|
||||
echo " $(CYAN)sudo chmod 644 $(CONFIG_FILE)$(NC)"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@echo "$(GREEN)✓ Конфигурация найдена$(NC)"
|
||||
@if [ ! -r "$(CONFIG_FILE)" ]; then \
|
||||
echo "$(RED)✗ Нет прав для чтения: $(CONFIG_FILE)$(NC)"; \
|
||||
echo "$(YELLOW)Решение: Запустите команду с sudo:$(NC)"; \
|
||||
echo " $(CYAN)sudo make check-config$(NC)"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@echo ""
|
||||
@$(PYTHON) -c "import json; print(json.dumps(json.load(open('$(CONFIG_FILE)')), indent=2, ensure_ascii=False))" 2>&1 || \
|
||||
(echo "$(RED)✗ Ошибка: Неверный формат JSON$(NC)"; \
|
||||
echo "$(YELLOW)Подробности:$(NC)"; \
|
||||
$(PYTHON) -c "import json; json.load(open('$(CONFIG_FILE)'))" 2>&1 | head -5; \
|
||||
exit 1)
|
||||
@echo ""
|
||||
@echo "$(YELLOW)→ Проверка обязательных параметров:$(NC)"
|
||||
@$(PYTHON) -c "import json; c=json.load(open('$(CONFIG_FILE)')); assert c.get('regru_username'), 'regru_username не задан'" && echo " $(GREEN)✓ regru_username$(NC)" || echo " $(RED)✗ regru_username$(NC)"
|
||||
@$(PYTHON) -c "import json; c=json.load(open('$(CONFIG_FILE)')); assert c.get('regru_password'), 'regru_password не задан'" && echo " $(GREEN)✓ regru_password$(NC)" || echo " $(RED)✗ regru_password$(NC)"
|
||||
@$(PYTHON) -c "import json; c=json.load(open('$(CONFIG_FILE)')); assert c.get('domain'), 'domain не задан'" && echo " $(GREEN)✓ domain$(NC)" || echo " $(RED)✗ domain$(NC)"
|
||||
@$(PYTHON) -c "import json; c=json.load(open('$(CONFIG_FILE)')); assert c.get('email'), 'email не задан'" && echo " $(GREEN)✓ email$(NC)" || echo " $(RED)✗ email$(NC)"
|
||||
|
||||
# Тестовый запуск
|
||||
test-run: check-root
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ Тестовый запуск скрипта ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@if [ ! -f "$(CONFIG_FILE)" ]; then \
|
||||
echo "$(RED)✗ Конфигурация не найдена. Запустите: make install$(NC)"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@echo "$(YELLOW)→ Запуск проверки сертификата...$(NC)"
|
||||
@echo ""
|
||||
@$(PYTHON) $(INSTALL_DIR)/$(SCRIPT_NAME) -c $(CONFIG_FILE) --check -v
|
||||
|
||||
# Просмотр логов
|
||||
logs:
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ Логи Let's Encrypt SSL Manager ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)→ Основной лог скрипта:$(NC)"
|
||||
@if [ -f "$(LOG_FILE)" ]; then \
|
||||
tail -n 50 $(LOG_FILE); \
|
||||
else \
|
||||
echo "$(YELLOW)Лог файл не найден$(NC)"; \
|
||||
fi
|
||||
@echo ""
|
||||
@echo "$(YELLOW)→ Лог cron задачи:$(NC)"
|
||||
@if [ -f "$(CRON_LOG)" ]; then \
|
||||
tail -n 50 $(CRON_LOG); \
|
||||
else \
|
||||
echo "$(YELLOW)Лог cron не найден$(NC)"; \
|
||||
fi
|
||||
@echo ""
|
||||
@echo "$(YELLOW)→ Логи systemd:$(NC)"
|
||||
@journalctl -u $(SERVICE_FILE) -n 50 --no-pager 2>/dev/null || echo "$(YELLOW)Логи systemd не найдены$(NC)"
|
||||
|
||||
# Ручной запуск обновления
|
||||
run: check-root
|
||||
@echo "$(YELLOW)→ Запуск обновления сертификата...$(NC)"
|
||||
@$(PYTHON) $(INSTALL_DIR)/$(SCRIPT_NAME) -c $(CONFIG_FILE) -v
|
||||
|
||||
# Принудительное получение сертификата
|
||||
obtain: check-root
|
||||
@echo "$(YELLOW)→ Принудительное получение нового сертификата...$(NC)"
|
||||
@$(PYTHON) $(INSTALL_DIR)/$(SCRIPT_NAME) -c $(CONFIG_FILE) --obtain -v
|
||||
|
||||
# Принудительное обновление сертификата
|
||||
renew: check-root
|
||||
@echo "$(YELLOW)→ Принудительное обновление сертификата...$(NC)"
|
||||
@$(PYTHON) $(INSTALL_DIR)/$(SCRIPT_NAME) -c $(CONFIG_FILE) --renew -v
|
||||
|
||||
# Создание тестового самоподписанного сертификата
|
||||
test-cert: check-root
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ Создание тестового самоподписанного сертификата ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)⚠️ ВНИМАНИЕ: Это тестовый сертификат для разработки!$(NC)"
|
||||
@echo "$(YELLOW) Браузеры будут показывать предупреждение безопасности.$(NC)"
|
||||
@echo "$(YELLOW) Для production используйте Let's Encrypt сертификаты.$(NC)"
|
||||
@echo ""
|
||||
@if [ ! -f "$(CONFIG_FILE)" ]; then \
|
||||
echo "$(RED)✗ Конфигурация не найдена. Запустите: make install$(NC)"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@echo "$(YELLOW)→ Генерация самоподписанного сертификата...$(NC)"
|
||||
@echo ""
|
||||
@$(PYTHON) $(INSTALL_DIR)/$(SCRIPT_NAME) -c $(CONFIG_FILE) --test-cert -v
|
||||
@echo ""
|
||||
@echo "$(GREEN)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(GREEN)║ ✓ Тестовый сертификат создан ║$(NC)"
|
||||
@echo "$(GREEN)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Преимущества тестового сертификата:$(NC)"
|
||||
@echo " • Нет ограничений Let's Encrypt (5 сертификатов в неделю)"
|
||||
@echo " • Мгновенное создание без DNS-валидации"
|
||||
@echo " • Идеально для тестирования интеграции с NPM"
|
||||
@echo " • Можно создавать неограниченное количество раз"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Примечание:$(NC)"
|
||||
@echo " Тестовый сертификат НЕ доверяется браузерами."
|
||||
@echo " Используйте только для локальной разработки и тестирования."
|
||||
@echo ""
|
||||
|
||||
# Очистка временных файлов
|
||||
clean:
|
||||
@echo "$(YELLOW)→ Очистка временных файлов...$(NC)"
|
||||
@find . -type f -name "*.pyc" -delete
|
||||
@find . -type d -name "__pycache__" -delete
|
||||
@echo "$(GREEN)✓ Очистка завершена$(NC)"
|
||||
|
||||
# ==============================================================================
|
||||
# Сборка исполняемых файлов с PyInstaller
|
||||
# ==============================================================================
|
||||
|
||||
# Установка PyInstaller
|
||||
install-pyinstaller:
|
||||
@echo "$(YELLOW)→ Установка PyInstaller...$(NC)"
|
||||
@if command -v pip3 >/dev/null 2>&1; then \
|
||||
pip3 install --upgrade pyinstaller; \
|
||||
elif command -v pip >/dev/null 2>&1; then \
|
||||
pip install --upgrade pyinstaller; \
|
||||
else \
|
||||
echo "$(RED)✗ pip не найден. Установите pip сначала.$(NC)"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@echo "$(GREEN)✓ PyInstaller установлен$(NC)"
|
||||
|
||||
# Сборка для текущей ОС
|
||||
build:
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ Сборка исполняемого файла для текущей ОС ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@if ! command -v $(PYINSTALLER) >/dev/null 2>&1; then \
|
||||
echo "$(YELLOW)PyInstaller не найден. Установка...$(NC)"; \
|
||||
$(MAKE) install-pyinstaller; \
|
||||
fi
|
||||
@echo "$(YELLOW)→ Компиляция $(SCRIPT_NAME) в исполняемый файл...$(NC)"
|
||||
@$(PYINSTALLER) --onefile \
|
||||
--name $(APP_NAME) \
|
||||
--add-data "README.md:." \
|
||||
--hidden-import requests \
|
||||
--hidden-import certbot \
|
||||
--hidden-import cryptography \
|
||||
--collect-all certbot \
|
||||
--noconfirm \
|
||||
$(SCRIPT_NAME)
|
||||
@echo ""
|
||||
@echo "$(GREEN)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(GREEN)║ ✓ Сборка завершена успешно! ║$(NC)"
|
||||
@echo "$(GREEN)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Исполняемый файл:$(NC)"
|
||||
@ls -lh $(DIST_DIR)/$(APP_NAME) 2>/dev/null || dir $(DIST_DIR)\$(APP_NAME).exe 2>/dev/null || echo " $(DIST_DIR)/$(APP_NAME)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Размер файла:$(NC)"
|
||||
@du -h $(DIST_DIR)/$(APP_NAME) 2>/dev/null || echo " ~40-60 MB (включая Python runtime и все библиотеки)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Примечание:$(NC)"
|
||||
@echo " • Исполняемый файл содержит весь Python runtime"
|
||||
@echo " • Certbot все равно должен быть установлен в системе"
|
||||
@echo " • Запускайте с sudo для работы с сертификатами"
|
||||
|
||||
# Сборка для Linux
|
||||
build-linux:
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ Сборка исполняемого файла для Linux ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@UNAME=$$(uname -s 2>/dev/null || echo "Unknown"); \
|
||||
if [ "$$UNAME" != "Linux" ]; then \
|
||||
echo "$(RED)ВНИМАНИЕ: Сборка на $$UNAME, но целевая ОС - Linux$(NC)"; \
|
||||
echo "$(YELLOW)Рекомендуется собирать на Linux для лучшей совместимости$(NC)"; \
|
||||
echo ""; \
|
||||
fi
|
||||
@if ! command -v $(PYINSTALLER) >/dev/null 2>&1; then \
|
||||
echo "$(YELLOW)PyInstaller не найден. Установка...$(NC)"; \
|
||||
$(MAKE) install-pyinstaller; \
|
||||
fi
|
||||
@echo "$(YELLOW)→ Компиляция для Linux (x86_64)...$(NC)"
|
||||
@$(PYINSTALLER) --onefile \
|
||||
--name $(APP_NAME) \
|
||||
--add-data "README.md:." \
|
||||
--hidden-import requests \
|
||||
--hidden-import certbot \
|
||||
--hidden-import cryptography \
|
||||
--collect-all certbot \
|
||||
--target-arch x86_64 \
|
||||
--noconfirm \
|
||||
$(SCRIPT_NAME)
|
||||
@echo ""
|
||||
@echo "$(GREEN)✓ Сборка для Linux завершена!$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Исполняемый файл:$(NC) $(DIST_DIR)/$(APP_NAME)"
|
||||
@file $(DIST_DIR)/$(APP_NAME) 2>/dev/null || echo " ELF 64-bit executable"
|
||||
@ls -lh $(DIST_DIR)/$(APP_NAME) 2>/dev/null || echo ""
|
||||
|
||||
# Сборка для Windows
|
||||
build-windows:
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ Сборка исполняемого файла для Windows ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@UNAME=$$(uname -s 2>/dev/null || echo "Windows"); \
|
||||
SEPARATOR=";"; \
|
||||
if [ "$$UNAME" = "Linux" ] || [ "$$UNAME" = "Darwin" ]; then \
|
||||
echo "$(RED)ВНИМАНИЕ: Кросс-компиляция для Windows из $$UNAME$(NC)"; \
|
||||
echo "$(YELLOW)Используем разделитель ':' вместо ';' для PyInstaller$(NC)"; \
|
||||
echo "$(YELLOW)Рекомендуется: собирайте на нативной Windows для лучших результатов$(NC)"; \
|
||||
echo ""; \
|
||||
SEPARATOR=":"; \
|
||||
fi; \
|
||||
if ! command -v $(PYINSTALLER) >/dev/null 2>&1; then \
|
||||
echo "$(YELLOW)PyInstaller не найден. Установка...$(NC)"; \
|
||||
$(MAKE) install-pyinstaller; \
|
||||
fi; \
|
||||
echo "$(YELLOW)→ Компиляция для Windows (x86_64) с разделителем $$SEPARATOR...$(NC)"; \
|
||||
$(PYINSTALLER) --onefile \
|
||||
--name $(APP_NAME) \
|
||||
--add-data "README.md$${SEPARATOR}." \
|
||||
--hidden-import requests \
|
||||
--hidden-import certbot \
|
||||
--hidden-import cryptography \
|
||||
--collect-all certbot \
|
||||
--icon NONE \
|
||||
--noconfirm \
|
||||
$(SCRIPT_NAME)
|
||||
@echo ""
|
||||
@echo "$(GREEN)✓ Сборка для Windows завершена!$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Исполняемый файл:$(NC) $(DIST_DIR)/$(APP_NAME).exe"
|
||||
@ls -lh $(DIST_DIR)/$(APP_NAME).exe 2>/dev/null || dir $(DIST_DIR)\$(APP_NAME).exe 2>/dev/null || echo ""
|
||||
|
||||
# Сборка для всех платформ
|
||||
build-all:
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ Сборка для всех платформ ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@echo "$(RED)⚠️ ВНИМАНИЕ: Кросс-компиляция Windows из Linux НЕ РАБОТАЕТ!$(NC)"
|
||||
@echo "$(YELLOW)→ PyInstaller не может создать .exe файл на Linux/macOS$(NC)"
|
||||
@echo "$(YELLOW)→ Для Windows сборки используйте нативную Windows систему$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Рекомендации:$(NC)"
|
||||
@echo " • Собирать Linux версию на Linux (работает ✓)"
|
||||
@echo " • Собирать Windows версию на Windows (обязательно!)"
|
||||
@echo " • Использовать GitHub Actions для автоматической сборки"
|
||||
@echo ""
|
||||
@$(MAKE) build-linux
|
||||
@echo ""
|
||||
@UNAME=$$(uname -s 2>/dev/null || echo "Windows"); \
|
||||
if [ "$$UNAME" != "Windows" ] && [ "$$UNAME" != "MINGW"* ] && [ "$$UNAME" != "MSYS"* ]; then \
|
||||
echo "$(YELLOW)Пропускаем Windows сборку (текущая ОС: $$UNAME)$(NC)"; \
|
||||
echo "$(YELLOW)Используйте Windows для создания .exe файла$(NC)"; \
|
||||
else \
|
||||
$(MAKE) build-windows; \
|
||||
fi
|
||||
@echo ""
|
||||
@echo "$(GREEN)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(GREEN)║ ✓ Сборка завершена! ║$(NC)"
|
||||
@echo "$(GREEN)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Файлы в директории $(DIST_DIR)/:$(NC)"
|
||||
@ls -lh $(DIST_DIR)/ 2>/dev/null || dir $(DIST_DIR) 2>/dev/null || echo " Проверьте $(DIST_DIR)/"
|
||||
|
||||
# Создание пакета для Linux (tar.gz)
|
||||
package-linux: build-linux
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ Создание пакета для Linux ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)→ Подготовка файлов...$(NC)"
|
||||
@mkdir -p $(DIST_DIR)/package
|
||||
@cp $(DIST_DIR)/$(APP_NAME) $(DIST_DIR)/package/
|
||||
@cp README.md $(DIST_DIR)/package/ 2>/dev/null || true
|
||||
@cp -r systemd $(DIST_DIR)/package/ 2>/dev/null || true
|
||||
@if [ -f "config.json.example" ]; then \
|
||||
cp config.json.example $(DIST_DIR)/package/; \
|
||||
fi
|
||||
@echo "$(YELLOW)→ Создание архива...$(NC)"
|
||||
@cd $(DIST_DIR)/package && tar -czf ../$(APP_NAME)-linux-x86_64.tar.gz *
|
||||
@rm -rf $(DIST_DIR)/package
|
||||
@echo ""
|
||||
@echo "$(GREEN)✓ Пакет создан:$(NC) $(DIST_DIR)/$(APP_NAME)-linux-x86_64.tar.gz"
|
||||
@ls -lh $(DIST_DIR)/$(APP_NAME)-linux-x86_64.tar.gz
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Содержимое пакета:$(NC)"
|
||||
@tar -tzf $(DIST_DIR)/$(APP_NAME)-linux-x86_64.tar.gz | head -10
|
||||
|
||||
# Создание пакета для Windows (zip)
|
||||
package-windows: build-windows
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ Создание пакета для Windows ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@if [ ! -f "$(DIST_DIR)/$(APP_NAME).exe" ]; then \
|
||||
echo "$(RED)✗ Ошибка: Файл $(APP_NAME).exe не найден$(NC)"; \
|
||||
echo "$(YELLOW)⚠️ Кросс-компиляция для Windows из Linux/macOS не создает .exe файл!$(NC)"; \
|
||||
echo "$(YELLOW)→ Используйте нативную Windows систему для сборки Windows версии$(NC)"; \
|
||||
echo ""; \
|
||||
exit 1; \
|
||||
fi
|
||||
@echo "$(YELLOW)→ Подготовка файлов...$(NC)"
|
||||
@mkdir -p $(DIST_DIR)/package
|
||||
@cp $(DIST_DIR)/$(APP_NAME).exe $(DIST_DIR)/package/
|
||||
@cp README.md $(DIST_DIR)/package/ 2>/dev/null || true
|
||||
@if [ -f "config.json.example" ]; then cp config.json.example $(DIST_DIR)/package/; fi
|
||||
@echo "$(YELLOW)→ Создание архива (tar.gz)...$(NC)"
|
||||
@cd $(DIST_DIR)/package && tar -czf ../$(APP_NAME)-windows-x86_64.tar.gz *
|
||||
@rm -rf $(DIST_DIR)/package
|
||||
@echo ""
|
||||
@echo "$(GREEN)✓ Пакет создан:$(NC) $(DIST_DIR)/$(APP_NAME)-windows-x86_64.tar.gz"
|
||||
@ls -lh $(DIST_DIR)/$(APP_NAME)-windows-x86_64.tar.gz
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Содержимое пакета:$(NC)"
|
||||
@tar -tzf $(DIST_DIR)/$(APP_NAME)-windows-x86_64.tar.gz | head -10
|
||||
|
||||
# Полный цикл релиза
|
||||
release:
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ ПОЛНЫЙ ЦИКЛ РЕЛИЗА ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@$(MAKE) clean-build
|
||||
@$(MAKE) install-pyinstaller
|
||||
@$(MAKE) build-all
|
||||
@$(MAKE) package-linux
|
||||
@$(MAKE) package-windows
|
||||
@echo ""
|
||||
@echo "$(GREEN)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(GREEN)║ ✓ РЕЛИЗ ГОТОВ! ║$(NC)"
|
||||
@echo "$(GREEN)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Артефакты релиза:$(NC)"
|
||||
@ls -lh $(DIST_DIR)/*.tar.gz $(DIST_DIR)/*.zip 2>/dev/null || dir $(DIST_DIR)\*.zip 2>/dev/null || echo " Проверьте $(DIST_DIR)/"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Контрольные суммы SHA256:$(NC)"
|
||||
@cd $(DIST_DIR) && sha256sum *.tar.gz *.zip 2>/dev/null || \
|
||||
cd $(DIST_DIR) && certutil -hashfile $(APP_NAME)-windows-x86_64.zip SHA256 2>/dev/null || \
|
||||
echo " Используйте sha256sum или certutil для проверки контрольных сумм"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Следующие шаги:$(NC)"
|
||||
@echo " 1. Протестируйте исполняемые файлы"
|
||||
@echo " 2. Создайте GitHub Release"
|
||||
@echo " 3. Загрузите пакеты как Assets"
|
||||
|
||||
# Тестирование собранного файла
|
||||
test-build:
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ Тестирование собранного файла ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@if [ -f "$(DIST_DIR)/$(APP_NAME)" ]; then \
|
||||
echo "$(YELLOW)→ Тестирование Linux версии...$(NC)"; \
|
||||
chmod +x $(DIST_DIR)/$(APP_NAME); \
|
||||
$(DIST_DIR)/$(APP_NAME) --help; \
|
||||
echo ""; \
|
||||
echo "$(GREEN)✓ Linux версия работает$(NC)"; \
|
||||
elif [ -f "$(DIST_DIR)/$(APP_NAME).exe" ]; then \
|
||||
echo "$(YELLOW)→ Тестирование Windows версии...$(NC)"; \
|
||||
$(DIST_DIR)/$(APP_NAME).exe --help; \
|
||||
echo ""; \
|
||||
echo "$(GREEN)✓ Windows версия работает$(NC)"; \
|
||||
else \
|
||||
echo "$(RED)✗ Исполняемый файл не найден$(NC)"; \
|
||||
echo "$(YELLOW)Запустите 'make build' сначала$(NC)"; \
|
||||
exit 1; \
|
||||
fi
|
||||
|
||||
# Очистка артефактов сборки
|
||||
clean-build:
|
||||
@echo "$(YELLOW)→ Очистка артефактов сборки...$(NC)"
|
||||
@rm -rf $(BUILD_DIR_PY) $(DIST_DIR) $(SPEC_FILE) __pycache__ *.pyc
|
||||
@echo "$(GREEN)✓ Артефакты сборки удалены$(NC)"
|
||||
|
||||
# Информация о среде сборки
|
||||
build-info:
|
||||
@echo "$(BLUE)╔════════════════════════════════════════════════════════════════╗$(NC)"
|
||||
@echo "$(BLUE)║ Информация о среде сборки ║$(NC)"
|
||||
@echo "$(BLUE)╚════════════════════════════════════════════════════════════════╝$(NC)"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Система:$(NC)"
|
||||
@echo " ОС: $$(uname -s 2>/dev/null || echo 'Windows')"
|
||||
@echo " Архитектура: $$(uname -m 2>/dev/null || echo 'x86_64')"
|
||||
@echo " Ядро: $$(uname -r 2>/dev/null || echo 'N/A')"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Python:$(NC)"
|
||||
@echo " Версия: $$($(PYTHON) --version 2>&1)"
|
||||
@echo " Путь: $$(which $(PYTHON) 2>/dev/null || where $(PYTHON) 2>/dev/null || echo 'N/A')"
|
||||
@echo ""
|
||||
@echo "$(YELLOW)PyInstaller:$(NC)"
|
||||
@if command -v $(PYINSTALLER) >/dev/null 2>&1; then \
|
||||
echo " Версия: $$($(PYINSTALLER) --version 2>&1)"; \
|
||||
echo " Путь: $$(which $(PYINSTALLER) 2>/dev/null || where $(PYINSTALLER) 2>/dev/null)"; \
|
||||
echo " $(GREEN)✓ Установлен$(NC)"; \
|
||||
else \
|
||||
echo " $(RED)✗ Не установлен$(NC)"; \
|
||||
echo " Установите: make install-pyinstaller"; \
|
||||
fi
|
||||
@echo ""
|
||||
@echo "$(YELLOW)Конфигурация сборки:$(NC)"
|
||||
@echo " Исходный файл: $(SCRIPT_NAME)"
|
||||
@echo " Название приложения: $(APP_NAME)"
|
||||
@echo " Директория сборки: $(DIST_DIR)/"
|
||||
@echo ""
|
||||
|
||||
# По умолчанию показываем помощь
|
||||
.DEFAULT_GOAL := help
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"regru_username": "your_username",
|
||||
"regru_password": "your_password",
|
||||
"domain": "dfv24.com",
|
||||
"domains": [
|
||||
"dfv24.com",
|
||||
"pages.github.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,
|
||||
"renewal_days": 30,
|
||||
"npm_enabled": true,
|
||||
"npm_host": "http://192.168.10.14:81",
|
||||
"npm_email": "admin@example.com",
|
||||
"npm_password": "changeme"
|
||||
}
|
||||
@@ -0,0 +1,206 @@
|
||||
# 🔧 reg.ru API Troubleshooting Guide
|
||||
|
||||
## ❌ Issue: "Access to API from this IP denied"
|
||||
|
||||
This error occurs when reg.ru API is blocked for your IP address due to security settings.
|
||||
|
||||
### 🔍 Diagnostics
|
||||
|
||||
First, determine your current IP address:
|
||||
|
||||
```bash
|
||||
# Method 1: Using script's built-in function
|
||||
sudo letsencrypt-regru --test-api
|
||||
|
||||
# Method 2: Using curl
|
||||
curl -s https://ipinfo.io/ip
|
||||
|
||||
# Method 3: Using website
|
||||
# Open https://whatismyipaddress.com/
|
||||
```
|
||||
|
||||
### ✅ Solution
|
||||
|
||||
#### Method 1: Add IP to whitelist (recommended)
|
||||
|
||||
1. **Login to reg.ru control panel**
|
||||
- Open https://www.reg.ru/
|
||||
- Login to your account
|
||||
|
||||
2. **Navigate to API settings**
|
||||
- Menu → "Settings" (Настройки)
|
||||
- Section "Security" (Безопасность)
|
||||
- Subsection "API"
|
||||
|
||||
3. **Configure IP access**
|
||||
- Find "IP Restrictions" section
|
||||
- Click "Add IP address"
|
||||
- Enter your current IP address
|
||||
- Save settings
|
||||
|
||||
4. **Test settings**
|
||||
```bash
|
||||
sudo letsencrypt-regru --test-api
|
||||
```
|
||||
|
||||
#### Method 2: Disable IP restrictions (less secure)
|
||||
|
||||
⚠️ **WARNING**: This reduces your account security!
|
||||
|
||||
1. In reg.ru API settings find "IP Restrictions"
|
||||
2. Disable "Allow access only from specified IPs" option
|
||||
3. Save settings
|
||||
|
||||
### 🔒 Security Recommendations
|
||||
|
||||
1. **Use static IP**
|
||||
- If you have dynamic IP, consider purchasing static IP
|
||||
- Or regularly update allowed IP list
|
||||
|
||||
2. **Limit API access**
|
||||
- Add only necessary IP addresses
|
||||
- Regularly review and clean up the list
|
||||
|
||||
3. **Use strong passwords**
|
||||
- Complex password for reg.ru account
|
||||
- Two-factor authentication if available
|
||||
|
||||
## ❌ Issue: "Invalid username or password"
|
||||
|
||||
### ✅ Solution
|
||||
|
||||
1. **Check credentials**
|
||||
```bash
|
||||
sudo nano /etc/letsencrypt-regru/config.json
|
||||
```
|
||||
|
||||
Make sure you have correct:
|
||||
- `regru_username` - reg.ru login
|
||||
- `regru_password` - reg.ru password
|
||||
|
||||
2. **Check file permissions**
|
||||
```bash
|
||||
sudo chmod 600 /etc/letsencrypt-regru/config.json
|
||||
sudo chown root:root /etc/letsencrypt-regru/config.json
|
||||
```
|
||||
|
||||
3. **Test connection**
|
||||
```bash
|
||||
sudo letsencrypt-regru --test-api
|
||||
```
|
||||
|
||||
## ❌ Issue: "IP exceeded allowed connection rate"
|
||||
|
||||
### Cause
|
||||
Reg.ru API limits request frequency from single IP (typically 10-20 requests per minute).
|
||||
|
||||
### ✅ Solution
|
||||
|
||||
1. **Wait 5-10 minutes**
|
||||
```bash
|
||||
# Wait before next attempt
|
||||
sleep 600 # 10 minutes
|
||||
sudo letsencrypt-regru --obtain
|
||||
```
|
||||
|
||||
2. **Configure automation properly**
|
||||
```bash
|
||||
# Check certificates once per day
|
||||
sudo systemctl enable letsencrypt-regru.timer
|
||||
sudo systemctl start letsencrypt-regru.timer
|
||||
|
||||
# Check schedule
|
||||
sudo systemctl cat letsencrypt-regru.timer
|
||||
```
|
||||
|
||||
3. **Request frequency recommendations**
|
||||
- ✅ Automatic check: **once per day**
|
||||
- ✅ Manual check: **no more than once per hour**
|
||||
- ❌ Avoid frequent `--test-api` tests
|
||||
- ❌ Don't create frequent cron jobs
|
||||
|
||||
4. **Use --check instead of --obtain**
|
||||
```bash
|
||||
# Check without creating certificate
|
||||
sudo letsencrypt-regru --check
|
||||
```
|
||||
|
||||
## ❌ Issue: Connection timeout
|
||||
|
||||
### ✅ Solution
|
||||
|
||||
1. **Check internet connection**
|
||||
```bash
|
||||
ping -c 4 api.reg.ru
|
||||
curl -I https://api.reg.ru/api/regru2
|
||||
```
|
||||
|
||||
2. **Check firewall**
|
||||
```bash
|
||||
# Temporarily disable firewall for testing
|
||||
sudo ufw status
|
||||
sudo iptables -L
|
||||
```
|
||||
|
||||
3. **Check proxy settings**
|
||||
- Ensure `HTTP_PROXY`, `HTTPS_PROXY` environment variables don't interfere
|
||||
|
||||
## 🧪 API Testing
|
||||
|
||||
Always test API before use:
|
||||
|
||||
```bash
|
||||
# Full API test
|
||||
sudo letsencrypt-regru --test-api
|
||||
|
||||
# Test with verbose output
|
||||
sudo letsencrypt-regru --test-api -v
|
||||
|
||||
# Check configuration
|
||||
sudo letsencrypt-regru --check
|
||||
```
|
||||
|
||||
## 📞 Getting Help
|
||||
|
||||
### reg.ru Technical Support
|
||||
|
||||
- **Email**: support@reg.ru
|
||||
- **Phone**: 8 (495) 580-11-11
|
||||
- **Online chat**: on reg.ru website
|
||||
|
||||
### Documentation
|
||||
|
||||
- **reg.ru API**: https://www.reg.ru/support/api
|
||||
- **Usage examples**: https://www.reg.ru/support/api/examples
|
||||
- **API FAQ**: https://www.reg.ru/support/api/faq
|
||||
|
||||
### Diagnostic Logs
|
||||
|
||||
Always include logs when contacting support:
|
||||
|
||||
```bash
|
||||
# Enable verbose logs
|
||||
sudo letsencrypt-regru --test-api -v
|
||||
|
||||
# View recent logs
|
||||
sudo tail -n 50 /var/log/letsencrypt-regru/letsencrypt_regru.log
|
||||
|
||||
# Certbot logs
|
||||
sudo tail -n 50 /var/log/letsencrypt/letsencrypt.log
|
||||
```
|
||||
|
||||
## 🔄 Alternative DNS Providers
|
||||
|
||||
If reg.ru API issues are critical, consider alternatives:
|
||||
|
||||
1. **Cloudflare** - excellent API, free DNS
|
||||
2. **Route53** (AWS) - powerful but paid
|
||||
3. **DigitalOcean DNS** - simple and reliable
|
||||
4. **Google Cloud DNS** - GCP integration
|
||||
|
||||
These require script modification or other certbot plugins.
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: October 29, 2025
|
||||
**Document Version**: 1.0
|
||||
@@ -0,0 +1,56 @@
|
||||
# Guide to Creating Let's Encrypt Certificate with DNS Challenge for reg.ru Provider in Nginx Proxy Manager
|
||||
|
||||
---
|
||||
|
||||
## Prerequisites
|
||||
- Access to Nginx Proxy Manager (NPM)
|
||||
- Access to reg.ru account with DNS management permissions
|
||||
- API key for DNS management in reg.ru (if automatic integration is available)
|
||||
- Need to obtain certificate for `*.dfv24.com` (wildcard certificate)
|
||||
|
||||
---
|
||||
|
||||
## Step 1. Getting API Key for reg.ru
|
||||
|
||||
1. Log in to reg.ru control panel
|
||||
2. Navigate to API management section (if supported)
|
||||
3. Create or find API key with DNS records editing permissions
|
||||
4. Save API key and secret (Client ID and API Token)
|
||||
|
||||
---
|
||||
|
||||
## Step 2. Configuring Nginx Proxy Manager to Use DNS Challenge reg.ru
|
||||
|
||||
1. In NPM admin panel, go to **SSL Certificates → Add SSL Certificate**
|
||||
2. Select **Let's Encrypt** -> **DNS Challenge**
|
||||
3. In **Provider** field, select `reg_ru` or `custom` (if provider not available, script will be needed)
|
||||
4. Fill in API fields with required parameters:
|
||||
- Client ID
|
||||
- API Token
|
||||
5. In **Domain Names** field, specify:
|
||||
`*.dfv24.com` (for wildcard certificate)
|
||||
and main domain `dfv24.com`
|
||||
6. Enable other options (Terms of Service, Email)
|
||||
7. Click **Save** to request certificate
|
||||
8. NPM will automatically add DNS TXT records for domain ownership verification through reg.ru API
|
||||
|
||||
---
|
||||
|
||||
## Step 3. Verification and Automatic Renewal
|
||||
|
||||
- After successful certificate creation, NPM will automatically renew it through DNS Challenge.
|
||||
- For successful renewal, it's important that API key remains valid and NPM has access to DNS management.
|
||||
|
||||
---
|
||||
|
||||
## If NPM Doesn't Have Ready Integration with reg.ru
|
||||
|
||||
- Use external script to update DNS TXT records in reg.ru, configured in NPM through **Custom DNS Provider**.
|
||||
- Configure curl requests to reg.ru API for adding/removing TXT records.
|
||||
|
||||
---
|
||||
|
||||
# Summary
|
||||
|
||||
For Let's Encrypt wildcard certificates with reg.ru, DNS Challenge must be used with provider's API for automatic DNS record management.
|
||||
In Nginx Proxy Manager, configure DNS Challenge considering reg.ru specifics for seamless certificate obtaining and renewal.
|
||||
@@ -0,0 +1,455 @@
|
||||
# 🔨 Executable Build Guide
|
||||
|
||||
This guide describes the process of compiling the `letsencrypt_regru_api.py` Python script into executable files for Linux and Windows using PyInstaller.
|
||||
|
||||
## 📋 Table of Contents
|
||||
|
||||
- [Advantages of Executable Files](#advantages-of-executable-files)
|
||||
- [Quick Start](#quick-start)
|
||||
- [Detailed Instructions](#detailed-instructions)
|
||||
- [Cross-Compilation](#cross-compilation)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
|
||||
---
|
||||
|
||||
## ✅ Advantages of Executable Files
|
||||
|
||||
### Pros:
|
||||
- ✅ **Single file** - easy to distribute and deploy
|
||||
- ✅ **Standalone** - no Python installation required on target system
|
||||
- ✅ **All dependencies included** - requests, cryptography, and certbot modules are bundled
|
||||
- ✅ **Simple execution** - just download and run
|
||||
|
||||
### Cons:
|
||||
- ❌ **Large size** - ~40-60 MB (including Python runtime and libraries)
|
||||
- ❌ **Certbot dependency** - system certbot is still required
|
||||
- ❌ **Slow first launch** - unpacking takes a few seconds
|
||||
- ❌ **Rebuild required** - code changes require recompilation
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Quick Start
|
||||
|
||||
### Build for current OS:
|
||||
```bash
|
||||
make build
|
||||
```
|
||||
|
||||
### Build for all platforms:
|
||||
```bash
|
||||
make build-all
|
||||
```
|
||||
|
||||
### Full release (build + packages):
|
||||
```bash
|
||||
make release
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📖 Detailed Instructions
|
||||
|
||||
### 1. Install Dependencies
|
||||
|
||||
#### Option A: Automatic Installation
|
||||
```bash
|
||||
make install-pyinstaller
|
||||
```
|
||||
|
||||
#### Option B: Manual Installation
|
||||
```bash
|
||||
pip install pyinstaller
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### 2. Build for Linux
|
||||
|
||||
**On Linux system:**
|
||||
```bash
|
||||
make build-linux
|
||||
```
|
||||
|
||||
**Result:**
|
||||
- File: `dist/letsencrypt-regru`
|
||||
- Size: ~45-55 MB
|
||||
- Format: ELF 64-bit executable
|
||||
|
||||
**Testing:**
|
||||
```bash
|
||||
./dist/letsencrypt-regru --help
|
||||
sudo ./dist/letsencrypt-regru --check -c /etc/letsencrypt-regru/config.json
|
||||
```
|
||||
|
||||
### 3. Build for Windows
|
||||
|
||||
**On Windows system (PowerShell/CMD):**
|
||||
```bash
|
||||
make build-windows
|
||||
```
|
||||
|
||||
**Result:**
|
||||
- File: `dist/letsencrypt-regru.exe`
|
||||
- Size: ~40-50 MB
|
||||
- Format: PE32+ executable (Windows)
|
||||
|
||||
**Testing:**
|
||||
```powershell
|
||||
.\dist\letsencrypt-regru.exe --help
|
||||
```
|
||||
|
||||
### 4. Create Distribution Packages
|
||||
|
||||
#### Linux package (tar.gz):
|
||||
```bash
|
||||
make package-linux
|
||||
```
|
||||
|
||||
**Package contents:**
|
||||
- `letsencrypt-regru` - executable file
|
||||
- `README.md` - documentation
|
||||
- `systemd/` - systemd unit files
|
||||
- `config.json.example` - configuration example
|
||||
|
||||
**Result:** `dist/letsencrypt-regru-linux-x86_64.tar.gz`
|
||||
|
||||
#### Windows package (zip):
|
||||
```bash
|
||||
make package-windows
|
||||
```
|
||||
|
||||
**Result:** `dist/letsencrypt-regru-windows-x86_64.zip`
|
||||
|
||||
### 5. Full Release Cycle
|
||||
|
||||
Create release with all artifacts:
|
||||
|
||||
```bash
|
||||
make release
|
||||
```
|
||||
|
||||
**What happens:**
|
||||
1. Clean old artifacts (`clean-build`)
|
||||
2. Install/update PyInstaller
|
||||
3. Build for Linux (`build-linux`)
|
||||
4. Build for Windows (`build-windows`)
|
||||
5. Create Linux package (`package-linux`)
|
||||
6. Create Windows package (`package-windows`)
|
||||
7. Generate SHA256 checksums
|
||||
|
||||
**Result in `dist/`:**
|
||||
```
|
||||
letsencrypt-regru # Linux executable
|
||||
letsencrypt-regru.exe # Windows executable
|
||||
letsencrypt-regru-linux-x86_64.tar.gz
|
||||
letsencrypt-regru-windows-x86_64.zip
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Cross-Compilation
|
||||
|
||||
### ⚠️ Important Notes
|
||||
|
||||
**Not recommended:**
|
||||
- Building Linux version on Windows
|
||||
- Building Windows version on Linux
|
||||
- Building macOS version on other OSes
|
||||
|
||||
**Reasons:**
|
||||
- System library incompatibility
|
||||
- Different executable formats
|
||||
- Path and separator issues
|
||||
|
||||
### Recommendations
|
||||
|
||||
#### For Linux builds:
|
||||
1. Use Ubuntu 20.04+ or Debian 10+
|
||||
2. Install build-essential
|
||||
3. Use Python virtual environment
|
||||
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y python3 python3-pip build-essential
|
||||
make build-linux
|
||||
```
|
||||
|
||||
#### For Windows builds:
|
||||
1. Use Windows 10/11
|
||||
2. Install Python 3.8+
|
||||
3. Use PowerShell or CMD
|
||||
|
||||
```powershell
|
||||
python -m pip install --upgrade pip
|
||||
make build-windows
|
||||
```
|
||||
|
||||
#### For both platforms:
|
||||
Use CI/CD (GitHub Actions, GitLab CI):
|
||||
|
||||
```yaml
|
||||
# .github/workflows/build.yml
|
||||
name: Build Releases
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*'
|
||||
|
||||
jobs:
|
||||
build-linux:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Build Linux
|
||||
run: make build-linux
|
||||
|
||||
build-windows:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Build Windows
|
||||
run: make build-windows
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ All Makefile Commands
|
||||
|
||||
### Main Commands:
|
||||
|
||||
| Command | Description |
|
||||
|---------|-------------|
|
||||
| `make build` | Build for current OS |
|
||||
| `make build-linux` | Build for Linux |
|
||||
| `make build-windows` | Build for Windows |
|
||||
| `make build-all` | Build for all platforms |
|
||||
| `make package-linux` | Create tar.gz package |
|
||||
| `make package-windows` | Create zip package |
|
||||
| `make release` | Full release cycle |
|
||||
|
||||
### Supporting Commands:
|
||||
|
||||
| Command | Description |
|
||||
|---------|-------------|
|
||||
| `make install-pyinstaller` | Install PyInstaller |
|
||||
| `make test-build` | Test built file |
|
||||
| `make clean-build` | Clean build artifacts |
|
||||
| `make build-info` | Show environment info |
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
### Issue: PyInstaller not found
|
||||
|
||||
**Error:**
|
||||
```
|
||||
make: pyinstaller: Command not found
|
||||
```
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
make install-pyinstaller
|
||||
# or
|
||||
pip install pyinstaller
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Issue: Module imports not working
|
||||
|
||||
**Error:**
|
||||
```
|
||||
ModuleNotFoundError: No module named 'requests'
|
||||
```
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
# or add to PyInstaller command:
|
||||
--hidden-import requests
|
||||
--hidden-import certbot
|
||||
--hidden-import cryptography
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Issue: Large file size
|
||||
|
||||
**Size ~100+ MB instead of 40-60 MB**
|
||||
|
||||
**Causes:**
|
||||
- Extra modules included
|
||||
- Not using `--onefile`
|
||||
- Debug symbols included
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Use optimization flags:
|
||||
pyinstaller --onefile \
|
||||
--strip \
|
||||
--exclude-module tkinter \
|
||||
--exclude-module matplotlib \
|
||||
letsencrypt_regru_api.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Issue: Certbot not working in executable
|
||||
|
||||
**Error:**
|
||||
```
|
||||
certbot: command not found
|
||||
```
|
||||
|
||||
**Solution:**
|
||||
|
||||
Certbot is called via `subprocess` and must be installed on the system:
|
||||
|
||||
**Linux:**
|
||||
```bash
|
||||
sudo apt-get install certbot
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
- Not directly supported
|
||||
- Use WSL or Docker
|
||||
|
||||
---
|
||||
|
||||
### Issue: File permission errors
|
||||
|
||||
**Error:**
|
||||
```
|
||||
Permission denied: /etc/letsencrypt/
|
||||
```
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Linux/macOS
|
||||
sudo ./dist/letsencrypt-regru --check
|
||||
|
||||
# Or set proper permissions:
|
||||
sudo chmod +x ./dist/letsencrypt-regru
|
||||
sudo chown root:root ./dist/letsencrypt-regru
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Issue: Slow startup
|
||||
|
||||
**First launch takes 5-10 seconds**
|
||||
|
||||
**Reason:**
|
||||
PyInstaller unpacks files to temporary directory on each run.
|
||||
|
||||
**Solution:**
|
||||
- This is normal behavior for `--onefile`
|
||||
- Use `--onedir` for faster startup (but many files)
|
||||
- Temporary directory is cached automatically
|
||||
|
||||
---
|
||||
|
||||
### Issue: Antivirus blocking file
|
||||
|
||||
**Windows Defender marks .exe as virus**
|
||||
|
||||
**Reasons:**
|
||||
- Self-extracting archive looks like malware
|
||||
- No digital signature
|
||||
- Unknown executable file
|
||||
|
||||
**Solution:**
|
||||
1. **Add to exclusions:**
|
||||
- Windows Defender → Settings → Exclusions
|
||||
|
||||
2. **Sign file with digital signature:**
|
||||
```bash
|
||||
# Requires Code Signing certificate
|
||||
signtool sign /f cert.pfx /p password dist/letsencrypt-regru.exe
|
||||
```
|
||||
|
||||
3. **Check on VirusTotal:**
|
||||
- Upload file to virustotal.com
|
||||
- Add results to README
|
||||
|
||||
---
|
||||
|
||||
## 📊 Comparison: Python vs Executable
|
||||
|
||||
| Feature | Python Script | Executable File |
|
||||
|---------|---------------|-----------------|
|
||||
| Size | ~50 KB | ~40-60 MB |
|
||||
| Dependencies | Requires Python + pip | Standalone |
|
||||
| Startup Speed | Fast (~1 sec) | Slow (~5-10 sec) |
|
||||
| Updates | Just replace .py | Requires rebuild |
|
||||
| Compatibility | Any OS with Python | Only target OS |
|
||||
| Installation | Requires venv setup | Download and run |
|
||||
| Certbot | Via subprocess | Via subprocess |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Recommendations
|
||||
|
||||
### Use Python script if:
|
||||
- ✅ Python already installed on system
|
||||
- ✅ Frequent code updates needed
|
||||
- ✅ Using virtual environment
|
||||
- ✅ Working on servers (production)
|
||||
|
||||
### Use executable file if:
|
||||
- ✅ Python not installed
|
||||
- ✅ Simple deployment needed
|
||||
- ✅ Distributing to end users
|
||||
- ✅ Testing on clean systems
|
||||
|
||||
---
|
||||
|
||||
## 📦 Using Built File Examples
|
||||
|
||||
### Linux:
|
||||
|
||||
```bash
|
||||
# Download and extract
|
||||
wget https://github.com/user/repo/releases/download/v1.0/letsencrypt-regru-linux-x86_64.tar.gz
|
||||
tar -xzf letsencrypt-regru-linux-x86_64.tar.gz
|
||||
|
||||
# Install
|
||||
sudo mv letsencrypt-regru /usr/local/bin/
|
||||
sudo chmod +x /usr/local/bin/letsencrypt-regru
|
||||
|
||||
# Use
|
||||
sudo letsencrypt-regru --help
|
||||
sudo letsencrypt-regru --check -c /etc/letsencrypt-regru/config.json
|
||||
```
|
||||
|
||||
### Windows:
|
||||
|
||||
```powershell
|
||||
# Download and extract
|
||||
Invoke-WebRequest -Uri "https://github.com/user/repo/releases/download/v1.0/letsencrypt-regru-windows-x86_64.zip" -OutFile "letsencrypt-regru.zip"
|
||||
Expand-Archive -Path letsencrypt-regru.zip -DestinationPath "C:\Program Files\LetsEncrypt-RegRu"
|
||||
|
||||
# Use
|
||||
cd "C:\Program Files\LetsEncrypt-RegRu"
|
||||
.\letsencrypt-regru.exe --help
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Additional Resources
|
||||
|
||||
- [PyInstaller Documentation](https://pyinstaller.org/en/stable/)
|
||||
- [PyInstaller FAQ](https://pyinstaller.org/en/stable/FAQ.html)
|
||||
- [Building Cross-Platform Applications](https://pyinstaller.org/en/stable/operating-mode.html)
|
||||
|
||||
---
|
||||
|
||||
## 📄 License
|
||||
|
||||
This project uses the license as specified in the main README.md.
|
||||
|
||||
---
|
||||
|
||||
**Author:** Dmitry Fofanov
|
||||
**Last Updated:** October 28, 2025
|
||||
@@ -0,0 +1,187 @@
|
||||
# 📋 Changelog
|
||||
|
||||
## [2.1.0] - 2025-10-27
|
||||
|
||||
### 🆕 Added
|
||||
|
||||
#### Test SSL Certificate Generation
|
||||
- ✨ **New `TestCertificateGenerator` class** - self-signed certificate generation
|
||||
- ✨ **`--test-cert` command** in Python script for test certificate creation
|
||||
- ✨ **`test_certificate.sh` script** - standalone creation via OpenSSL
|
||||
- ✨ **`make test-cert` command** in Makefile for quick testing
|
||||
|
||||
#### Documentation
|
||||
- 📘 **TESTING_GUIDE.md** (370+ lines) - complete testing guide
|
||||
- Bypass Let's Encrypt limits (5 certificates per week)
|
||||
- Certificate creation method comparison
|
||||
- CI/CD and Docker examples
|
||||
- Transition from test to production
|
||||
- FAQ and solutions
|
||||
|
||||
- 📘 **TESTING_GUIDE_EN.md** - English version of testing guide
|
||||
|
||||
- 📘 **PROJECT_STRUCTURE.md** - project structure
|
||||
- All files description
|
||||
- Features list
|
||||
- Technologies
|
||||
|
||||
- 📘 **PROJECT_STRUCTURE_EN.md** - English version
|
||||
|
||||
- 📘 **CHEATSHEET.md** - quick reference
|
||||
- Main commands
|
||||
- Use case scenarios
|
||||
- Common errors and solutions
|
||||
- Development workflow
|
||||
|
||||
- 📘 **CHEATSHEET_EN.md** - English version
|
||||
|
||||
- 📘 **DESCRIPTION.md** - project description in Russian and English
|
||||
|
||||
- 📘 **CHANGELOG_EN.md** - English changelog
|
||||
|
||||
- 📘 **GITEA_SYNC.md** - Gitea → GitHub synchronization
|
||||
- 4 sync methods
|
||||
- Step-by-step setup
|
||||
- Troubleshooting
|
||||
|
||||
- 📘 **GITEA_SYNC_EN.md** - English version
|
||||
|
||||
- 📘 **README_EN.md** - Complete English main guide
|
||||
|
||||
#### Functionality
|
||||
- ✨ Support for **unlimited** test certificates
|
||||
- ✨ **Instant creation** (1-2 seconds) without DNS validation
|
||||
- ✨ **Automatic upload** of test certificates to NPM
|
||||
- ✨ **Full compatibility** of structure with Let's Encrypt
|
||||
- ✨ **Wildcard support** for test certificates
|
||||
|
||||
#### Repository Synchronization
|
||||
- ✨ **Automatic Gitea → GitHub sync** via Git Hooks
|
||||
- ✨ **GitHub Actions workflow** for hourly sync check
|
||||
- ✨ **Webhook integration** between Gitea and GitHub
|
||||
- ✨ **Multiple sync methods** (Hooks, Actions, Mirror, Double Remote)
|
||||
|
||||
### 🔧 Improved
|
||||
|
||||
#### Python Script
|
||||
- Added `cryptography` library import with installation check
|
||||
- New command-line parameters:
|
||||
- `--test-cert` - create test certificate
|
||||
- `--auto` - explicit automatic mode
|
||||
- Improved test certificate handling in NPM
|
||||
- Detailed logging of generation process
|
||||
|
||||
#### Makefile
|
||||
- Added `make test-cert` command with beautiful output
|
||||
- Information messages about test certificate benefits
|
||||
- Security warnings
|
||||
|
||||
#### README.md
|
||||
- "Test Self-Signed Certificate Creation" section
|
||||
- Updated table of contents with test certificates link
|
||||
- Test certificate usage examples
|
||||
- NPM integration for test certificates
|
||||
- Links to additional documentation
|
||||
- Gitea → GitHub sync section
|
||||
|
||||
### 🎯 Benefits
|
||||
|
||||
#### For Developers
|
||||
- ✅ **No limits** - unlimited certificates
|
||||
- ✅ **Fast** - creation in 1-2 seconds
|
||||
- ✅ **Offline** - works without internet
|
||||
- ✅ **Identical structure** - same files as Let's Encrypt
|
||||
|
||||
#### For Testing
|
||||
- ✅ **CI/CD friendly** - quick creation in pipeline
|
||||
- ✅ **Docker ready** - easily embeds in containers
|
||||
- ✅ **Staging environments** - perfect for test servers
|
||||
- ✅ **Local development** - HTTPS on localhost
|
||||
|
||||
#### For DevOps
|
||||
- ✅ **Repository sync** - automatic Gitea → GitHub
|
||||
- ✅ **Multiple methods** - choose what fits
|
||||
- ✅ **Instant sync** - Git Hooks < 1 second
|
||||
- ✅ **Reliable backup** - GitHub Actions hourly check
|
||||
|
||||
### 📊 Statistics
|
||||
|
||||
- **Lines of code**: 1,411 (Python script)
|
||||
- **Makefile lines**: 415
|
||||
- **Documentation lines**: 3,500+
|
||||
- **Makefile commands**: 13
|
||||
- **Operating modes**: 4 (obtain, renew, auto, test-cert)
|
||||
- **Sync methods**: 4 (Hooks, Actions, Mirror, Remote)
|
||||
- **Languages**: 2 (Russian, English)
|
||||
|
||||
---
|
||||
|
||||
## [2.0.0] - 2025-10-27
|
||||
|
||||
### 🆕 Added
|
||||
- ✨ Nginx Proxy Manager (NPM) integration
|
||||
- ✨ `NginxProxyManagerAPI` class for certificate management via API
|
||||
- ✨ Automatic certificate upload to NPM
|
||||
- ✨ Automatic certificate update in NPM
|
||||
- ✨ Automatic expiration check
|
||||
- ✨ Configurable renewal threshold (`renewal_days`)
|
||||
- ✨ Makefile for installation/removal automation
|
||||
- ✨ Systemd service + timer
|
||||
- ✨ Cron automation
|
||||
|
||||
### 🔧 Improved
|
||||
- Documentation consolidation into single README.md
|
||||
- Detailed logging with operation statuses
|
||||
- Configuration validation
|
||||
- Improved error handling
|
||||
|
||||
### 📘 Documentation
|
||||
- Complete NPM integration guide
|
||||
- Quick start in 3 commands
|
||||
- Automation examples
|
||||
|
||||
---
|
||||
|
||||
## [1.0.0] - 2025-10-26
|
||||
|
||||
### 🆕 First Release
|
||||
- Python script for Let's Encrypt via reg.ru API
|
||||
- Bash script with certbot-dns-regru
|
||||
- PowerShell version for Windows
|
||||
- DNS-01 validation
|
||||
- Wildcard certificates
|
||||
- Basic documentation
|
||||
|
||||
---
|
||||
|
||||
## Roadmap
|
||||
|
||||
### [2.2.0] - Planned
|
||||
- [ ] Web interface for management
|
||||
- [ ] Multiple domain support
|
||||
- [ ] Notifications (email, telegram)
|
||||
- [ ] Grafana dashboard for monitoring
|
||||
- [ ] Certificate backups
|
||||
|
||||
### [3.0.0] - Future
|
||||
- [ ] Other DNS provider support
|
||||
- [ ] Cloudflare API
|
||||
- [ ] Route53 (AWS)
|
||||
- [ ] Google Cloud DNS
|
||||
|
||||
---
|
||||
|
||||
## Change Types
|
||||
- `🆕 Added` - new functionality
|
||||
- `🔧 Improved` - improvements to existing functionality
|
||||
- `🐛 Fixed` - bug fixes
|
||||
- `🗑️ Removed` - removed functionality
|
||||
- `🔒 Security` - security changes
|
||||
- `📘 Documentation` - documentation changes
|
||||
|
||||
---
|
||||
|
||||
**Versioning**: Semantic Versioning (MAJOR.MINOR.PATCH)
|
||||
- **MAJOR**: Incompatible API changes
|
||||
- **MINOR**: New functionality with backward compatibility
|
||||
- **PATCH**: Bug fixes
|
||||
@@ -0,0 +1,287 @@
|
||||
# ⚡ SSL Certificate Cheatsheet
|
||||
|
||||
## 🚀 Quick Start
|
||||
|
||||
### Installation in 3 Commands
|
||||
```bash
|
||||
sudo make install
|
||||
sudo nano /etc/letsencrypt/regru_config.json # Fill in data
|
||||
sudo make test-cert # Test
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Testing (NO Let's Encrypt Limits)
|
||||
|
||||
```bash
|
||||
# Create test certificate (unlimited)
|
||||
sudo make test-cert
|
||||
|
||||
# Check status
|
||||
sudo make status
|
||||
|
||||
# View logs
|
||||
sudo make logs
|
||||
```
|
||||
|
||||
**When to use:**
|
||||
- ⚠️ Let's Encrypt: max 5 certificates/week
|
||||
- ✅ Test: UNLIMITED
|
||||
- ⚡ Creation: 1-2 seconds vs 2-5 minutes
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Production (Let's Encrypt)
|
||||
|
||||
```bash
|
||||
# Get real certificate
|
||||
sudo make obtain
|
||||
|
||||
# Automatic mode (check + renewal)
|
||||
sudo make run
|
||||
|
||||
# Force renewal
|
||||
sudo make renew
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 Main Commands
|
||||
|
||||
### letsencrypt-regru Commands
|
||||
|
||||
| Command | Description | Limits | Use Case |
|
||||
|---------|-------------|--------|----------|
|
||||
| `--check` | Check certificate expiration | - | Monitoring |
|
||||
| `--obtain` | Obtain new certificate | ⚠️ 5/week | Initial creation |
|
||||
| `--renew` | Renew existing certificate | ⚠️ 5/week | Renewal |
|
||||
| `--auto` | Auto-check and renewal | ⚠️ 5/week | Cron/systemd |
|
||||
| `--test-cert` | Test certificate | ✅ None | Development |
|
||||
| `--test-api` | Check API reg.ru access | - | Diagnostics |
|
||||
| `--test-dns` | Test DNS record creation | - | Pre-SSL check |
|
||||
| `--help` | Show help | - | Help |
|
||||
| `-v` | Verbose output | - | Debugging |
|
||||
|
||||
### Makefile Commands
|
||||
|
||||
| Command | Description | Equivalent |
|
||||
|---------|-------------|------------|
|
||||
| `make test-cert` | Test certificate | `letsencrypt-regru --test-cert` |
|
||||
| `make obtain` | New Let's Encrypt | `letsencrypt-regru --obtain` |
|
||||
| `make renew` | Renew existing | `letsencrypt-regru --renew` |
|
||||
| `make run` | Auto mode | `letsencrypt-regru --auto` |
|
||||
| `make status` | System status | - |
|
||||
| `make logs` | Show logs | `journalctl -u letsencrypt-regru` |
|
||||
| `make check-config` | Check configuration | - |
|
||||
|
||||
### letsencrypt_regru.sh Commands
|
||||
|
||||
| Command | Description |
|
||||
|---------|-------------|
|
||||
| `sudo bash letsencrypt_regru.sh install` | Install application |
|
||||
| `sudo bash letsencrypt_regru.sh update` | Update application |
|
||||
| `sudo bash letsencrypt_regru.sh uninstall` | Uninstall application |
|
||||
|
||||
---
|
||||
|
||||
## 📝 Configuration
|
||||
|
||||
### Minimal (testing)
|
||||
```json
|
||||
{
|
||||
"domain": "test.example.com",
|
||||
"wildcard": true,
|
||||
"cert_dir": "/etc/letsencrypt/live"
|
||||
}
|
||||
```
|
||||
|
||||
### Full (production + NPM)
|
||||
```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"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Workflow
|
||||
|
||||
### Development → Production
|
||||
|
||||
```bash
|
||||
# 1. Development (test certificates)
|
||||
sudo make test-cert # Create test
|
||||
# Test application...
|
||||
|
||||
# 2. Production (Let's Encrypt)
|
||||
sudo rm -rf /etc/letsencrypt/live/example.com/ # Remove test
|
||||
sudo make obtain # Create production
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 Important Paths
|
||||
|
||||
```bash
|
||||
# Configuration
|
||||
/etc/letsencrypt/regru_config.json
|
||||
|
||||
# Certificates
|
||||
/etc/letsencrypt/live/example.com/
|
||||
├── privkey.pem # Private key
|
||||
├── cert.pem # Certificate
|
||||
├── fullchain.pem # Full chain (for nginx)
|
||||
└── chain.pem # CA chain
|
||||
|
||||
# Scripts
|
||||
/opt/letsencrypt-regru/letsencrypt_regru_api.py
|
||||
|
||||
# Logs
|
||||
/var/log/letsencrypt_regru.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Verification
|
||||
|
||||
```bash
|
||||
# Check configuration
|
||||
sudo make check-config
|
||||
|
||||
# Check certificate
|
||||
openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -text -noout
|
||||
|
||||
# Check expiration date
|
||||
openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -noout -dates
|
||||
|
||||
# Check systemd
|
||||
sudo systemctl status letsencrypt-regru.timer
|
||||
sudo systemctl list-timers letsencrypt-regru.timer
|
||||
|
||||
# Check cron
|
||||
sudo crontab -l | grep letsencrypt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Debugging
|
||||
|
||||
```bash
|
||||
# Detailed logs
|
||||
sudo make logs
|
||||
|
||||
# Test run with details
|
||||
sudo python3 /opt/letsencrypt-regru/letsencrypt_regru_api.py \
|
||||
-c /etc/letsencrypt/regru_config.json --check -v
|
||||
|
||||
# Certbot logs
|
||||
sudo tail -f /var/log/letsencrypt/letsencrypt.log
|
||||
|
||||
# Systemd logs
|
||||
sudo journalctl -u letsencrypt-regru.service -f
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ Common Errors
|
||||
|
||||
### Let's Encrypt: Rate limit exceeded
|
||||
```bash
|
||||
# SOLUTION: Use test certificates
|
||||
sudo make test-cert
|
||||
```
|
||||
|
||||
### NPM: Certificate not found
|
||||
```bash
|
||||
# SOLUTION: Check NPM settings
|
||||
sudo make check-config
|
||||
|
||||
# Check connection
|
||||
curl -k https://npm.example.com
|
||||
```
|
||||
|
||||
### Permission denied
|
||||
```bash
|
||||
# SOLUTION: Run with sudo
|
||||
sudo make test-cert
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Use Case Scenarios
|
||||
|
||||
### Local Development
|
||||
```bash
|
||||
sudo make test-cert
|
||||
# Open https://localhost (ignore warning)
|
||||
```
|
||||
|
||||
### CI/CD Testing
|
||||
```bash
|
||||
# In pipeline
|
||||
sudo make test-cert
|
||||
# Run tests...
|
||||
sudo make status
|
||||
```
|
||||
|
||||
### Staging Environment
|
||||
```bash
|
||||
sudo make test-cert # Or
|
||||
sudo make obtain # If domain available
|
||||
```
|
||||
|
||||
### Production Environment
|
||||
```bash
|
||||
sudo make install
|
||||
sudo make obtain
|
||||
# Automatic renewal via cron/systemd
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
- **README.md** - Complete guide (1420+ lines)
|
||||
- **TESTING_GUIDE.md** - Testing guide (370+ lines)
|
||||
- **PROJECT_STRUCTURE.md** - Project structure
|
||||
- **CHEATSHEET.md** - This cheatsheet
|
||||
|
||||
---
|
||||
|
||||
## 🆘 Quick Help
|
||||
|
||||
```bash
|
||||
# Show all commands
|
||||
make help
|
||||
|
||||
# Check installation
|
||||
sudo make status
|
||||
|
||||
# Complete reinstall
|
||||
sudo make uninstall
|
||||
sudo make install
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💡 Tips
|
||||
|
||||
1. **Always start with test certificates** - avoid limits
|
||||
2. **Check configuration** - `make check-config`
|
||||
3. **Monitor logs** - `make logs`
|
||||
4. **Automate** - systemd/cron already configured
|
||||
5. **Keep backups** of configuration
|
||||
|
||||
---
|
||||
|
||||
**Version**: 2.1
|
||||
**Updated**: 27.10.2025
|
||||
@@ -0,0 +1,143 @@
|
||||
# 🔒 SSL Certificate Manager for Let's Encrypt + reg.ru
|
||||
|
||||
**Automated Let's Encrypt SSL certificate management with DNS validation via reg.ru API and Nginx Proxy Manager integration**
|
||||
|
||||
## 📖 Description
|
||||
|
||||
Comprehensive solution for automating the creation, renewal, and management of Let's Encrypt SSL certificates for domains registered with reg.ru. Supports DNS-01 validation, wildcard certificates, automatic upload to Nginx Proxy Manager, and test certificate generation for development.
|
||||
|
||||
### ✨ Key Features
|
||||
|
||||
- 🔐 **Automatic SSL certificate issuance** via Let's Encrypt
|
||||
- 🌐 **DNS-01 validation** via reg.ru API (wildcard domain support)
|
||||
- 🔄 **Automatic renewal** with configurable threshold
|
||||
- 📦 **Nginx Proxy Manager integration** - automatic upload and update
|
||||
- 🧪 **Test certificates** - bypass Let's Encrypt rate limits (5 per week)
|
||||
- ⚙️ **Full automation** via systemd/cron
|
||||
- 🔀 **Repository synchronization** - automatic Gitea → GitHub sync
|
||||
|
||||
### 🚀 Quick Start
|
||||
|
||||
```bash
|
||||
# Install via Makefile
|
||||
sudo make install
|
||||
|
||||
# Configure
|
||||
sudo nano /etc/letsencrypt/regru_config.json
|
||||
|
||||
# Create test certificate (no rate limits)
|
||||
sudo make test-cert
|
||||
|
||||
# Get production certificate
|
||||
sudo make obtain
|
||||
```
|
||||
|
||||
### 📋 Requirements
|
||||
|
||||
- **OS**: Linux (Ubuntu/Debian/CentOS)
|
||||
- **Python**: 3.6+
|
||||
- **Dependencies**: certbot, requests, cryptography
|
||||
- **API**: reg.ru (DNS management access)
|
||||
- **Optional**: Nginx Proxy Manager
|
||||
|
||||
### 🎯 Use Cases
|
||||
|
||||
- ✅ SSL certificate automation for web servers
|
||||
- ✅ Centralized management via Nginx Proxy Manager
|
||||
- ✅ Development and testing with self-signed certificates
|
||||
- ✅ CI/CD integration
|
||||
- ✅ Multi-domain configurations with wildcards
|
||||
|
||||
### 📚 Documentation
|
||||
|
||||
#### English Documentation
|
||||
- [BUILD_GUIDE_EN.md](../en/BUILD_GUIDE_EN.md) - Complete build guide
|
||||
- [QUICKSTART_BUILD_EN.md](../en/QUICKSTART_BUILD_EN.md) - Quick build start
|
||||
- [RELEASE_GUIDE_EN.md](../en/RELEASE_GUIDE_EN.md) - Release creation guide
|
||||
- [MAKEFILE_COMMANDS_EN.md](../en/MAKEFILE_COMMANDS_EN.md) - Makefile commands reference
|
||||
- [TESTING_GUIDE_EN.md](../en/TESTING_GUIDE_EN.md) - Testing guide
|
||||
- [CHEATSHEET_EN.md](../en/CHEATSHEET_EN.md) - Quick reference
|
||||
- [GITEA_SYNC_EN.md](../en/GITEA_SYNC_EN.md) - Gitea → GitHub sync
|
||||
- [PROJECT_STRUCTURE_EN.md](../en/PROJECT_STRUCTURE_EN.md) - Project structure
|
||||
|
||||
#### Russian Documentation / Русская документация
|
||||
- [BUILD_GUIDE.md](../ru/BUILD_GUIDE.md) - Полное руководство по сборке
|
||||
- [QUICKSTART_BUILD.md](../ru/QUICKSTART_BUILD.md) - Быстрый старт сборки
|
||||
- [RELEASE_GUIDE.md](../ru/RELEASE_GUIDE.md) - Руководство по созданию релизов
|
||||
- [MAKEFILE_COMMANDS.md](../ru/MAKEFILE_COMMANDS.md) - Справочник команд Makefile
|
||||
- [TESTING_GUIDE.md](../ru/TESTING_GUIDE.md) - Руководство по тестированию
|
||||
- [CHEATSHEET.md](../ru/CHEATSHEET.md) - Быстрая шпаргалка
|
||||
- [GITEA_SYNC.md](../ru/GITEA_SYNC.md) - Синхронизация Gitea → GitHub
|
||||
- [PROJECT_STRUCTURE.md](../ru/PROJECT_STRUCTURE.md) - Структура проекта
|
||||
|
||||
---
|
||||
|
||||
## 🔨 Building Executables
|
||||
|
||||
The project supports building standalone executables for Linux and Windows:
|
||||
|
||||
```bash
|
||||
# Build for current OS
|
||||
make build
|
||||
|
||||
# Build for all platforms
|
||||
make build-all
|
||||
|
||||
# Create full release
|
||||
make release
|
||||
```
|
||||
|
||||
**Result:**
|
||||
- Linux: `letsencrypt-regru` (~45-55 MB)
|
||||
- Windows: `letsencrypt-regru.exe` (~40-50 MB)
|
||||
|
||||
See [BUILD_GUIDE_EN.md](../en/BUILD_GUIDE_EN.md) for details.
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Automated Releases
|
||||
|
||||
### GitHub Actions
|
||||
|
||||
Create a tag to trigger automatic build and release:
|
||||
|
||||
```bash
|
||||
git tag -a v1.0.0 -m "Release 1.0.0"
|
||||
git push origin v1.0.0
|
||||
```
|
||||
|
||||
### Gitea Actions
|
||||
|
||||
Same workflow available for self-hosted Gitea:
|
||||
|
||||
```bash
|
||||
git tag -a v1.0.0 -m "Release 1.0.0"
|
||||
git push origin v1.0.0
|
||||
```
|
||||
|
||||
See [RELEASE_GUIDE_EN.md](../en/RELEASE_GUIDE_EN.md) for details.
|
||||
|
||||
---
|
||||
|
||||
## 👤 Author
|
||||
|
||||
**Dmitry Fofanov** @ 2025
|
||||
|
||||
## 📄 License
|
||||
|
||||
Open Source - Free to use
|
||||
|
||||
## 🤝 Contributing
|
||||
|
||||
Pull requests are welcome!
|
||||
|
||||
## 🔗 Links
|
||||
|
||||
- **reg.ru API Documentation**: https://www.reg.ru/support/api
|
||||
- **Let's Encrypt**: https://letsencrypt.org/
|
||||
- **Nginx Proxy Manager**: https://nginxproxymanager.com/
|
||||
- **PyInstaller**: https://pyinstaller.org/
|
||||
|
||||
---
|
||||
|
||||
**Last Updated:** October 28, 2025
|
||||
@@ -0,0 +1,174 @@
|
||||
# 📚 Documentation Index
|
||||
|
||||
## 🇬🇧 English Documentation
|
||||
|
||||
### Main Guides
|
||||
- **[DESCRIPTION_EN.md](DESCRIPTION_EN.md)** - Project Description & Overview
|
||||
- **[BUILD_GUIDE_EN.md](BUILD_GUIDE_EN.md)** - Complete Build Guide
|
||||
- **[QUICKSTART_BUILD_EN.md](QUICKSTART_BUILD_EN.md)** - Quick Build Start (5 minutes)
|
||||
- **[RELEASE_GUIDE_EN.md](RELEASE_GUIDE_EN.md)** - Automated Release Guide
|
||||
- **[INSTALL_GUIDE_EN.md](INSTALL_GUIDE_EN.md)** - Installation Guide
|
||||
- **[TESTING_GUIDE_EN.md](TESTING_GUIDE_EN.md)** - Testing Guide
|
||||
|
||||
### Reference Materials
|
||||
- **[MAKEFILE_COMMANDS_EN.md](MAKEFILE_COMMANDS_EN.md)** - Makefile Commands Reference
|
||||
- **[CHEATSHEET_EN.md](CHEATSHEET_EN.md)** - Quick Reference
|
||||
- **[CHANGELOG_EN.md](CHANGELOG_EN.md)** - Change History
|
||||
|
||||
### Developer Guides
|
||||
- **[PROJECT_STRUCTURE_EN.md](PROJECT_STRUCTURE_EN.md)** - Project Structure
|
||||
- **[GITEA_SYNC_EN.md](GITEA_SYNC_EN.md)** - Gitea → GitHub Synchronization
|
||||
|
||||
### SSL & Certificates
|
||||
- **[SSL_SCRIPTS_README_EN.md](SSL_SCRIPTS_README_EN.md)** - SSL Scripts Documentation
|
||||
- **[SSL_Certificate_Creation_and_Renewal_EN.md](SSL_Certificate_Creation_and_Renewal_EN.md)** - SSL Certificate Guide
|
||||
- **[Add_Lets_Encrypt_Certificate_for_regru_Provider_EN.md](Add_Lets_Encrypt_Certificate_for_regru_Provider_EN.md)** - Let's Encrypt + reg.ru
|
||||
|
||||
### Nginx Integration
|
||||
- **[Nginx_Manager_SSL_Configuration_EN.md](Nginx_Manager_SSL_Configuration_EN.md)** - Nginx Manager SSL Setup
|
||||
|
||||
---
|
||||
|
||||
## 🇷🇺 Russian Documentation / Русская документация
|
||||
|
||||
### Основные руководства / Main Guides
|
||||
- **[DESCRIPTION.md](../ru/DESCRIPTION.md)** - Описание проекта
|
||||
- **[BUILD_GUIDE.md](../ru/BUILD_GUIDE.md)** - Полное руководство по сборке
|
||||
- **[QUICKSTART_BUILD.md](../ru/QUICKSTART_BUILD.md)** - Быстрый старт сборки (5 минут)
|
||||
- **[RELEASE_GUIDE.md](../ru/RELEASE_GUIDE.md)** - Руководство по автоматическим релизам
|
||||
- **[INSTALL_GUIDE.md](../ru/INSTALL_GUIDE.md)** - Руководство по установке
|
||||
- **[TESTING_GUIDE.md](../ru/TESTING_GUIDE.md)** - Руководство по тестированию
|
||||
|
||||
### Справочная информация / Reference Materials
|
||||
- **[MAKEFILE_COMMANDS.md](../ru/MAKEFILE_COMMANDS.md)** - Справочник команд Makefile
|
||||
- **[CHEATSHEET.md](../ru/CHEATSHEET.md)** - Быстрая шпаргалка
|
||||
- **[CHANGELOG.md](../ru/CHANGELOG.md)** - История изменений
|
||||
|
||||
### Руководства для разработчиков / Developer Guides
|
||||
- **[PROJECT_STRUCTURE.md](../ru/PROJECT_STRUCTURE.md)** - Структура проекта
|
||||
- **[GITEA_SYNC.md](../ru/GITEA_SYNC.md)** - Синхронизация Gitea → GitHub
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Quick Start / Быстрый старт
|
||||
|
||||
### For End Users / Для конечных пользователей
|
||||
|
||||
**English:**
|
||||
1. Start here: [DESCRIPTION_EN.md](DESCRIPTION_EN.md)
|
||||
2. Install: [INSTALL_GUIDE_EN.md](INSTALL_GUIDE_EN.md)
|
||||
3. Test: [TESTING_GUIDE_EN.md](TESTING_GUIDE_EN.md)
|
||||
4. Quick reference: [CHEATSHEET_EN.md](CHEATSHEET_EN.md)
|
||||
|
||||
**Russian / Русский:**
|
||||
1. Начните здесь: [DESCRIPTION.md](../ru/DESCRIPTION.md)
|
||||
2. Установка: [INSTALL_GUIDE.md](../ru/INSTALL_GUIDE.md)
|
||||
3. Тестирование: [TESTING_GUIDE.md](../ru/TESTING_GUIDE.md)
|
||||
4. Шпаргалка: [CHEATSHEET.md](../ru/CHEATSHEET.md)
|
||||
|
||||
### For Developers / Для разработчиков
|
||||
|
||||
**English:**
|
||||
1. Build guide: [BUILD_GUIDE_EN.md](BUILD_GUIDE_EN.md)
|
||||
2. Quick build: [QUICKSTART_BUILD_EN.md](QUICKSTART_BUILD_EN.md)
|
||||
3. Create release: [RELEASE_GUIDE_EN.md](RELEASE_GUIDE_EN.md)
|
||||
4. Commands: [MAKEFILE_COMMANDS_EN.md](MAKEFILE_COMMANDS_EN.md)
|
||||
|
||||
**Russian / Русский:**
|
||||
1. Руководство по сборке: [BUILD_GUIDE.md](../ru/BUILD_GUIDE.md)
|
||||
2. Быстрая сборка: [QUICKSTART_BUILD.md](../ru/QUICKSTART_BUILD.md)
|
||||
3. Создание релиза: [RELEASE_GUIDE.md](../ru/RELEASE_GUIDE.md)
|
||||
4. Команды: [MAKEFILE_COMMANDS.md](../ru/MAKEFILE_COMMANDS.md)
|
||||
|
||||
---
|
||||
|
||||
## 📖 Documentation by Topic / Документация по темам
|
||||
|
||||
### Installation / Установка
|
||||
| Topic | English | Russian |
|
||||
|-------|---------|---------|
|
||||
| Installation Guide | [INSTALL_GUIDE_EN.md](INSTALL_GUIDE_EN.md) | [INSTALL_GUIDE.md](../ru/INSTALL_GUIDE.md) |
|
||||
| Quick Start | [DESCRIPTION_EN.md](DESCRIPTION_EN.md) | [DESCRIPTION.md](../ru/DESCRIPTION.md) |
|
||||
|
||||
### Building / Сборка
|
||||
| Topic | English | Russian |
|
||||
|-------|---------|---------|
|
||||
| Complete Build Guide | [BUILD_GUIDE_EN.md](BUILD_GUIDE_EN.md) | [BUILD_GUIDE.md](../ru/BUILD_GUIDE.md) |
|
||||
| Quick Build (5 min) | [QUICKSTART_BUILD_EN.md](QUICKSTART_BUILD_EN.md) | [QUICKSTART_BUILD.md](../ru/QUICKSTART_BUILD.md) |
|
||||
| Makefile Commands | [MAKEFILE_COMMANDS_EN.md](MAKEFILE_COMMANDS_EN.md) | [MAKEFILE_COMMANDS.md](../ru/MAKEFILE_COMMANDS.md) |
|
||||
|
||||
### Releases / Релизы
|
||||
| Topic | English | Russian |
|
||||
|-------|---------|---------|
|
||||
| Automated Releases | [RELEASE_GUIDE_EN.md](RELEASE_GUIDE_EN.md) | [RELEASE_GUIDE.md](../ru/RELEASE_GUIDE.md) |
|
||||
| Changelog | [CHANGELOG_EN.md](CHANGELOG_EN.md) | [CHANGELOG.md](../ru/CHANGELOG.md) |
|
||||
|
||||
### Testing / Тестирование
|
||||
| Topic | English | Russian |
|
||||
|-------|---------|---------|
|
||||
| Testing Guide | [TESTING_GUIDE_EN.md](TESTING_GUIDE_EN.md) | [TESTING_GUIDE.md](../ru/TESTING_GUIDE.md) |
|
||||
|
||||
### Reference / Справка
|
||||
| Topic | English | Russian |
|
||||
|-------|---------|---------|
|
||||
| Quick Reference | [CHEATSHEET_EN.md](CHEATSHEET_EN.md) | [CHEATSHEET.md](../ru/CHEATSHEET.md) |
|
||||
| Project Structure | [PROJECT_STRUCTURE_EN.md](PROJECT_STRUCTURE_EN.md) | [PROJECT_STRUCTURE.md](../ru/PROJECT_STRUCTURE.md) |
|
||||
|
||||
---
|
||||
|
||||
## 📊 Documentation Status / Статус документации
|
||||
|
||||
| Document | English | Russian | Status |
|
||||
|----------|---------|---------|--------|
|
||||
| Description | ✅ | ✅ | Complete |
|
||||
| Build Guide | ✅ | ✅ | Complete |
|
||||
| Quick Build | ✅ | ✅ | Complete |
|
||||
| Release Guide | ✅ | ✅ | Complete |
|
||||
| Install Guide | ✅ | ✅ | Complete |
|
||||
| Makefile Commands | ✅ | ✅ | Complete |
|
||||
| Testing Guide | ✅ | ✅ | Complete |
|
||||
| Cheatsheet | ✅ | ✅ | Complete |
|
||||
| Project Structure | ✅ | ✅ | Complete |
|
||||
| Gitea Sync | ✅ | ✅ | Complete |
|
||||
| Changelog | ✅ | ✅ | Complete |
|
||||
|
||||
**Legend:**
|
||||
- ✅ Complete / Готово
|
||||
- 🔄 In Progress / В разработке
|
||||
- ❌ Not Started / Не начато
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Choose Your Language / Выберите язык
|
||||
|
||||
### 🇬🇧 Prefer English?
|
||||
👉 Start with [DESCRIPTION_EN.md](DESCRIPTION_EN.md)
|
||||
|
||||
### 🇷🇺 Предпочитаете русский?
|
||||
👉 Начните с [DESCRIPTION.md](../ru/DESCRIPTION.md)
|
||||
|
||||
---
|
||||
|
||||
## 💡 Contributing / Вклад
|
||||
|
||||
Help improve documentation / Помогите улучшить документацию:
|
||||
- Report issues / Сообщайте об ошибках
|
||||
- Suggest improvements / Предлагайте улучшения
|
||||
- Fix typos / Исправляйте опечатки
|
||||
- Translate / Переводите
|
||||
|
||||
---
|
||||
|
||||
## 🔗 External Resources / Внешние ресурсы
|
||||
|
||||
- **reg.ru API**: https://www.reg.ru/support/api
|
||||
- **Let's Encrypt**: https://letsencrypt.org/
|
||||
- **Nginx Proxy Manager**: https://nginxproxymanager.com/
|
||||
- **PyInstaller**: https://pyinstaller.org/
|
||||
- **GitHub Actions**: https://docs.github.com/actions
|
||||
- **Gitea Actions**: https://docs.gitea.com/usage/actions/overview
|
||||
|
||||
---
|
||||
|
||||
**Last Updated / Обновлено**: October 28, 2025
|
||||
**Maintained by / Поддерживает**: Dmitry Fofanov
|
||||
@@ -0,0 +1,438 @@
|
||||
# 🔄 Gitea → GitHub Synchronization
|
||||
|
||||
Automatic repository synchronization from Gitea to GitHub after each push.
|
||||
|
||||
---
|
||||
|
||||
## 📋 Available Methods
|
||||
|
||||
| Method | Complexity | Speed | Reliability | Recommendation |
|
||||
|--------|------------|-------|-------------|----------------|
|
||||
| **1. Git Hooks** | ⭐⭐ | ⚡ Instant | ✅ High | Recommended |
|
||||
| **2. GitHub Actions** | ⭐⭐⭐ | ⏱️ 1-5 min | ✅ High | Complex scenarios |
|
||||
| **3. Gitea Mirror** | ⭐ | ⏱️ Scheduled | ⭐⭐ Medium | Simplest |
|
||||
| **4. Double Remote** | ⭐ | ⚡ Instant | ⭐⭐ Medium | Local work |
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Method 1: Git Hooks (Recommended)
|
||||
|
||||
### Installation
|
||||
|
||||
**1. On Gitea server, find repository path:**
|
||||
```bash
|
||||
# Usually:
|
||||
/var/lib/gitea/data/gitea-repositories/username/configure_nginx_manager.git
|
||||
# Or
|
||||
/home/git/gitea-repositories/username/configure_nginx_manager.git
|
||||
```
|
||||
|
||||
**2. Create post-receive hook:**
|
||||
```bash
|
||||
cd /path/to/gitea/repos/username/configure_nginx_manager.git/hooks/
|
||||
nano post-receive
|
||||
```
|
||||
|
||||
**3. Insert content** from `gitea-hooks/post-receive` file (in this repository)
|
||||
|
||||
**4. Configure parameters:**
|
||||
```bash
|
||||
# In post-receive file, change:
|
||||
GITHUB_REPO="git@github.com:YOUR_USERNAME/configure_nginx_manager.git"
|
||||
# Or for HTTPS with token:
|
||||
GITHUB_REPO="https://YOUR_TOKEN@github.com/YOUR_USERNAME/configure_nginx_manager.git"
|
||||
```
|
||||
|
||||
**5. Make script executable:**
|
||||
```bash
|
||||
chmod +x post-receive
|
||||
```
|
||||
|
||||
**6. Create log directory:**
|
||||
```bash
|
||||
mkdir -p /var/log/gitea
|
||||
chown git:git /var/log/gitea
|
||||
```
|
||||
|
||||
### SSH Key Setup (for git@github.com)
|
||||
|
||||
**On Gitea server:**
|
||||
|
||||
**Step 1: Identify Gitea user**
|
||||
```bash
|
||||
# Check which user runs Gitea
|
||||
ps aux | grep gitea | grep -v grep
|
||||
|
||||
# Usually one of:
|
||||
# - git (standard installation)
|
||||
# - gitea (Docker/LXC installation)
|
||||
```
|
||||
|
||||
**Step 2: Switch to that user**
|
||||
```bash
|
||||
# Try git:
|
||||
sudo su - git
|
||||
|
||||
# If that doesn't work, try gitea:
|
||||
sudo su - gitea
|
||||
|
||||
# Verify current user
|
||||
whoami # Should be: git or gitea
|
||||
```
|
||||
|
||||
**Step 3: Create SSH key**
|
||||
```bash
|
||||
# Create SSH key (if not exists)
|
||||
ssh-keygen -t ed25519 -C "gitea-to-github-sync" -f ~/.ssh/id_ed25519 -N ""
|
||||
|
||||
# Copy public key
|
||||
cat ~/.ssh/id_ed25519.pub
|
||||
```
|
||||
|
||||
**On GitHub:**
|
||||
1. Settings → SSH and GPG keys
|
||||
2. New SSH key
|
||||
3. Paste public key
|
||||
4. Save
|
||||
|
||||
**⚠️ IMPORTANT: Add GitHub to known_hosts:**
|
||||
```bash
|
||||
# From the same user (git or gitea)
|
||||
ssh-keyscan -H github.com >> ~/.ssh/known_hosts
|
||||
|
||||
# Verify key was added
|
||||
cat ~/.ssh/known_hosts | grep github.com
|
||||
```
|
||||
|
||||
**Verify connection:**
|
||||
```bash
|
||||
ssh -T git@github.com
|
||||
# Should output: Hi username! You've successfully authenticated...
|
||||
```
|
||||
|
||||
### Token Setup (for HTTPS)
|
||||
|
||||
**On GitHub:**
|
||||
1. Settings → Developer settings → Personal access tokens → Tokens (classic)
|
||||
2. Generate new token
|
||||
3. Select scope: `repo` (full repository access)
|
||||
4. Copy token
|
||||
|
||||
**In hook file:**
|
||||
```bash
|
||||
GITHUB_REPO="https://ghp_YOUR_TOKEN_HERE@github.com/username/configure_nginx_manager.git"
|
||||
```
|
||||
|
||||
### Testing
|
||||
|
||||
```bash
|
||||
# Make test commit in Gitea
|
||||
cd /tmp
|
||||
git clone http://gitea.example.com/username/configure_nginx_manager.git
|
||||
cd configure_nginx_manager
|
||||
echo "test" >> README.md
|
||||
git add README.md
|
||||
git commit -m "Test sync to GitHub"
|
||||
git push
|
||||
|
||||
# Check log
|
||||
tail -f /var/log/gitea/github-sync.log
|
||||
|
||||
# Check GitHub - changes should appear
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Method 2: GitHub Actions
|
||||
|
||||
### Installation
|
||||
|
||||
**1. Create workflow in GitHub repository:**
|
||||
|
||||
File already created: `.github/workflows/sync-from-gitea.yml`
|
||||
|
||||
**2. Configure secrets in GitHub:**
|
||||
|
||||
GitHub Repository → Settings → Secrets and variables → Actions → New repository secret
|
||||
|
||||
Add:
|
||||
- **Name**: `GITEA_URL`
|
||||
- **Value**: `https://gitea.example.com/username/configure_nginx_manager.git`
|
||||
|
||||
- **Name**: `GITEA_TOKEN`
|
||||
- **Value**: Gitea access token
|
||||
|
||||
### Getting Gitea Token
|
||||
|
||||
**In Gitea:**
|
||||
1. Settings → Applications → Generate New Token
|
||||
2. Token Name: "GitHub Sync"
|
||||
3. Select permissions: `read:repository`
|
||||
4. Generate Token
|
||||
5. Copy token
|
||||
|
||||
### Running Sync
|
||||
|
||||
**Automatically (scheduled):**
|
||||
- Checks for changes every hour
|
||||
|
||||
**Manually:**
|
||||
1. GitHub → Actions
|
||||
2. Select workflow "Sync from Gitea"
|
||||
3. Run workflow
|
||||
|
||||
**Via Gitea webhook:**
|
||||
|
||||
In Gitea repository:
|
||||
1. Settings → Webhooks → Add Webhook → Gitea
|
||||
2. Target URL: `https://api.github.com/repos/USERNAME/configure_nginx_manager/dispatches`
|
||||
3. HTTP Method: `POST`
|
||||
4. POST Content Type: `application/json`
|
||||
5. Trigger On: `Push events`
|
||||
6. Body:
|
||||
```json
|
||||
{
|
||||
"event_type": "gitea-push"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🪞 Method 3: Gitea Mirror (Built-in)
|
||||
|
||||
### Setup
|
||||
|
||||
**In Gitea repository:**
|
||||
1. Settings → Repository
|
||||
2. Scroll to "Mirror Settings"
|
||||
3. Click "Add Push Mirror"
|
||||
4. Fill in:
|
||||
- **Git Remote Repository URL**: `https://github.com/username/configure_nginx_manager.git`
|
||||
- **Username**: your GitHub username
|
||||
- **Password**: GitHub Personal Access Token
|
||||
- **Sync Interval**: `8h` (every 8 hours) or `0` (manual only)
|
||||
5. Save
|
||||
|
||||
### Manual Sync
|
||||
|
||||
Settings → Repository → Mirror Settings → Sync Now
|
||||
|
||||
### Advantages
|
||||
- ✅ Built-in feature
|
||||
- ✅ No scripts required
|
||||
- ✅ Web interface management
|
||||
|
||||
### Disadvantages
|
||||
- ⚠️ Works on schedule (not instant)
|
||||
- ⚠️ Not available in all Gitea versions
|
||||
|
||||
---
|
||||
|
||||
## 🔀 Method 4: Double Remote
|
||||
|
||||
### For Local Work
|
||||
|
||||
**Setup:**
|
||||
```bash
|
||||
# In your local repository
|
||||
cd configure_nginx_manager
|
||||
|
||||
# Add GitHub as second remote
|
||||
git remote add github git@github.com:username/configure_nginx_manager.git
|
||||
|
||||
# Or configure push to both repositories simultaneously
|
||||
git remote set-url --add --push origin git@github.com:username/configure_nginx_manager.git
|
||||
|
||||
# Verify
|
||||
git remote -v
|
||||
```
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
# Normal push (Gitea only)
|
||||
git push origin main
|
||||
|
||||
# Push to GitHub
|
||||
git push github main
|
||||
|
||||
# Push to both repositories
|
||||
git push origin main
|
||||
git push github main
|
||||
|
||||
# Or create alias
|
||||
git config alias.pushall '!git push origin main && git push github main'
|
||||
git pushall
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Sync Verification
|
||||
|
||||
### Check via Git
|
||||
|
||||
```bash
|
||||
# Compare commits
|
||||
git ls-remote git@gitea.example.com:username/configure_nginx_manager.git
|
||||
git ls-remote git@github.com:username/configure_nginx_manager.git
|
||||
|
||||
# Should have identical SHA
|
||||
```
|
||||
|
||||
### Check Logs (Method 1 - Hooks)
|
||||
|
||||
```bash
|
||||
# On Gitea server
|
||||
tail -f /var/log/gitea/github-sync.log
|
||||
```
|
||||
|
||||
### Check GitHub Actions (Method 2)
|
||||
|
||||
1. GitHub Repository → Actions
|
||||
2. View recent runs
|
||||
3. Check execution logs
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Recommended Configuration
|
||||
|
||||
For maximum reliability, use **combination of methods**:
|
||||
|
||||
1. **Git Hook** (primary) - instant sync
|
||||
2. **GitHub Actions** (backup) - hourly check in case of hook failure
|
||||
|
||||
### Installing Both Methods
|
||||
|
||||
```bash
|
||||
# 1. Install Git Hook on Gitea server
|
||||
# (see Method 1)
|
||||
|
||||
# 2. Configure GitHub Actions
|
||||
# (see Method 2)
|
||||
|
||||
# 3. GitHub Actions will catch missed changes
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
### Problem: Hook not firing
|
||||
|
||||
**Check:**
|
||||
```bash
|
||||
# On Gitea server
|
||||
ls -la /path/to/repo.git/hooks/post-receive
|
||||
# Should be -rwxr-xr-x
|
||||
|
||||
# Check permissions
|
||||
chmod +x /path/to/repo.git/hooks/post-receive
|
||||
chown git:git /path/to/repo.git/hooks/post-receive
|
||||
|
||||
# Check Gitea error log
|
||||
tail -f /var/log/gitea/gitea.log
|
||||
```
|
||||
|
||||
### Problem: Permission denied (SSH)
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Ensure SSH key is added to GitHub
|
||||
ssh -T git@github.com
|
||||
|
||||
# Check .ssh permissions
|
||||
chmod 700 ~/.ssh
|
||||
chmod 600 ~/.ssh/id_ed25519
|
||||
```
|
||||
|
||||
### Problem: Authentication failed (HTTPS)
|
||||
|
||||
**Solution:**
|
||||
- Check GitHub token (should have `repo` scope)
|
||||
- Token not expired
|
||||
- Correct URL format: `https://TOKEN@github.com/user/repo.git`
|
||||
|
||||
### Problem: GitHub Actions not triggering
|
||||
|
||||
**Solution:**
|
||||
1. Check secrets in Settings → Secrets
|
||||
2. Verify webhook format from Gitea
|
||||
3. Run manually for test
|
||||
|
||||
---
|
||||
|
||||
## 📊 Method Comparison
|
||||
|
||||
### Sync Speed
|
||||
- **Git Hooks**: ⚡ < 1 second
|
||||
- **GitHub Actions (webhook)**: ⏱️ 10-30 seconds
|
||||
- **GitHub Actions (schedule)**: ⏱️ up to 1 hour
|
||||
- **Gitea Mirror**: ⏱️ scheduled
|
||||
|
||||
### Reliability
|
||||
- **Git Hooks**: ⭐⭐⭐⭐⭐ (when properly configured)
|
||||
- **GitHub Actions**: ⭐⭐⭐⭐⭐ (very reliable)
|
||||
- **Gitea Mirror**: ⭐⭐⭐ (depends on Gitea version)
|
||||
- **Double Remote**: ⭐⭐ (requires manual action)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Final Recommendation
|
||||
|
||||
For `configure_nginx_manager` project:
|
||||
|
||||
**1. Primary method: Git Hook**
|
||||
- Fast
|
||||
- Reliable
|
||||
- Automatic
|
||||
|
||||
**2. Backup method: GitHub Actions**
|
||||
- Hourly check
|
||||
- Catches missed changes
|
||||
- Can run manually
|
||||
|
||||
**3. Monitoring:**
|
||||
```bash
|
||||
# Weekly verification
|
||||
git ls-remote origin | head -1
|
||||
git ls-remote github | head -1
|
||||
# SHA should match
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Quick Setup
|
||||
|
||||
```bash
|
||||
# On Gitea server
|
||||
sudo su - git
|
||||
cd /path/to/gitea-repositories/username/configure_nginx_manager.git/hooks/
|
||||
|
||||
# Download hook
|
||||
wget https://raw.githubusercontent.com/username/configure_nginx_manager/main/gitea-hooks/post-receive
|
||||
|
||||
# Configure
|
||||
nano post-receive
|
||||
# Change GITHUB_REPO
|
||||
|
||||
# Permissions
|
||||
chmod +x post-receive
|
||||
|
||||
# Test
|
||||
echo "test" | ./post-receive
|
||||
```
|
||||
|
||||
Done! 🎉
|
||||
|
||||
---
|
||||
|
||||
## 📚 Additional Resources
|
||||
|
||||
- [Git Hooks Documentation](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks)
|
||||
- [GitHub Actions Documentation](https://docs.github.com/en/actions)
|
||||
- [Gitea Documentation](https://docs.gitea.io/)
|
||||
|
||||
---
|
||||
|
||||
**Version**: 1.0
|
||||
**Author**: Фофанов Дмитрий
|
||||
**Date**: October 27, 2025
|
||||
@@ -0,0 +1,415 @@
|
||||
# Installation Guide for letsencrypt_regru.sh
|
||||
|
||||
**Author:** Dmitry Fofanov
|
||||
**Date:** October 28, 2025
|
||||
|
||||
## Description
|
||||
|
||||
`letsencrypt_regru.sh` is an automated installer for Let's Encrypt Manager with reg.ru and Nginx Proxy Manager integration.
|
||||
|
||||
The script automates:
|
||||
- Installation of all system dependencies
|
||||
- Python virtual environment creation
|
||||
- Python library installation (requests, cryptography, certbot)
|
||||
- Interactive configuration setup
|
||||
- Creating and configuring systemd services
|
||||
- Automatic certificate renewal setup
|
||||
|
||||
## Requirements
|
||||
|
||||
- Linux (Debian/Ubuntu, CentOS/RHEL/Fedora)
|
||||
- Root access (sudo)
|
||||
- Minimum 512MB RAM
|
||||
- Minimum 1GB free disk space
|
||||
- Internet connection
|
||||
|
||||
## Quick Installation
|
||||
|
||||
**Method 1: Automatic Installation (Recommended)**
|
||||
|
||||
The fastest way - run installation directly from GitHub:
|
||||
|
||||
```bash
|
||||
sudo bash -c "$(curl -fsSL https://github.com/DFofanov/configure_nginx_manager/raw/refs/heads/master/letsencrypt_regru.sh)"
|
||||
```
|
||||
|
||||
This command will:
|
||||
- Automatically download the installation script
|
||||
- Run it with root privileges
|
||||
- Guide you through interactive setup
|
||||
|
||||
**Method 2: Clone Repository**
|
||||
|
||||
If you want to review the code before installation:
|
||||
|
||||
```bash
|
||||
# 1. Download repository
|
||||
git clone https://github.com/DFofanov/configure_nginx_manager.git
|
||||
cd configure_nginx_manager
|
||||
|
||||
# 2. Make executable
|
||||
chmod +x letsencrypt_regru.sh
|
||||
|
||||
# 3. Run installation
|
||||
sudo ./letsencrypt_regru.sh
|
||||
```
|
||||
|
||||
## Interactive Setup
|
||||
|
||||
During installation, the script will ask for:
|
||||
|
||||
1. **Domain** - your main domain (e.g., `example.com`)
|
||||
2. **Email** - for Let's Encrypt notifications
|
||||
3. **reg.ru credentials:**
|
||||
- Username
|
||||
- Password
|
||||
4. **Wildcard certificate** - create `*.example.com` (recommended: Yes)
|
||||
5. **NPM integration** (optional):
|
||||
- NPM address (e.g., `http://10.10.10.14:81`)
|
||||
- NPM login email
|
||||
- NPM password
|
||||
|
||||
## Structure After Installation
|
||||
|
||||
```
|
||||
/opt/letsencrypt-regru/ # Application
|
||||
├── letsencrypt_regru_api.py # Main script
|
||||
├── venv/ # Python virtual environment
|
||||
└── docs/ # Documentation
|
||||
|
||||
/etc/letsencrypt-regru/ # Configuration
|
||||
└── config.json # Settings (credentials, domain, NPM)
|
||||
|
||||
/var/log/letsencrypt-regru/ # Logs
|
||||
└── letsencrypt_regru.log
|
||||
|
||||
/etc/letsencrypt/live/ # Let's Encrypt certificates
|
||||
└── example.com/
|
||||
├── privkey.pem
|
||||
├── cert.pem
|
||||
├── chain.pem
|
||||
└── fullchain.pem
|
||||
|
||||
/etc/systemd/system/ # Systemd services
|
||||
├── letsencrypt-regru.service # Renewal service
|
||||
└── letsencrypt-regru.timer # Timer (every 12 hours)
|
||||
|
||||
/usr/local/bin/
|
||||
└── letsencrypt-regru # Global command
|
||||
```
|
||||
|
||||
## Using letsencrypt-regru Command
|
||||
|
||||
After installation, a convenient global command with multiple functions is available:
|
||||
|
||||
### 🔧 Main Commands
|
||||
|
||||
```bash
|
||||
# Check current certificate expiration
|
||||
letsencrypt-regru --check
|
||||
|
||||
# Obtain new Let's Encrypt certificate
|
||||
letsencrypt-regru --obtain
|
||||
|
||||
# Renew existing certificate
|
||||
letsencrypt-regru --renew
|
||||
|
||||
# Automatically check and renew if needed
|
||||
letsencrypt-regru --auto
|
||||
|
||||
# Create test self-signed certificate
|
||||
letsencrypt-regru --test-cert
|
||||
```
|
||||
|
||||
### 🧪 Diagnostic and Testing Commands
|
||||
|
||||
```bash
|
||||
# Check API access to reg.ru
|
||||
# - Shows current IP address
|
||||
# - Tests API connection
|
||||
# - Displays account balance
|
||||
letsencrypt-regru --test-api
|
||||
|
||||
# Test DNS TXT record creation
|
||||
# - Full SSL certification process simulation
|
||||
# - Creates temporary _acme-challenge TXT record
|
||||
# - Waits for DNS propagation (60 seconds)
|
||||
# - Verifies via public DNS servers
|
||||
# - Automatically removes test record
|
||||
letsencrypt-regru --test-dns
|
||||
|
||||
# Show help for all commands
|
||||
letsencrypt-regru --help
|
||||
|
||||
# Enable verbose output
|
||||
letsencrypt-regru --obtain -v
|
||||
letsencrypt-regru --check -v
|
||||
```
|
||||
|
||||
### ⚙️ Service Commands (internal use)
|
||||
|
||||
```bash
|
||||
# Certbot authentication hook (used by certbot automatically)
|
||||
letsencrypt-regru --auth-hook
|
||||
|
||||
# Certbot cleanup hook (used by certbot automatically)
|
||||
letsencrypt-regru --cleanup-hook
|
||||
```
|
||||
|
||||
### 📋 Command Reference
|
||||
|
||||
| Command | Description | Use Case |
|
||||
|---------|-------------|----------|
|
||||
| `--check` | Check certificate expiration | Regular monitoring |
|
||||
| `--obtain` | Obtain new certificate from Let's Encrypt | Initial creation |
|
||||
| `--renew` | Renew existing certificate | Renewal |
|
||||
| `--auto` | Automatic check and renewal | For cron/systemd |
|
||||
| `--test-cert` | Create test self-signed certificate | Development/testing |
|
||||
| `--test-api` | Check API access to reg.ru | Connection diagnostics |
|
||||
| `--test-dns` | Test DNS record creation | Pre-SSL verification |
|
||||
| `--auth-hook` | Certbot hook (DNS creation) | Internal |
|
||||
| `--cleanup-hook` | Certbot hook (DNS deletion) | Internal |
|
||||
| `--help` | Show help | Help |
|
||||
| `-v` | Verbose output | Debugging |
|
||||
|
||||
## Automatic Renewal
|
||||
|
||||
The installer configures a systemd timer for automatic checks:
|
||||
|
||||
```bash
|
||||
# Check timer status
|
||||
systemctl status letsencrypt-regru.timer
|
||||
|
||||
# When is next run
|
||||
systemctl list-timers letsencrypt-regru.timer
|
||||
|
||||
# View run history
|
||||
journalctl -u letsencrypt-regru
|
||||
|
||||
# Follow logs in real-time
|
||||
journalctl -u letsencrypt-regru -f
|
||||
```
|
||||
|
||||
### Timer Settings
|
||||
|
||||
Default settings:
|
||||
- First run: 15 minutes after system boot
|
||||
- Frequency: every 12 hours
|
||||
- Random delay: up to 1 hour (to avoid creating load)
|
||||
|
||||
Can be modified in `/etc/systemd/system/letsencrypt-regru.timer`.
|
||||
|
||||
## Editing Configuration
|
||||
|
||||
```bash
|
||||
# Open configuration in editor
|
||||
sudo nano /etc/letsencrypt-regru/config.json
|
||||
|
||||
# After changes, restart timer
|
||||
sudo systemctl restart letsencrypt-regru.timer
|
||||
```
|
||||
|
||||
### Example 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://10.10.10.14:81",
|
||||
"npm_email": "admin@npm.local",
|
||||
"npm_password": "secure_password"
|
||||
}
|
||||
```
|
||||
|
||||
## Updating Application
|
||||
|
||||
```bash
|
||||
# Download latest version
|
||||
cd configure_nginx_manager
|
||||
git pull
|
||||
|
||||
# Run update
|
||||
sudo ./letsencrypt_regru.sh update
|
||||
```
|
||||
|
||||
Update will:
|
||||
- Stop timer
|
||||
- Update script
|
||||
- Update Python dependencies
|
||||
- Restart timer
|
||||
|
||||
## Uninstallation
|
||||
|
||||
```bash
|
||||
# Complete application removal
|
||||
sudo ./letsencrypt_regru.sh uninstall
|
||||
```
|
||||
|
||||
Script will remove:
|
||||
- Application from `/opt/letsencrypt-regru/`
|
||||
- Systemd services
|
||||
- Global command
|
||||
|
||||
Certificates in `/etc/letsencrypt/live/` are preserved!
|
||||
|
||||
Optionally you can remove:
|
||||
- Configuration `/etc/letsencrypt-regru/`
|
||||
- Logs `/var/log/letsencrypt-regru/`
|
||||
|
||||
## Viewing Logs
|
||||
|
||||
```bash
|
||||
# Systemd logs (recommended)
|
||||
journalctl -u letsencrypt-regru -f
|
||||
|
||||
# Log file
|
||||
tail -f /var/log/letsencrypt-regru/letsencrypt_regru.log
|
||||
|
||||
# Last 100 lines
|
||||
tail -n 100 /var/log/letsencrypt-regru/letsencrypt_regru.log
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Installation Check
|
||||
|
||||
```bash
|
||||
# Check command availability
|
||||
which letsencrypt-regru
|
||||
|
||||
# Check Python environment
|
||||
ls -la /opt/letsencrypt-regru/venv/
|
||||
|
||||
# Check systemd services
|
||||
systemctl list-unit-files | grep letsencrypt-regru
|
||||
```
|
||||
|
||||
### Installation Errors
|
||||
|
||||
**Error: "Permission denied"**
|
||||
```bash
|
||||
# Run with sudo
|
||||
sudo ./letsencrypt_regru.sh
|
||||
```
|
||||
|
||||
**Error: "Package not found"**
|
||||
```bash
|
||||
# Update package lists
|
||||
sudo apt-get update # Debian/Ubuntu
|
||||
sudo yum update # CentOS/RHEL
|
||||
```
|
||||
|
||||
**Error: "Python module not found"**
|
||||
```bash
|
||||
# Reinstall virtual environment
|
||||
sudo rm -rf /opt/letsencrypt-regru/venv
|
||||
sudo ./letsencrypt_regru.sh
|
||||
```
|
||||
|
||||
### Certificate Issues
|
||||
|
||||
**Certificate not created**
|
||||
```bash
|
||||
# Check logs
|
||||
tail -n 50 /var/log/letsencrypt-regru/letsencrypt_regru.log
|
||||
|
||||
# Check configuration
|
||||
cat /etc/letsencrypt-regru/config.json
|
||||
|
||||
# Try manually
|
||||
letsencrypt-regru --obtain -v
|
||||
```
|
||||
|
||||
**DNS not updating**
|
||||
```bash
|
||||
# Increase wait time in config.json
|
||||
"dns_propagation_wait": 120,
|
||||
"dns_check_attempts": 20
|
||||
```
|
||||
|
||||
### NPM Issues
|
||||
|
||||
**Not uploading to NPM**
|
||||
```bash
|
||||
# Check NPM availability
|
||||
curl http://192.168.10.14:81
|
||||
|
||||
# Check credentials in config.json
|
||||
# Try manually
|
||||
letsencrypt-regru --test-cert -v
|
||||
```
|
||||
|
||||
## Supported OS
|
||||
|
||||
✅ Debian 10, 11, 12
|
||||
✅ Ubuntu 20.04, 22.04, 24.04
|
||||
✅ CentOS 7, 8
|
||||
✅ RHEL 7, 8, 9
|
||||
✅ Fedora 35+
|
||||
|
||||
## Additional Features
|
||||
|
||||
### Test Certificate
|
||||
|
||||
For testing without Let's Encrypt rate limits:
|
||||
|
||||
```bash
|
||||
letsencrypt-regru --test-cert
|
||||
```
|
||||
|
||||
Creates self-signed certificate valid for 90 days.
|
||||
|
||||
### Manual Renewal Run
|
||||
|
||||
```bash
|
||||
# Start service manually
|
||||
sudo systemctl start letsencrypt-regru.service
|
||||
|
||||
# Check status
|
||||
systemctl status letsencrypt-regru.service
|
||||
```
|
||||
|
||||
### Change Check Frequency
|
||||
|
||||
Edit `/etc/systemd/system/letsencrypt-regru.timer`:
|
||||
|
||||
```ini
|
||||
[Timer]
|
||||
# Every 6 hours instead of 12
|
||||
OnUnitActiveSec=6h
|
||||
```
|
||||
|
||||
Then:
|
||||
```bash
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl restart letsencrypt-regru.timer
|
||||
```
|
||||
|
||||
## Security
|
||||
|
||||
- Configuration with passwords has `600` permissions (root only)
|
||||
- Certificate private keys have `600` permissions
|
||||
- All operations run as root
|
||||
- Logs accessible only to root
|
||||
|
||||
## Support
|
||||
|
||||
- GitHub Issues: https://github.com/DFofanov/configure_nginx_manager/issues
|
||||
- Documentation: `/opt/letsencrypt-regru/docs/`
|
||||
- Email: admin@dfv24.com
|
||||
|
||||
---
|
||||
|
||||
**Developed by:** Dmitry Fofanov
|
||||
**Date:** October 28, 2025
|
||||
**Version:** 2.0
|
||||
@@ -0,0 +1,159 @@
|
||||
# Makefile Commands - Quick Reference
|
||||
|
||||
## 📋 Command Categories
|
||||
|
||||
### 🛠️ Installation and Deployment
|
||||
|
||||
```bash
|
||||
make install # Full application installation
|
||||
make uninstall # Remove application
|
||||
make status # Check installation status
|
||||
make check-config # Verify configuration
|
||||
```
|
||||
|
||||
### 🔨 Building Executables
|
||||
|
||||
```bash
|
||||
make build # Build for current OS
|
||||
make build-linux # Build for Linux
|
||||
make build-windows # Build for Windows
|
||||
make build-all # Build for all platforms
|
||||
```
|
||||
|
||||
### 📦 Creating Packages
|
||||
|
||||
```bash
|
||||
make package-linux # Create tar.gz for Linux
|
||||
make package-windows # Create zip for Windows
|
||||
make release # Full release cycle
|
||||
```
|
||||
|
||||
### 🧪 Testing
|
||||
|
||||
```bash
|
||||
make test-run # Test script run
|
||||
make test-cert # Create test certificate
|
||||
make test-build # Test built file
|
||||
```
|
||||
|
||||
### 🚀 Running Operations
|
||||
|
||||
```bash
|
||||
make run # Automatic check and renewal
|
||||
make obtain # Obtain new certificate
|
||||
make renew # Renew existing certificate
|
||||
```
|
||||
|
||||
### 📊 Monitoring
|
||||
|
||||
```bash
|
||||
make logs # Show logs
|
||||
make status # Service status
|
||||
```
|
||||
|
||||
### 🧹 Cleanup
|
||||
|
||||
```bash
|
||||
make clean # Clean Python temporary files
|
||||
make clean-build # Clean build artifacts
|
||||
```
|
||||
|
||||
### ℹ️ Information
|
||||
|
||||
```bash
|
||||
make help # Show help
|
||||
make build-info # Build environment information
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Common Scenarios
|
||||
|
||||
### Initial Installation
|
||||
```bash
|
||||
sudo make install
|
||||
sudo make check-config
|
||||
sudo make test-run
|
||||
```
|
||||
|
||||
### Building Release for GitHub
|
||||
```bash
|
||||
make clean-build
|
||||
make release
|
||||
# Files will be in dist/
|
||||
```
|
||||
|
||||
### Creating Test Environment
|
||||
```bash
|
||||
sudo make install
|
||||
sudo make test-cert
|
||||
sudo make status
|
||||
```
|
||||
|
||||
### Manual Certificate Renewal
|
||||
```bash
|
||||
sudo make run
|
||||
sudo make logs
|
||||
```
|
||||
|
||||
### Removing Application
|
||||
```bash
|
||||
sudo make uninstall
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Environment Variables
|
||||
|
||||
Main variables defined in Makefile:
|
||||
|
||||
```makefile
|
||||
INSTALL_DIR = /opt/letsencrypt-regru
|
||||
CONFIG_FILE = /etc/letsencrypt/regru_config.json
|
||||
LOG_FILE = /var/log/letsencrypt_regru.log
|
||||
SERVICE_NAME = letsencrypt-regru
|
||||
PYTHON = python3
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔐 Required Permissions
|
||||
|
||||
**Require sudo:**
|
||||
- `make install`
|
||||
- `make uninstall`
|
||||
- `make run`
|
||||
- `make obtain`
|
||||
- `make renew`
|
||||
- `make test-run`
|
||||
- `make test-cert`
|
||||
|
||||
**Don't require sudo:**
|
||||
- `make build*`
|
||||
- `make package*`
|
||||
- `make clean*`
|
||||
- `make help`
|
||||
- `make build-info`
|
||||
|
||||
---
|
||||
|
||||
## 💡 Useful Combinations
|
||||
|
||||
```bash
|
||||
# Full reinstallation
|
||||
sudo make uninstall && sudo make install
|
||||
|
||||
# Build and test
|
||||
make build && make test-build
|
||||
|
||||
# Clean and release
|
||||
make clean-build && make release
|
||||
|
||||
# Post-installation check
|
||||
sudo make status && sudo make test-run && sudo make logs
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Author:** Dmitry Fofanov
|
||||
**Last Updated:** October 28, 2025
|
||||
@@ -0,0 +1,79 @@
|
||||
# Detailed Guide to Configuring Nginx Proxy Manager with One Global SSL Certificate for All dfv24.com Domains
|
||||
|
||||
## Prerequisites
|
||||
- [Nginx Proxy Manager](http://192.168.10.14:81/) is installed and running
|
||||
- Main domain: dfv24.com
|
||||
- Domain hosting and DNS records are on reg.ru
|
||||
- Need to use one SSL certificate (e.g., wildcard) for all dfv24.com subdomains
|
||||
|
||||
---
|
||||
|
||||
## Step 1. Purchasing and Obtaining SSL Wildcard Certificate for dfv24.com
|
||||
1. On reg.ru or any other Certificate Authority (CA), order wildcard certificate for domain `*.dfv24.com`.
|
||||
2. Obtain certificate files:
|
||||
- Main certificate (CRT)
|
||||
- Intermediate certificates (CA Bundle)
|
||||
- Private key (KEY)
|
||||
|
||||
---
|
||||
|
||||
## Step 2. Importing Your SSL Certificate to Nginx Proxy Manager
|
||||
1. Log in to Nginx Proxy Manager at http://192.168.10.14:81/
|
||||
2. Go to **SSL Certificates** section → **Add SSL Certificate** button
|
||||
3. Select **Custom** (custom certificate)
|
||||
4. Paste into fields:
|
||||
- **Certificate** — main CRT + CA Bundle (if CA Bundle is separate, concatenate into one file or paste sequentially)
|
||||
- **Key** — private key content
|
||||
- Name certificate, e.g., `dfv24_wildcard`
|
||||
5. Save
|
||||
|
||||
---
|
||||
|
||||
## Step 3. Configuring Proxy Hosts Using Global Certificate
|
||||
|
||||
1. Go to **Proxy Hosts** → **Add Proxy Host**
|
||||
2. Fill in fields:
|
||||
- **Domain Names**: For example, `sub1.dfv24.com` (for first subdomain)
|
||||
- **Scheme**: http or https, depending on backend
|
||||
- **Forward Hostname / IP**: IP or DNS address of your internal service
|
||||
- **Forward Port**: service port (e.g., 80 or 443)
|
||||
3. Enable **SSL** → Check **Use a shared SSL certificate** (if such option is available) or select previously imported certificate from list
|
||||
4. Activate: **Block Common Exploits**, **Websockets Support**, set Redirect HTTP to HTTPS if required
|
||||
5. Save proxy host
|
||||
|
||||
6. Repeat for all subdomains, specifying needed domains and selecting same wildcard SSL certificate
|
||||
|
||||
---
|
||||
|
||||
## Step 4. Configuring DNS Records on reg.ru
|
||||
|
||||
1. Log in to domain management panel on reg.ru
|
||||
2. Create or edit DNS A records:
|
||||
- `dfv24.com` → IP of your Nginx Proxy Manager (e.g., 192.168.10.14)
|
||||
- `*.dfv24.com` → same IP or specific subdomains if there are special ones
|
||||
3. Save changes
|
||||
4. Wait for DNS update (from few minutes to 24 hours)
|
||||
|
||||
---
|
||||
|
||||
## Step 5. Testing and Verification
|
||||
|
||||
1. In browser, open any subdomain `https://sub1.dfv24.com`
|
||||
2. Certificate should be valid, issued for wildcard `*.dfv24.com`
|
||||
3. Check proxy functionality and correct certificate assignment
|
||||
4. If necessary, check Nginx Proxy Manager logs and fix errors
|
||||
|
||||
---
|
||||
|
||||
## Additional Information
|
||||
|
||||
- If Nginx Proxy Manager doesn't have GUI option to select shared certificate, you can manually configure configs through `/data/nginx/proxy_host` directory and specify SSL certificate for all hosts.
|
||||
- When updating certificate — re-import it to Nginx Proxy Manager.
|
||||
- You can use Let's Encrypt for automatic wildcard certificate obtaining using DNS validation (if supported by your DNS provider).
|
||||
|
||||
---
|
||||
|
||||
# Summary
|
||||
|
||||
Use one wildcard certificate for all subdomains, import it as custom certificate in Nginx Proxy Manager, when creating proxy hosts select it in SSL settings. Manage DNS records on reg.ru, directing domain to Nginx Proxy Manager IP.
|
||||
This allows legitimate use of single certificate for all services with different subdomains under your dfv24.com domain.
|
||||
@@ -0,0 +1,287 @@
|
||||
# 📁 configure_nginx_manager Project Structure
|
||||
|
||||
## Main Scripts
|
||||
|
||||
### Python (Recommended)
|
||||
- **letsencrypt_regru_api.py** (1,411 lines)
|
||||
- Full-featured Python script
|
||||
- Direct reg.ru API integration
|
||||
- Nginx Proxy Manager integration
|
||||
- Automatic certificate check and renewal
|
||||
- Test self-signed certificate generation
|
||||
- Wildcard domain support
|
||||
|
||||
### Bash
|
||||
- **letsencrypt_regru_dns.sh**
|
||||
- Bash script with certbot-dns-regru plugin
|
||||
- Easy to use
|
||||
- Minimal dependencies
|
||||
|
||||
### PowerShell
|
||||
- **letsencrypt_regru.ps1**
|
||||
- Windows version
|
||||
- Similar to Bash script
|
||||
|
||||
### Testing
|
||||
- **test_certificate.sh**
|
||||
- Quick test certificate creation via OpenSSL
|
||||
- Standalone operation without Python
|
||||
- Wildcard domain support
|
||||
|
||||
## Automation
|
||||
|
||||
### Makefile
|
||||
- **Makefile** (415 lines)
|
||||
- `make install` - Complete installation and setup
|
||||
- `make uninstall` - Clean removal
|
||||
- `make status` - Check status
|
||||
- `make test-cert` - Create test certificate
|
||||
- `make obtain` - Get Let's Encrypt certificate
|
||||
- `make renew` - Renew certificate
|
||||
- `make logs` - View logs
|
||||
- `make check-config` - Validate configuration
|
||||
|
||||
## Configuration
|
||||
|
||||
### config.json.example
|
||||
Example configuration with all parameters:
|
||||
- reg.ru API credentials
|
||||
- Domain and email settings
|
||||
- Renewal parameters (renewal_days)
|
||||
- Nginx Proxy Manager settings
|
||||
- Directory and log paths
|
||||
|
||||
## Documentation
|
||||
|
||||
### README.md (1,420+ lines)
|
||||
Main documentation:
|
||||
- Introduction and features
|
||||
- Quick start
|
||||
- Makefile installation
|
||||
- Test certificate creation
|
||||
- Requirements and dependencies
|
||||
- Configuration and usage
|
||||
- NPM integration
|
||||
- Automatic check and renewal
|
||||
- Automation via cron/systemd
|
||||
- Troubleshooting
|
||||
|
||||
### README_EN.md (English version)
|
||||
Complete English translation of main guide
|
||||
|
||||
### TESTING_GUIDE.md (370+ lines)
|
||||
Testing guide:
|
||||
- Why test certificates are needed
|
||||
- Bypass Let's Encrypt limits (5 per week)
|
||||
- Quick start with test certificates
|
||||
- Method comparison
|
||||
- Development usage
|
||||
- Test automation
|
||||
- Transition from test to production
|
||||
- FAQ
|
||||
- CI/CD and Docker examples
|
||||
|
||||
### TESTING_GUIDE_EN.md (English version)
|
||||
Complete English translation of testing guide
|
||||
|
||||
### GITEA_SYNC.md
|
||||
Gitea → GitHub synchronization:
|
||||
- 4 sync methods (Git Hooks, GitHub Actions, Gitea Mirror, Double Remote)
|
||||
- Step-by-step installation
|
||||
- SSH and token setup
|
||||
- Webhook integration
|
||||
- Troubleshooting
|
||||
- Method comparison
|
||||
|
||||
### GITEA_SYNC_EN.md (English version)
|
||||
Complete English translation of sync guide
|
||||
|
||||
### CHEATSHEET.md
|
||||
Quick reference:
|
||||
- Main commands
|
||||
- Development workflow
|
||||
- Use case scenarios
|
||||
- Common errors and solutions
|
||||
- Checking and debugging
|
||||
|
||||
### CHEATSHEET_EN.md (English version)
|
||||
Complete English translation of cheatsheet
|
||||
|
||||
### PROJECT_STRUCTURE.md (this file)
|
||||
- All project files description
|
||||
- Component overview
|
||||
|
||||
### PROJECT_STRUCTURE_EN.md (English version)
|
||||
Complete English translation of structure
|
||||
|
||||
### DESCRIPTION.md
|
||||
Project description:
|
||||
- Russian description
|
||||
- English description
|
||||
- Quick start
|
||||
- Features overview
|
||||
|
||||
### CHANGELOG.md
|
||||
Change history:
|
||||
- Versions and updates
|
||||
- New features
|
||||
- Bug fixes
|
||||
- Roadmap
|
||||
|
||||
### CHANGELOG_EN.md (English version)
|
||||
Complete English translation of changelog
|
||||
|
||||
## Git Integration
|
||||
|
||||
### .github/workflows/sync-from-gitea.yml
|
||||
GitHub Actions for synchronization:
|
||||
- Automatic check every hour
|
||||
- Webhook trigger from Gitea
|
||||
- Manual run
|
||||
- Merge changes from Gitea
|
||||
- Push to GitHub
|
||||
|
||||
### gitea-hooks/
|
||||
Git hooks for Gitea server:
|
||||
|
||||
**post-receive**
|
||||
- Automatic push to GitHub after commit
|
||||
- Instant sync (< 1 second)
|
||||
- Operation logging
|
||||
- Tag synchronization
|
||||
- SSH and HTTPS support
|
||||
|
||||
**README.md**
|
||||
- Hook installation instructions
|
||||
- Authentication setup
|
||||
- Troubleshooting
|
||||
|
||||
**README_EN.md** (English version)
|
||||
Complete English translation
|
||||
|
||||
## Additional Files
|
||||
|
||||
### Markdown Documents
|
||||
- **Add Let's Encrypt Certificate для провайдера reg.ru.md**
|
||||
- Initial instructions (Russian)
|
||||
|
||||
- **Создание и продление SSL сертификата.md**
|
||||
- Additional process information (Russian)
|
||||
|
||||
## Features
|
||||
|
||||
### ✅ Core Features
|
||||
- [x] Let's Encrypt certificates via reg.ru DNS API
|
||||
- [x] Wildcard certificates (*.domain.com)
|
||||
- [x] Automatic certificate renewal
|
||||
- [x] DNS-01 validation
|
||||
- [x] Nginx Proxy Manager integration
|
||||
- [x] Automatic upload/update to NPM
|
||||
|
||||
### ✅ Advanced Features
|
||||
- [x] Automatic expiration check
|
||||
- [x] Configurable renewal threshold (renewal_days)
|
||||
- [x] Systemd service + timer
|
||||
- [x] Cron automation
|
||||
- [x] Detailed logging
|
||||
- [x] Configuration validation
|
||||
|
||||
### 🆕 Testing
|
||||
- [x] Self-signed test certificate generation
|
||||
- [x] Bypass Let's Encrypt limits (5/week)
|
||||
- [x] Instant creation without DNS
|
||||
- [x] Test certificate NPM integration
|
||||
- [x] Full structure compatibility with Let's Encrypt
|
||||
|
||||
### 🔄 Repository Sync
|
||||
- [x] Automatic Gitea → GitHub sync
|
||||
- [x] Git Hooks (instant sync)
|
||||
- [x] GitHub Actions (hourly check)
|
||||
- [x] Webhook integration
|
||||
- [x] SSH and HTTPS authentication
|
||||
|
||||
## Installation
|
||||
|
||||
### Quick Install
|
||||
```bash
|
||||
sudo make install
|
||||
sudo nano /etc/letsencrypt/regru_config.json
|
||||
sudo make test-cert # For testing
|
||||
sudo make obtain # For production
|
||||
```
|
||||
|
||||
### Post-Install Structure
|
||||
```
|
||||
/opt/letsencrypt-regru/
|
||||
├── letsencrypt_regru_api.py
|
||||
|
||||
/etc/letsencrypt/
|
||||
├── regru_config.json
|
||||
└── live/
|
||||
└── example.com/
|
||||
├── privkey.pem
|
||||
├── cert.pem
|
||||
├── fullchain.pem
|
||||
└── chain.pem
|
||||
|
||||
/etc/systemd/system/
|
||||
├── letsencrypt-regru.service
|
||||
└── letsencrypt-regru.timer
|
||||
|
||||
/var/log/letsencrypt/
|
||||
└── letsencrypt_regru.log
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Testing (no limits)
|
||||
```bash
|
||||
sudo make test-cert # Create test certificate
|
||||
sudo make status # Check status
|
||||
```
|
||||
|
||||
### Production
|
||||
```bash
|
||||
sudo make obtain # Get Let's Encrypt certificate
|
||||
sudo make renew # Renew certificate
|
||||
sudo make run # Automatic mode
|
||||
```
|
||||
|
||||
### Monitoring
|
||||
```bash
|
||||
sudo make logs # View logs
|
||||
sudo make status # Service status
|
||||
sudo make check-config # Check configuration
|
||||
```
|
||||
|
||||
## Technologies
|
||||
|
||||
- **Python 3.6+** - Main language
|
||||
- **Certbot** - Let's Encrypt client
|
||||
- **requests** - HTTP API requests
|
||||
- **cryptography** - Test certificate generation
|
||||
- **systemd** - Launch automation
|
||||
- **cron** - Alternative automation
|
||||
- **Make** - Installation management
|
||||
- **OpenSSL** - Alternative certificate generation
|
||||
|
||||
## License
|
||||
|
||||
Open Source - Free to use
|
||||
|
||||
## Author
|
||||
|
||||
Фофанов Дмитрий @ 2025
|
||||
|
||||
## Support
|
||||
|
||||
See documentation:
|
||||
- [README.md](README.md) / [README_EN.md](README_EN.md) - Main guide
|
||||
- [TESTING_GUIDE.md](TESTING_GUIDE.md) / [TESTING_GUIDE_EN.md](TESTING_GUIDE_EN.md) - Testing guide
|
||||
- [GITEA_SYNC.md](GITEA_SYNC.md) / [GITEA_SYNC_EN.md](GITEA_SYNC_EN.md) - Repository sync
|
||||
|
||||
---
|
||||
|
||||
**Version**: 2.1
|
||||
**Date**: October 27, 2025
|
||||
**Status**: ✅ Production Ready
|
||||
@@ -0,0 +1,111 @@
|
||||
# 🎯 Quick Start - Building Executables
|
||||
|
||||
This is a quick guide for those who want to build an executable file fast.
|
||||
|
||||
## For Linux
|
||||
|
||||
### 1. Install dependencies
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y python3 python3-pip git make
|
||||
```
|
||||
|
||||
### 2. Clone repository
|
||||
```bash
|
||||
git clone https://github.com/DFofanov/configure_nginx_manager.git
|
||||
cd configure_nginx_manager
|
||||
```
|
||||
|
||||
### 3. Build
|
||||
```bash
|
||||
make build-linux
|
||||
```
|
||||
|
||||
### 4. Result
|
||||
```bash
|
||||
ls -lh dist/letsencrypt-regru
|
||||
# Executable file is ready!
|
||||
```
|
||||
|
||||
### 5. Install (optional)
|
||||
```bash
|
||||
sudo cp dist/letsencrypt-regru /usr/local/bin/
|
||||
sudo chmod +x /usr/local/bin/letsencrypt-regru
|
||||
```
|
||||
|
||||
### 6. Use
|
||||
```bash
|
||||
letsencrypt-regru --help
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## For Windows
|
||||
|
||||
### 1. Install Python
|
||||
Download from [python.org](https://www.python.org/downloads/) and install
|
||||
|
||||
### 2. Clone repository
|
||||
```powershell
|
||||
git clone https://github.com/DFofanov/configure_nginx_manager.git
|
||||
cd configure_nginx_manager
|
||||
```
|
||||
|
||||
### 3. Build
|
||||
```powershell
|
||||
make build-windows
|
||||
```
|
||||
|
||||
### 4. Result
|
||||
```powershell
|
||||
dir dist\letsencrypt-regru.exe
|
||||
# Executable file is ready!
|
||||
```
|
||||
|
||||
### 5. Use
|
||||
```powershell
|
||||
.\dist\letsencrypt-regru.exe --help
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Creating Release for Both Platforms
|
||||
|
||||
```bash
|
||||
# This will create packages for Linux and Windows
|
||||
make release
|
||||
```
|
||||
|
||||
**Result in `dist/`:**
|
||||
- `letsencrypt-regru-linux-x86_64.tar.gz`
|
||||
- `letsencrypt-regru-windows-x86_64.zip`
|
||||
|
||||
---
|
||||
|
||||
## Useful Commands
|
||||
|
||||
```bash
|
||||
# Show help for all commands
|
||||
make help
|
||||
|
||||
# Build environment information
|
||||
make build-info
|
||||
|
||||
# Test built file
|
||||
make test-build
|
||||
|
||||
# Clean artifacts
|
||||
make clean-build
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ❓ Problems?
|
||||
|
||||
See [BUILD_GUIDE_EN.md](BUILD_GUIDE_EN.md) for detailed instructions and troubleshooting.
|
||||
|
||||
---
|
||||
|
||||
**File size:** ~40-60 MB (including Python runtime)
|
||||
**Build time:** ~2-5 minutes
|
||||
**Requirements:** Python 3.8+, PyInstaller
|
||||
@@ -0,0 +1,178 @@
|
||||
# 🎯 Quick Guide: Automatic Releases
|
||||
|
||||
## For GitHub
|
||||
|
||||
### 1. Creating a Release
|
||||
|
||||
```bash
|
||||
# Create tag
|
||||
git tag -a v1.0.0 -m "Release version 1.0.0"
|
||||
|
||||
# Push tag
|
||||
git push origin v1.0.0
|
||||
```
|
||||
|
||||
### 2. What Happens Automatically
|
||||
|
||||
GitHub Actions will run `.github/workflows/build-release.yml`:
|
||||
|
||||
1. ✅ Build Linux version (Ubuntu runner)
|
||||
2. ✅ Build Windows version (Windows runner)
|
||||
3. ✅ Create packages
|
||||
4. ✅ Generate SHA256 checksums
|
||||
5. ✅ Create GitHub Release
|
||||
6. ✅ Upload artifacts
|
||||
|
||||
### 3. Result
|
||||
|
||||
Release will appear at: `https://github.com/USER/REPO/releases/tag/v1.0.0`
|
||||
|
||||
**Files:**
|
||||
- `letsencrypt-regru-linux-x86_64.tar.gz`
|
||||
- `letsencrypt-regru-linux-x86_64.tar.gz.sha256`
|
||||
- `letsencrypt-regru-windows-x86_64.zip`
|
||||
- `letsencrypt-regru-windows-x86_64.zip.sha256`
|
||||
|
||||
---
|
||||
|
||||
## For Gitea
|
||||
|
||||
### 1. Setup (one time)
|
||||
|
||||
#### Enable Actions in Gitea:
|
||||
|
||||
Edit `app.ini`:
|
||||
|
||||
```ini
|
||||
[actions]
|
||||
ENABLED = true
|
||||
DEFAULT_ACTIONS_URL = https://gitea.com
|
||||
```
|
||||
|
||||
#### Install Gitea Runner:
|
||||
|
||||
```bash
|
||||
# Download
|
||||
wget https://dl.gitea.com/act_runner/latest/act_runner-linux-amd64 -O act_runner
|
||||
chmod +x act_runner
|
||||
|
||||
# Register
|
||||
./act_runner register --no-interactive \
|
||||
--instance https://your-gitea.com \
|
||||
--token YOUR_RUNNER_TOKEN
|
||||
|
||||
# Run
|
||||
./act_runner daemon
|
||||
```
|
||||
|
||||
### 2. Creating a Release
|
||||
|
||||
```bash
|
||||
# Create tag
|
||||
git tag -a v1.0.0 -m "Release version 1.0.0"
|
||||
|
||||
# Push tag
|
||||
git push origin v1.0.0
|
||||
```
|
||||
|
||||
### 3. What Happens
|
||||
|
||||
Gitea Actions will run `.gitea/workflows/release.yml`:
|
||||
|
||||
1. ✅ Build Linux version
|
||||
2. ✅ Build Windows version
|
||||
3. ✅ Create packages
|
||||
4. ✅ Generate SHA256 + MD5 checksums
|
||||
5. ✅ Create Gitea Release
|
||||
6. ✅ Detailed release notes
|
||||
|
||||
### 4. Result
|
||||
|
||||
Release will appear at: `https://your-gitea.com/USER/REPO/releases/tag/v1.0.0`
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Pre-Release Checklist
|
||||
|
||||
```bash
|
||||
# 1. Local build
|
||||
make clean-build
|
||||
make release
|
||||
|
||||
# 2. Testing
|
||||
make test-build
|
||||
|
||||
# 3. Check files
|
||||
ls -lh dist/
|
||||
|
||||
# 4. If all OK - create tag
|
||||
git tag -a v1.0.0 -m "Release 1.0.0"
|
||||
git push origin v1.0.0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Monitoring
|
||||
|
||||
### GitHub:
|
||||
`https://github.com/USER/REPO/actions`
|
||||
|
||||
### Gitea:
|
||||
`https://your-gitea.com/USER/REPO/actions`
|
||||
|
||||
---
|
||||
|
||||
## 🐛 If Something Goes Wrong
|
||||
|
||||
### Delete tag and release:
|
||||
|
||||
```bash
|
||||
# Delete local tag
|
||||
git tag -d v1.0.0
|
||||
|
||||
# Delete remote tag
|
||||
git push --delete origin v1.0.0
|
||||
|
||||
# Delete release manually via web interface
|
||||
```
|
||||
|
||||
### Recreate release:
|
||||
|
||||
```bash
|
||||
# Fix the issue
|
||||
git commit -am "Fix build"
|
||||
|
||||
# Recreate tag
|
||||
git tag -a v1.0.0 -m "Release 1.0.0" --force
|
||||
git push origin v1.0.0 --force
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Semantic Versioning
|
||||
|
||||
```bash
|
||||
# Major (breaking changes)
|
||||
git tag v2.0.0
|
||||
|
||||
# Minor (new features)
|
||||
git tag v1.1.0
|
||||
|
||||
# Patch (bug fixes)
|
||||
git tag v1.0.1
|
||||
|
||||
# Pre-release
|
||||
git tag v1.0.0-beta.1
|
||||
git tag v1.0.0-rc.1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**See also:**
|
||||
- [.gitea/README.md](../../.gitea/README.md) - Full Gitea Actions documentation
|
||||
- [BUILD_GUIDE_EN.md](BUILD_GUIDE_EN.md) - Build guide
|
||||
|
||||
---
|
||||
|
||||
**Author:** Dmitry Fofanov
|
||||
**Last Updated:** October 28, 2025
|
||||
@@ -0,0 +1,86 @@
|
||||
# Guide to Creating Wildcard Certificate *.dfv24.com in Nginx Proxy Manager and Configuring Automatic SSL Renewal
|
||||
|
||||
---
|
||||
|
||||
## Step 1. Preparation
|
||||
|
||||
- Ensure Nginx Proxy Manager (NPM) is installed and accessible at http://192.168.10.14:81/
|
||||
- You have access to DNS records for dfv24.com domain in reg.ru control panel or another registrar
|
||||
|
||||
---
|
||||
|
||||
## Step 2. Creating Wildcard SSL Certificate in Nginx Proxy Manager
|
||||
|
||||
1. Log in to Nginx Proxy Manager admin panel at http://192.168.10.14:81/
|
||||
|
||||
2. Navigate to **SSL Certificates** → click **Add SSL Certificate** button
|
||||
|
||||
3. Select **Let's Encrypt**
|
||||
|
||||
4. Fill in the fields:
|
||||
- **Domain Names:**
|
||||
Enter `*.dfv24.com` — for wildcard certificate
|
||||
Also recommended to add main domain `dfv24.com` (comma-separated or in new field)
|
||||
- **Email Address:**
|
||||
Specify your Email for Let's Encrypt notifications (required)
|
||||
- **HTTP Challenge:**
|
||||
Leave HTTP verification if NPM is accessible from internet on ports 80 and 443, or configure DNS Challenge if supported by your DNS
|
||||
|
||||
5. Check "Agree to the Let's Encrypt Terms of Service"
|
||||
|
||||
6. Click **Save**
|
||||
|
||||
- NPM will begin certificate obtaining process with domain verification.
|
||||
- Upon successful certificate request, you'll see new certificate in the list.
|
||||
|
||||
---
|
||||
|
||||
## Step 3. Configuring Automatic Renewal
|
||||
|
||||
- Nginx Proxy Manager automatically handles Let's Encrypt certificate renewal.
|
||||
- For this, server must be accessible from internet on ports 80 and 443, and DNS records must correctly point to your server.
|
||||
- NPM periodically (usually 30 days before expiration) requests certificate renewal.
|
||||
- When using DNS Challenge, NPM must have DNS provider integration configured (if supported).
|
||||
|
||||
---
|
||||
|
||||
## Step 4. Using Wildcard Certificate in Proxy Hosts
|
||||
|
||||
1. Go to **Proxy Hosts** → Create or edit proxy entry
|
||||
|
||||
2. In **Domain Names** field, specify needed subdomain from dfv24.com, for example:
|
||||
`api.dfv24.com` or `www.dfv24.com`
|
||||
|
||||
3. In **SSL** section, select your wildcard certificate `*.dfv24.com` that you obtained in Step 2
|
||||
|
||||
4. Enable options:
|
||||
- Use SSL
|
||||
- Force SSL
|
||||
- HSTS (if needed)
|
||||
|
||||
5. Save changes.
|
||||
|
||||
---
|
||||
|
||||
## Step 5. Verification
|
||||
|
||||
1. Verify that all subdomains use the same certificate
|
||||
2. Visit https://api.dfv24.com or other subdomains from browser
|
||||
3. Ensure certificate is valid, not expired, and issued for *.dfv24.com
|
||||
4. Check certificate renewal status in SSL Certificates section
|
||||
|
||||
---
|
||||
|
||||
## Additional Information
|
||||
|
||||
- If Let's Encrypt cannot perform HTTP Challenge due to closed port, configure DNS Challenge (may require DNS provider API key)
|
||||
- For security and notifications, keep Email up to date
|
||||
- Check Nginx Proxy Manager logs to identify renewal errors
|
||||
|
||||
---
|
||||
|
||||
# Summary
|
||||
|
||||
Nginx Proxy Manager allows easy obtaining and automatic renewal of wildcard SSL certificates for *.dfv24.com domain using Let's Encrypt.
|
||||
Main requirements — properly configured DNS records and internet access on HTTP/HTTPS ports.
|
||||
Then use one global certificate for all your subdomains through Proxy Hosts settings.
|
||||
@@ -0,0 +1,250 @@
|
||||
# SSL Certificate Automation Scripts
|
||||
|
||||
**Author:** Фофанов Дмитрий
|
||||
|
||||
## 📖 Overview
|
||||
|
||||
This project contains scripts for automating the creation and renewal of Let's Encrypt SSL certificates using DNS-01 Challenge via the reg.ru API.
|
||||
|
||||
## 🎯 Quick Start
|
||||
|
||||
### Linux (Bash)
|
||||
|
||||
```bash
|
||||
# 1. Install dependencies
|
||||
sudo apt-get install certbot jq
|
||||
|
||||
# 2. Configure credentials
|
||||
nano ~/.regru_credentials
|
||||
# Add:
|
||||
# export REGRU_USERNAME="your_login"
|
||||
# export REGRU_PASSWORD="your_password"
|
||||
|
||||
# 3. Set permissions
|
||||
chmod 600 ~/.regru_credentials
|
||||
|
||||
# 4. Run the script
|
||||
./letsencrypt_regru.sh \
|
||||
-d "*.dfv24.com" \
|
||||
-e "dfofanov@dfv24.com"
|
||||
```
|
||||
|
||||
### Linux (Python)
|
||||
|
||||
```bash
|
||||
# 1. Install dependencies
|
||||
pip install requests dnspython certbot
|
||||
|
||||
# 2. Configure
|
||||
cp config.example.yml config.yml
|
||||
nano config.yml
|
||||
|
||||
# 3. Run
|
||||
python letsencrypt_regru.py
|
||||
|
||||
# 4. Setup auto-renewal (cron)
|
||||
crontab -e
|
||||
# Add:
|
||||
# 0 3 * * 1 /usr/bin/python3 /path/to/letsencrypt_regru.py
|
||||
```
|
||||
|
||||
### Windows (PowerShell)
|
||||
|
||||
```powershell
|
||||
# 1. Run as Administrator
|
||||
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
||||
|
||||
# 2. Configure credentials
|
||||
$env:REGRU_USERNAME = "your_login"
|
||||
$env:REGRU_PASSWORD = "your_password"
|
||||
|
||||
# 3. Run
|
||||
.\letsencrypt_regru.ps1 `
|
||||
-Domain "*.dfv24.com" `
|
||||
-Email "dfofanov@dfv24.com"
|
||||
|
||||
# 4. Setup auto-renewal (Task Scheduler)
|
||||
# Import-Module .\ScheduledTask.psm1
|
||||
# Create-CertRenewalTask
|
||||
```
|
||||
|
||||
## ⚙️ Configuration
|
||||
|
||||
### Bash Script (`letsencrypt_regru.sh`)
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
# Required parameters
|
||||
DOMAIN="*.dfv24.com" # Your domain
|
||||
EMAIL="dfofanov@dfv24.com" # Contact email
|
||||
REGRU_USERNAME="your_login" # reg.ru login
|
||||
REGRU_PASSWORD="your_password" # reg.ru password
|
||||
|
||||
# Optional parameters
|
||||
DNS_PROPAGATION_WAIT=60 # Wait time for DNS propagation (seconds)
|
||||
LOG_FILE="/var/log/letsencrypt_regru.log"
|
||||
WEBSERVER="nginx" # nginx or apache2
|
||||
```
|
||||
|
||||
### Python Script (`letsencrypt_regru.py`)
|
||||
|
||||
Create `config.yml`:
|
||||
|
||||
```yaml
|
||||
# reg.ru credentials
|
||||
regru:
|
||||
username: "your_login"
|
||||
password: "your_password"
|
||||
|
||||
# Certificate settings
|
||||
certificate:
|
||||
domain: "*.dfv24.com"
|
||||
email: "dfofanov@dfv24.com"
|
||||
dns_propagation_wait: 60
|
||||
|
||||
# Logging
|
||||
logging:
|
||||
file: "/var/log/letsencrypt_regru.log"
|
||||
level: "INFO"
|
||||
|
||||
# Web server
|
||||
webserver:
|
||||
type: "nginx" # nginx, apache2, or null
|
||||
reload_command: "systemctl reload nginx"
|
||||
```
|
||||
|
||||
### PowerShell Script (`letsencrypt_regru.ps1`)
|
||||
|
||||
```powershell
|
||||
# Configuration
|
||||
$Config = @{
|
||||
Domain = "*.dfv24.com"
|
||||
Email = "dfofanov@dfv24.com"
|
||||
RegRuUsername = $env:REGRU_USERNAME
|
||||
RegRuPassword = $env:REGRU_PASSWORD
|
||||
DnsPropagationWait = 60
|
||||
LogFile = ".\letsencrypt_regru.log"
|
||||
}
|
||||
```
|
||||
|
||||
## 📋 Requirements
|
||||
|
||||
### Bash Script
|
||||
- **certbot** - Let's Encrypt client
|
||||
- **jq** - JSON processor
|
||||
- **curl** - HTTP requests
|
||||
- **dig** (optional) - DNS queries
|
||||
|
||||
### Python Script
|
||||
- **Python 3.6+**
|
||||
- **requests** - HTTP library
|
||||
- **dnspython** - DNS operations
|
||||
- **certbot** - Let's Encrypt client
|
||||
- **PyYAML** - YAML configuration
|
||||
|
||||
### PowerShell Script
|
||||
- **PowerShell 5.1+** or **PowerShell Core 7+**
|
||||
- **certbot** (via Chocolatey or manual installation)
|
||||
|
||||
## 🔄 Automatic Renewal
|
||||
|
||||
### Linux (cron)
|
||||
|
||||
```bash
|
||||
# Edit crontab
|
||||
crontab -e
|
||||
|
||||
# Add (runs every Monday at 3 AM):
|
||||
0 3 * * 1 /path/to/letsencrypt_regru.sh >> /var/log/cert_renewal.log 2>&1
|
||||
|
||||
# Or for Python:
|
||||
0 3 * * 1 /usr/bin/python3 /path/to/letsencrypt_regru.py
|
||||
```
|
||||
|
||||
### Windows (Task Scheduler)
|
||||
|
||||
```powershell
|
||||
# Create scheduled task
|
||||
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
|
||||
-Argument "-File C:\path\to\letsencrypt_regru.ps1"
|
||||
|
||||
$Trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At 3am
|
||||
|
||||
Register-ScheduledTask -TaskName "SSL Certificate Renewal" `
|
||||
-Action $Action -Trigger $Trigger -RunLevel Highest
|
||||
```
|
||||
|
||||
## ✨ Features
|
||||
|
||||
✅ Automatic DNS validation via reg.ru API
|
||||
✅ Certificate expiration check
|
||||
✅ Automatic renewal before expiration
|
||||
✅ Web server reload after renewal
|
||||
✅ Detailed logging of all operations
|
||||
|
||||
## 🔧 Using with Nginx Proxy Manager
|
||||
|
||||
After obtaining the certificate:
|
||||
|
||||
1. Log in to NPM: http://192.168.10.14:81/
|
||||
2. SSL Certificates → Add SSL Certificate → Custom
|
||||
3. Paste the content:
|
||||
- Certificate Key: `/etc/letsencrypt/live/domain.com/privkey.pem`
|
||||
- Certificate: `/etc/letsencrypt/live/domain.com/fullchain.pem`
|
||||
|
||||
## 📝 Logs
|
||||
|
||||
- Bash: `/var/log/letsencrypt_regru.log`
|
||||
- Python: `/var/log/letsencrypt_regru.log`
|
||||
- PowerShell: `.\letsencrypt_regru.log`
|
||||
- Certbot: `/var/log/letsencrypt/letsencrypt.log`
|
||||
|
||||
## 🆘 Troubleshooting
|
||||
|
||||
### API Authentication Error
|
||||
- Check your reg.ru credentials
|
||||
- Ensure the domain is under your control
|
||||
|
||||
### DNS Record Not Propagating
|
||||
- Increase `dns_propagation_wait` to 120 seconds
|
||||
- Check DNS: `nslookup -type=TXT _acme-challenge.domain.com`
|
||||
|
||||
### Certbot Not Found
|
||||
```bash
|
||||
# Ubuntu/Debian
|
||||
sudo apt-get install certbot
|
||||
|
||||
# Or via snap
|
||||
sudo snap install --classic certbot
|
||||
```
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
Detailed documentation in [USAGE.md](USAGE.md)
|
||||
|
||||
## 🔐 Security
|
||||
|
||||
- Keep credentials secure
|
||||
- Use `chmod 600` for configuration files
|
||||
- Regularly update passwords
|
||||
|
||||
## ⚠️ Important
|
||||
|
||||
- Let's Encrypt certificates are valid for 90 days
|
||||
- Automatic renewal setup is recommended
|
||||
- Wildcard certificates require DNS validation
|
||||
|
||||
## 📞 Support
|
||||
|
||||
- [reg.ru API Documentation](https://www.reg.ru/support/api)
|
||||
- [Let's Encrypt Documentation](https://letsencrypt.org/docs/)
|
||||
- [Certbot Documentation](https://certbot.eff.org/docs/)
|
||||
|
||||
## 📄 License
|
||||
|
||||
Scripts are provided "as is" for free use.
|
||||
|
||||
---
|
||||
|
||||
**Happy Automation! 🔒**
|
||||
@@ -0,0 +1,379 @@
|
||||
# 🧪 SSL Certificate Testing Guide
|
||||
|
||||
## Why do you need test certificates?
|
||||
|
||||
Let's Encrypt has **strict limits**:
|
||||
- ⚠️ Maximum **5 certificates per week** per domain
|
||||
- ⚠️ Maximum **50 certificates per week** per account
|
||||
- ⚠️ **1 week ban** if limits exceeded
|
||||
|
||||
**Solution**: Use self-signed test certificates for development!
|
||||
|
||||
---
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Option 1: Via Makefile (Recommended)
|
||||
|
||||
```bash
|
||||
# After script installation (make install)
|
||||
sudo make test-cert
|
||||
```
|
||||
|
||||
**Result**: Certificate created in `/etc/letsencrypt/live/your-domain/`
|
||||
|
||||
### Option 2: Via Python Script
|
||||
|
||||
```bash
|
||||
sudo python3 letsencrypt_regru_api.py \
|
||||
--config /etc/letsencrypt/regru_config.json \
|
||||
--test-cert -v
|
||||
```
|
||||
|
||||
### Option 3: Via Bash Script (Standalone)
|
||||
|
||||
```bash
|
||||
# Simple domain
|
||||
sudo ./test_certificate.sh example.com no
|
||||
|
||||
# With wildcard
|
||||
sudo ./test_certificate.sh example.com yes
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Method Comparison
|
||||
|
||||
| Method | Speed | Requirements | NPM Integration | Limits |
|
||||
|--------|-------|--------------|-----------------|--------|
|
||||
| **Let's Encrypt** | 2-5 min | Internet, DNS | ✅ Yes | ⚠️ 5/week |
|
||||
| **Test (Python)** | 1-2 sec | Python only | ✅ Yes | ✅ None |
|
||||
| **Test (Bash)** | 1-2 sec | OpenSSL only | ❌ Manual | ✅ None |
|
||||
|
||||
---
|
||||
|
||||
## Detailed Instructions
|
||||
|
||||
### 1. Configuration Setup
|
||||
|
||||
```bash
|
||||
# Create configuration
|
||||
sudo nano /etc/letsencrypt/regru_config.json
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"domain": "test.example.com",
|
||||
"wildcard": true,
|
||||
"cert_dir": "/etc/letsencrypt/live",
|
||||
"npm_enabled": true,
|
||||
"npm_host": "https://npm.example.com",
|
||||
"npm_email": "admin@example.com",
|
||||
"npm_password": "your_password"
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Create Test Certificate
|
||||
|
||||
```bash
|
||||
sudo make test-cert
|
||||
```
|
||||
|
||||
### 3. Verify Created Files
|
||||
|
||||
```bash
|
||||
ls -la /etc/letsencrypt/live/test.example.com/
|
||||
# Should contain:
|
||||
# - privkey.pem (private key)
|
||||
# - cert.pem (certificate)
|
||||
# - fullchain.pem (full chain)
|
||||
# - chain.pem (CA chain)
|
||||
```
|
||||
|
||||
### 4. View Certificate Information
|
||||
|
||||
```bash
|
||||
openssl x509 -in /etc/letsencrypt/live/test.example.com/cert.pem -text -noout
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Using in Nginx
|
||||
|
||||
### Direct Usage
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 443 ssl;
|
||||
server_name test.example.com;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/test.example.com/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/test.example.com/privkey.pem;
|
||||
|
||||
# ... rest of configuration
|
||||
}
|
||||
```
|
||||
|
||||
### Via Nginx Proxy Manager
|
||||
|
||||
If `npm_enabled: true` in configuration, certificate will automatically upload to NPM.
|
||||
|
||||
**Check in NPM:**
|
||||
1. Open NPM web interface
|
||||
2. Go to **SSL Certificates**
|
||||
3. Find your domain in the list
|
||||
4. ⚠️ Will be marked as "Custom" (not Let's Encrypt)
|
||||
|
||||
---
|
||||
|
||||
## Test Automation
|
||||
|
||||
### CI/CD Script
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# test_ssl_integration.sh
|
||||
|
||||
set -e
|
||||
|
||||
echo "🧪 Testing SSL integration..."
|
||||
|
||||
# 1. Create test certificate
|
||||
sudo python3 letsencrypt_regru_api.py \
|
||||
--config test_config.json \
|
||||
--test-cert
|
||||
|
||||
# 2. Verify files
|
||||
if [ ! -f "/etc/letsencrypt/live/test.example.com/fullchain.pem" ]; then
|
||||
echo "❌ Certificate not created"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 3. Check validity
|
||||
openssl x509 -in /etc/letsencrypt/live/test.example.com/cert.pem -noout -checkend 0
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "✅ Certificate is valid"
|
||||
else
|
||||
echo "❌ Certificate is invalid"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ All tests passed"
|
||||
```
|
||||
|
||||
### Makefile for Testing
|
||||
|
||||
```makefile
|
||||
.PHONY: test-ssl test-npm test-all
|
||||
|
||||
test-ssl:
|
||||
@echo "Creating test certificate..."
|
||||
sudo make test-cert
|
||||
@echo "Verifying files..."
|
||||
test -f /etc/letsencrypt/live/$(DOMAIN)/fullchain.pem
|
||||
@echo "✅ SSL test passed"
|
||||
|
||||
test-npm:
|
||||
@echo "Checking NPM integration..."
|
||||
# Your NPM API checks
|
||||
@echo "✅ NPM test passed"
|
||||
|
||||
test-all: test-ssl test-npm
|
||||
@echo "✅ All tests passed"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Transition to Production
|
||||
|
||||
### Step 1: Testing
|
||||
|
||||
```bash
|
||||
# 1. Create test certificate
|
||||
sudo make test-cert
|
||||
|
||||
# 2. Verify with NPM
|
||||
# Open https://your-domain and check
|
||||
|
||||
# 3. Ensure everything works
|
||||
```
|
||||
|
||||
### Step 2: Switch to Let's Encrypt
|
||||
|
||||
```bash
|
||||
# 1. Remove test certificate
|
||||
sudo rm -rf /etc/letsencrypt/live/your-domain/
|
||||
|
||||
# 2. Get real certificate
|
||||
sudo make obtain
|
||||
|
||||
# 3. Verify update in NPM
|
||||
sudo make status
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## FAQ
|
||||
|
||||
### Q: Why does browser show warning?
|
||||
|
||||
**A:** Self-signed certificates are not trusted by browsers. This is normal for testing.
|
||||
|
||||
To avoid browser warning (local testing only):
|
||||
1. Chrome: `chrome://flags/#allow-insecure-localhost`
|
||||
2. Firefox: Click "Advanced" → "Accept the Risk"
|
||||
|
||||
### Q: Can I use in production?
|
||||
|
||||
**A:** ❌ **NO!** Test certificates are for development and testing only.
|
||||
|
||||
### Q: How often can I create test certificates?
|
||||
|
||||
**A:** ✅ Unlimited! No limits whatsoever.
|
||||
|
||||
### Q: Do they upload to NPM automatically?
|
||||
|
||||
**A:** ✅ Yes, if `npm_enabled: true` in configuration.
|
||||
|
||||
### Q: Do they work with wildcard domains?
|
||||
|
||||
**A:** ✅ Yes! Just set `"wildcard": true` in configuration.
|
||||
|
||||
### Q: How to check expiration date?
|
||||
|
||||
```bash
|
||||
openssl x509 -in /etc/letsencrypt/live/your-domain/cert.pem -noout -dates
|
||||
```
|
||||
|
||||
### Q: How to change validity period?
|
||||
|
||||
Edit `validity_days` in `generate_self_signed_certificate()` function:
|
||||
|
||||
```python
|
||||
validity_days: int = 365 # Change to desired number of days
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Error: Permission denied
|
||||
|
||||
```bash
|
||||
# Run with sudo
|
||||
sudo make test-cert
|
||||
```
|
||||
|
||||
### Error: Module 'cryptography' not found
|
||||
|
||||
```bash
|
||||
# Install dependencies
|
||||
sudo pip3 install cryptography
|
||||
```
|
||||
|
||||
### NPM doesn't show certificate
|
||||
|
||||
1. Check NPM settings in configuration
|
||||
2. Check logs: `sudo make logs`
|
||||
3. Try uploading manually via NPM web interface
|
||||
|
||||
### Certificate not created
|
||||
|
||||
```bash
|
||||
# Check permissions
|
||||
ls -la /etc/letsencrypt/live/
|
||||
|
||||
# Create directory manually
|
||||
sudo mkdir -p /etc/letsencrypt/live/
|
||||
|
||||
# Check configuration
|
||||
sudo make check-config
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Docker Development
|
||||
|
||||
```dockerfile
|
||||
FROM nginx:alpine
|
||||
|
||||
# Copy test certificate
|
||||
COPY test-certs/ /etc/nginx/ssl/
|
||||
|
||||
# Nginx configuration
|
||||
COPY nginx.conf /etc/nginx/nginx.conf
|
||||
|
||||
EXPOSE 443
|
||||
```
|
||||
|
||||
### Local Testing
|
||||
|
||||
```bash
|
||||
# Create certificate for localhost
|
||||
sudo python3 letsencrypt_regru_api.py --test-cert
|
||||
|
||||
# Add to /etc/hosts
|
||||
echo "127.0.0.1 test.example.com" | sudo tee -a /etc/hosts
|
||||
|
||||
# Start nginx
|
||||
sudo nginx -t && sudo nginx -s reload
|
||||
|
||||
# Open in browser
|
||||
open https://test.example.com
|
||||
```
|
||||
|
||||
### Automated Testing Before Deployment
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# pre-deploy.sh
|
||||
|
||||
# Test SSL check
|
||||
sudo make test-cert
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "✅ Test certificate created successfully"
|
||||
echo "✅ Ready for production certificate"
|
||||
sudo make obtain
|
||||
else
|
||||
echo "❌ Error creating test certificate"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Additional Resources
|
||||
|
||||
- 📘 [Let's Encrypt Rate Limits](https://letsencrypt.org/docs/rate-limits/)
|
||||
- 📘 [OpenSSL Documentation](https://www.openssl.org/docs/)
|
||||
- 📘 [Nginx Proxy Manager Docs](https://nginxproxymanager.com/guide/)
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference
|
||||
|
||||
```bash
|
||||
# Installation
|
||||
sudo make install
|
||||
|
||||
# Configuration
|
||||
sudo nano /etc/letsencrypt/regru_config.json
|
||||
|
||||
# Create test certificate
|
||||
sudo make test-cert
|
||||
|
||||
# Verify
|
||||
sudo make check-config
|
||||
sudo make status
|
||||
|
||||
# Switch to production
|
||||
sudo rm -rf /etc/letsencrypt/live/domain/
|
||||
sudo make obtain
|
||||
|
||||
# Automatic renewal
|
||||
sudo make run
|
||||
```
|
||||
|
||||
**Done!** 🎉 Now you can test SSL certificates without limits!
|
||||
@@ -0,0 +1,206 @@
|
||||
# 🔧 Решение проблем с API reg.ru
|
||||
|
||||
## ❌ Проблема: "Access to API from this IP denied"
|
||||
|
||||
Эта ошибка возникает, когда API reg.ru заблокирован для вашего IP адреса из соображений безопасности.
|
||||
|
||||
### 🔍 Диагностика
|
||||
|
||||
Сначала определите ваш текущий IP адрес:
|
||||
|
||||
```bash
|
||||
# Способ 1: Через встроенную функцию скрипта
|
||||
sudo letsencrypt-regru --test-api
|
||||
|
||||
# Способ 2: Через curl
|
||||
curl -s https://ipinfo.io/ip
|
||||
|
||||
# Способ 3: Через веб-сайт
|
||||
# Откройте https://whatismyipaddress.com/
|
||||
```
|
||||
|
||||
### ✅ Решение
|
||||
|
||||
#### Метод 1: Добавить IP в белый список (рекомендуется)
|
||||
|
||||
1. **Войдите в личный кабинет reg.ru**
|
||||
- Откройте https://www.reg.ru/
|
||||
- Войдите в личный кабинет
|
||||
|
||||
2. **Перейдите в настройки API**
|
||||
- Меню → "Настройки"
|
||||
- Раздел "Безопасность"
|
||||
- Подраздел "API"
|
||||
|
||||
3. **Настройте доступ по IP**
|
||||
- Найдите раздел "Ограничения по IP"
|
||||
- Нажмите "Добавить IP адрес"
|
||||
- Введите ваш текущий IP адрес
|
||||
- Сохраните настройки
|
||||
|
||||
4. **Проверьте настройки**
|
||||
```bash
|
||||
sudo letsencrypt-regru --test-api
|
||||
```
|
||||
|
||||
#### Метод 2: Отключить ограничения по IP (менее безопасно)
|
||||
|
||||
⚠️ **ВНИМАНИЕ**: Это снижает безопасность вашего аккаунта!
|
||||
|
||||
1. В настройках API reg.ru найдите "Ограничения по IP"
|
||||
2. Отключите опцию "Разрешить доступ только с указанных IP"
|
||||
3. Сохраните настройки
|
||||
|
||||
### 🔒 Рекомендации по безопасности
|
||||
|
||||
1. **Используйте статический IP**
|
||||
- Если у вас динамический IP, рассмотрите покупку статического
|
||||
- Или регулярно обновляйте список разрешенных IP
|
||||
|
||||
2. **Ограничьте доступ к API**
|
||||
- Добавляйте только необходимые IP адреса
|
||||
- Регулярно проверяйте и очищайте список
|
||||
|
||||
3. **Используйте сильные пароли**
|
||||
- Сложный пароль для аккаунта reg.ru
|
||||
- Двухфакторная аутентификация если доступна
|
||||
|
||||
## ❌ Проблема: "Invalid username or password"
|
||||
|
||||
### ✅ Решение
|
||||
|
||||
1. **Проверьте учетные данные**
|
||||
```bash
|
||||
sudo nano /etc/letsencrypt-regru/config.json
|
||||
```
|
||||
|
||||
Убедитесь что указаны правильные:
|
||||
- `regru_username` - логин от reg.ru
|
||||
- `regru_password` - пароль от reg.ru
|
||||
|
||||
2. **Проверьте права на файл**
|
||||
```bash
|
||||
sudo chmod 600 /etc/letsencrypt-regru/config.json
|
||||
sudo chown root:root /etc/letsencrypt-regru/config.json
|
||||
```
|
||||
|
||||
3. **Протестируйте подключение**
|
||||
```bash
|
||||
sudo letsencrypt-regru --test-api
|
||||
```
|
||||
|
||||
## ❌ Проблема: "IP exceeded allowed connection rate"
|
||||
|
||||
### Причина
|
||||
API reg.ru ограничивает частоту запросов с одного IP (обычно 10-20 запросов в минуту).
|
||||
|
||||
### ✅ Решение
|
||||
|
||||
1. **Подождите 5-10 минут**
|
||||
```bash
|
||||
# Подождите перед следующей попыткой
|
||||
sleep 600 # 10 минут
|
||||
sudo letsencrypt-regru --obtain
|
||||
```
|
||||
|
||||
2. **Настройте автоматизацию правильно**
|
||||
```bash
|
||||
# Проверка сертификатов 1 раз в день
|
||||
sudo systemctl enable letsencrypt-regru.timer
|
||||
sudo systemctl start letsencrypt-regru.timer
|
||||
|
||||
# Проверить расписание
|
||||
sudo systemctl cat letsencrypt-regru.timer
|
||||
```
|
||||
|
||||
3. **Рекомендации по частоте запросов**
|
||||
- ✅ Автоматическая проверка: **1 раз в день**
|
||||
- ✅ Ручная проверка: **не чаще 1 раза в час**
|
||||
- ❌ Избегайте частых тестов `--test-api`
|
||||
- ❌ Не создавайте cron с частым запуском
|
||||
|
||||
4. **Используйте --check вместо --obtain**
|
||||
```bash
|
||||
# Проверка без создания сертификата
|
||||
sudo letsencrypt-regru --check
|
||||
```
|
||||
|
||||
## ❌ Проблема: Таймаут подключения
|
||||
|
||||
### ✅ Решение
|
||||
|
||||
1. **Проверьте интернет соединение**
|
||||
```bash
|
||||
ping -c 4 api.reg.ru
|
||||
curl -I https://api.reg.ru/api/regru2
|
||||
```
|
||||
|
||||
2. **Проверьте брандмауэр**
|
||||
```bash
|
||||
# Временно отключите firewall для теста
|
||||
sudo ufw status
|
||||
sudo iptables -L
|
||||
```
|
||||
|
||||
3. **Проверьте прокси настройки**
|
||||
- Убедитесь что переменные окружения `HTTP_PROXY`, `HTTPS_PROXY` не мешают
|
||||
|
||||
## 🧪 Тестирование API
|
||||
|
||||
Всегда тестируйте API перед использованием:
|
||||
|
||||
```bash
|
||||
# Полный тест API
|
||||
sudo letsencrypt-regru --test-api
|
||||
|
||||
# Тест с подробным выводом
|
||||
sudo letsencrypt-regru --test-api -v
|
||||
|
||||
# Проверка конфигурации
|
||||
sudo letsencrypt-regru --check
|
||||
```
|
||||
|
||||
## 📞 Получение помощи
|
||||
|
||||
### Техподдержка reg.ru
|
||||
|
||||
- **Email**: support@reg.ru
|
||||
- **Телефон**: 8 (495) 580-11-11
|
||||
- **Онлайн чат**: на сайте reg.ru
|
||||
|
||||
### Документация
|
||||
|
||||
- **API reg.ru**: https://www.reg.ru/support/api
|
||||
- **Примеры использования**: https://www.reg.ru/support/api/examples
|
||||
- **FAQ по API**: https://www.reg.ru/support/api/faq
|
||||
|
||||
### Логи для диагностики
|
||||
|
||||
Всегда включайте логи при обращении в поддержку:
|
||||
|
||||
```bash
|
||||
# Включить подробные логи
|
||||
sudo letsencrypt-regru --test-api -v
|
||||
|
||||
# Посмотреть последние логи
|
||||
sudo tail -n 50 /var/log/letsencrypt-regru/letsencrypt_regru.log
|
||||
|
||||
# Логи certbot
|
||||
sudo tail -n 50 /var/log/letsencrypt/letsencrypt.log
|
||||
```
|
||||
|
||||
## 🔄 Альтернативные DNS провайдеры
|
||||
|
||||
Если проблемы с reg.ru API критичны, рассмотрите альтернативы:
|
||||
|
||||
1. **Cloudflare** - отличный API, бесплатный DNS
|
||||
2. **Route53** (AWS) - мощный, но платный
|
||||
3. **DigitalOcean DNS** - простой и надежный
|
||||
4. **Google Cloud DNS** - интеграция с GCP
|
||||
|
||||
Для них потребуется модификация скрипта или использование других плагинов certbot.
|
||||
|
||||
---
|
||||
|
||||
**Дата обновления**: 29.10.2025
|
||||
**Версия документа**: 1.0
|
||||
@@ -0,0 +1,56 @@
|
||||
# Инструкция по созданию Let's Encrypt сертификата с DNS Challenge для провайдера reg.ru в Nginx Proxy Manager
|
||||
|
||||
---
|
||||
|
||||
## Предпосылки
|
||||
- Доступ к Nginx Proxy Manager (NPM)
|
||||
- Доступ к аккаунту reg.ru с правами управления DNS-записями
|
||||
- API-ключ для управления DNS в reg.ru (если есть автоматическая интеграция)
|
||||
- Нужно получить сертификат для `*.dfv24.com` (wildcard сертификат)
|
||||
|
||||
---
|
||||
|
||||
## Шаг 1. Получение API-ключа для reg.ru
|
||||
|
||||
1. Войдите в панель управления reg.ru
|
||||
2. Перейдите в раздел управления API (если поддерживается)
|
||||
3. Создайте или найдите API-ключ с правом редактирования DNS записей
|
||||
4. Сохраните API-ключ и секрет (Client ID и API Token)
|
||||
|
||||
---
|
||||
|
||||
## Шаг 2. Настройка Nginx Proxy Manager для использования DNS Challenge reg.ru
|
||||
|
||||
1. В админке NPM перейдите в **SSL Certificates → Add SSL Certificate**
|
||||
2. Выберите **Let's Encrypt** -> **DNS Challenge**
|
||||
3. В поле **Provider** выберите `reg_ru` или `custom` (если провайдера нет, потребуется писать скрипт)
|
||||
4. В поля API впишите необходимые параметры:
|
||||
- Client ID
|
||||
- API Token
|
||||
5. В поле **Domain Names** укажите:
|
||||
`*.dfv24.com` (для wildcard сертификата)
|
||||
и основной домен `dfv24.com`
|
||||
6. Включите остальные опции (Terms of Service, Email)
|
||||
7. Нажмите **Save** для запроса сертификата
|
||||
8. NPM автоматически добавит DNS TXT-записи для подтверждения владения доменом через API reg.ru
|
||||
|
||||
---
|
||||
|
||||
## Шаг 3. Проверка и автоматическое продление
|
||||
|
||||
- После успешного создания сертификата NPM будет автоматически обновлять его через DNS Challenge.
|
||||
- Для успешного продления важно, чтобы API-ключ был действующим, а NPM имел доступ к DNS управлению.
|
||||
|
||||
---
|
||||
|
||||
## Если в NPM нет готовой интеграции с reg.ru
|
||||
|
||||
- Используйте внешний скрипт для обновления TXT записей DNS в reg.ru, настраиваемый в NPM через **Custom DNS Provider**.
|
||||
- Нужна настройка curl-запросов к API reg.ru для добавления/удаления TXT записей.
|
||||
|
||||
---
|
||||
|
||||
# Итог
|
||||
|
||||
Для wildcard сертификатов Let's Encrypt у reg.ru необходимо использовать DNS Challenge, используя API провайдера для автоматического управления DNS записями.
|
||||
В Nginx Proxy Manager настройте DNS Challenge с учётом особенностей reg.ru для бесшовного получения и продления сертификатов.
|
||||
@@ -0,0 +1,455 @@
|
||||
# 🔨 Руководство по сборке исполняемых файлов
|
||||
|
||||
Данное руководство описывает процесс компиляции Python-скрипта `letsencrypt_regru_api.py` в исполняемые файлы для Linux и Windows с использованием PyInstaller.
|
||||
|
||||
## 📋 Содержание
|
||||
|
||||
- [Преимущества исполняемых файлов](#преимущества-исполняемых-файлов)
|
||||
- [Быстрый старт](#быстрый-старт)
|
||||
- [Подробные инструкции](#подробные-инструкции)
|
||||
- [Кросс-компиляция](#кросс-компиляция)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
|
||||
---
|
||||
|
||||
## ✅ Преимущества исполняемых файлов
|
||||
|
||||
### Плюсы:
|
||||
- ✅ **Один файл** - легко распространять и развертывать
|
||||
- ✅ **Автономность** - не требует установленного Python на целевой системе
|
||||
- ✅ **Все зависимости включены** - requests, cryptography и certbot модули упакованы
|
||||
- ✅ **Простота запуска** - просто скачать и запустить
|
||||
|
||||
### Минусы:
|
||||
- ❌ **Большой размер** - ~40-60 MB (включая Python runtime и библиотеки)
|
||||
- ❌ **Certbot зависимость** - системный certbot все равно требуется
|
||||
- ❌ **Медленный первый запуск** - распаковка занимает несколько секунд
|
||||
- ❌ **Требуется пересборка** - при изменении кода нужно пересобирать
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Быстрый старт
|
||||
|
||||
### Сборка для текущей ОС:
|
||||
```bash
|
||||
make build
|
||||
```
|
||||
|
||||
### Сборка для всех платформ:
|
||||
```bash
|
||||
make build-all
|
||||
```
|
||||
|
||||
### Полный релиз (сборка + пакеты):
|
||||
```bash
|
||||
make release
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📖 Подробные инструкции
|
||||
|
||||
### 1. Установка зависимостей
|
||||
|
||||
#### Вариант А: Автоматическая установка
|
||||
```bash
|
||||
make install-pyinstaller
|
||||
```
|
||||
|
||||
#### Вариант Б: Ручная установка
|
||||
```bash
|
||||
pip install pyinstaller
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### 2. Сборка для Linux
|
||||
|
||||
**На Linux системе:**
|
||||
```bash
|
||||
make build-linux
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
- Файл: `dist/letsencrypt-regru`
|
||||
- Размер: ~45-55 MB
|
||||
- Формат: ELF 64-bit executable
|
||||
|
||||
**Тестирование:**
|
||||
```bash
|
||||
./dist/letsencrypt-regru --help
|
||||
sudo ./dist/letsencrypt-regru --check -c /etc/letsencrypt-regru/config.json
|
||||
```
|
||||
|
||||
### 3. Сборка для Windows
|
||||
|
||||
**На Windows системе (PowerShell/CMD):**
|
||||
```bash
|
||||
make build-windows
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
- Файл: `dist/letsencrypt-regru.exe`
|
||||
- Размер: ~40-50 MB
|
||||
- Формат: PE32+ executable (Windows)
|
||||
|
||||
**Тестирование:**
|
||||
```powershell
|
||||
.\dist\letsencrypt-regru.exe --help
|
||||
```
|
||||
|
||||
### 4. Создание пакетов для распространения
|
||||
|
||||
#### Linux пакет (tar.gz):
|
||||
```bash
|
||||
make package-linux
|
||||
```
|
||||
|
||||
**Содержимое пакета:**
|
||||
- `letsencrypt-regru` - исполняемый файл
|
||||
- `README.md` - документация
|
||||
- `systemd/` - systemd unit файлы
|
||||
- `config.json.example` - пример конфигурации
|
||||
|
||||
**Результат:** `dist/letsencrypt-regru-linux-x86_64.tar.gz`
|
||||
|
||||
#### Windows пакет (zip):
|
||||
```bash
|
||||
make package-windows
|
||||
```
|
||||
|
||||
**Результат:** `dist/letsencrypt-regru-windows-x86_64.zip`
|
||||
|
||||
### 5. Полный цикл релиза
|
||||
|
||||
Создание релиза со всеми артефактами:
|
||||
|
||||
```bash
|
||||
make release
|
||||
```
|
||||
|
||||
**Что происходит:**
|
||||
1. Очистка старых артефактов (`clean-build`)
|
||||
2. Установка/обновление PyInstaller
|
||||
3. Сборка для Linux (`build-linux`)
|
||||
4. Сборка для Windows (`build-windows`)
|
||||
5. Создание пакета для Linux (`package-linux`)
|
||||
6. Создание пакета для Windows (`package-windows`)
|
||||
7. Генерация SHA256 контрольных сумм
|
||||
|
||||
**Результат в `dist/`:**
|
||||
```
|
||||
letsencrypt-regru # Linux executable
|
||||
letsencrypt-regru.exe # Windows executable
|
||||
letsencrypt-regru-linux-x86_64.tar.gz
|
||||
letsencrypt-regru-windows-x86_64.zip
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Кросс-компиляция
|
||||
|
||||
### ⚠️ Важные замечания
|
||||
|
||||
**Не рекомендуется:**
|
||||
- Собирать Linux версию на Windows
|
||||
- Собирать Windows версию на Linux
|
||||
- Собирать macOS версию на других ОС
|
||||
|
||||
**Причины:**
|
||||
- Несовместимость системных библиотек
|
||||
- Разные форматы исполняемых файлов
|
||||
- Проблемы с путями и разделителями
|
||||
|
||||
### Рекомендации
|
||||
|
||||
#### Для Linux сборки:
|
||||
1. Используйте Ubuntu 20.04+ или Debian 10+
|
||||
2. Установите build-essential
|
||||
3. Используйте виртуальное окружение Python
|
||||
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y python3 python3-pip build-essential
|
||||
make build-linux
|
||||
```
|
||||
|
||||
#### Для Windows сборки:
|
||||
1. Используйте Windows 10/11
|
||||
2. Установите Python 3.8+
|
||||
3. Используйте PowerShell или CMD
|
||||
|
||||
```powershell
|
||||
python -m pip install --upgrade pip
|
||||
make build-windows
|
||||
```
|
||||
|
||||
#### Для обеих платформ:
|
||||
Используйте CI/CD (GitHub Actions, GitLab CI):
|
||||
|
||||
```yaml
|
||||
# .github/workflows/build.yml
|
||||
name: Build Releases
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*'
|
||||
|
||||
jobs:
|
||||
build-linux:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Build Linux
|
||||
run: make build-linux
|
||||
|
||||
build-windows:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Build Windows
|
||||
run: make build-windows
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Все команды Makefile
|
||||
|
||||
### Основные команды:
|
||||
|
||||
| Команда | Описание |
|
||||
|---------|----------|
|
||||
| `make build` | Собрать для текущей ОС |
|
||||
| `make build-linux` | Собрать для Linux |
|
||||
| `make build-windows` | Собрать для Windows |
|
||||
| `make build-all` | Собрать для всех платформ |
|
||||
| `make package-linux` | Создать tar.gz пакет |
|
||||
| `make package-windows` | Создать zip пакет |
|
||||
| `make release` | Полный цикл релиза |
|
||||
|
||||
### Вспомогательные команды:
|
||||
|
||||
| Команда | Описание |
|
||||
|---------|----------|
|
||||
| `make install-pyinstaller` | Установить PyInstaller |
|
||||
| `make test-build` | Протестировать собранный файл |
|
||||
| `make clean-build` | Очистить артефакты сборки |
|
||||
| `make build-info` | Показать информацию о среде |
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
### Проблема: PyInstaller не найден
|
||||
|
||||
**Ошибка:**
|
||||
```
|
||||
make: pyinstaller: Command not found
|
||||
```
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
make install-pyinstaller
|
||||
# или
|
||||
pip install pyinstaller
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Проблема: Импорт модулей не работает
|
||||
|
||||
**Ошибка:**
|
||||
```
|
||||
ModuleNotFoundError: No module named 'requests'
|
||||
```
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
# или добавьте в PyInstaller команду:
|
||||
--hidden-import requests
|
||||
--hidden-import certbot
|
||||
--hidden-import cryptography
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Проблема: Большой размер файла
|
||||
|
||||
**Размер ~100+ MB вместо 40-60 MB**
|
||||
|
||||
**Причины:**
|
||||
- Включены лишние модули
|
||||
- Не используется `--onefile`
|
||||
- Включены debug символы
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Используйте флаги оптимизации:
|
||||
pyinstaller --onefile \
|
||||
--strip \
|
||||
--exclude-module tkinter \
|
||||
--exclude-module matplotlib \
|
||||
letsencrypt_regru_api.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Проблема: Certbot не работает в исполняемом файле
|
||||
|
||||
**Ошибка:**
|
||||
```
|
||||
certbot: command not found
|
||||
```
|
||||
|
||||
**Решение:**
|
||||
|
||||
Certbot вызывается через `subprocess` и должен быть установлен в системе:
|
||||
|
||||
**Linux:**
|
||||
```bash
|
||||
sudo apt-get install certbot
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
- Не поддерживается напрямую
|
||||
- Используйте WSL или Docker
|
||||
|
||||
---
|
||||
|
||||
### Проблема: Права доступа к файлам
|
||||
|
||||
**Ошибка:**
|
||||
```
|
||||
Permission denied: /etc/letsencrypt/
|
||||
```
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Linux/macOS
|
||||
sudo ./dist/letsencrypt-regru --check
|
||||
|
||||
# Или установите правильные права:
|
||||
sudo chmod +x ./dist/letsencrypt-regru
|
||||
sudo chown root:root ./dist/letsencrypt-regru
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Проблема: Медленный запуск
|
||||
|
||||
**Первый запуск занимает 5-10 секунд**
|
||||
|
||||
**Причина:**
|
||||
PyInstaller распаковывает файлы во временную директорию при каждом запуске.
|
||||
|
||||
**Решение:**
|
||||
- Это нормальное поведение для `--onefile`
|
||||
- Используйте `--onedir` для более быстрого запуска (но будет много файлов)
|
||||
- Кэшируйте временную директорию (автоматически)
|
||||
|
||||
---
|
||||
|
||||
### Проблема: Антивирус блокирует файл
|
||||
|
||||
**Windows Defender помечает .exe как вирус**
|
||||
|
||||
**Причины:**
|
||||
- Самораспаковывающийся архив похож на вредоносное ПО
|
||||
- Отсутствие цифровой подписи
|
||||
- Малоизвестный исполняемый файл
|
||||
|
||||
**Решение:**
|
||||
1. **Добавьте в исключения:**
|
||||
- Windows Defender → Settings → Exclusions
|
||||
|
||||
2. **Подпишите файл цифровой подписью:**
|
||||
```bash
|
||||
# Требуется сертификат Code Signing
|
||||
signtool sign /f cert.pfx /p password dist/letsencrypt-regru.exe
|
||||
```
|
||||
|
||||
3. **Проверьте на VirusTotal:**
|
||||
- Загрузите файл на virustotal.com
|
||||
- Добавьте результаты в README
|
||||
|
||||
---
|
||||
|
||||
## 📊 Сравнение: Python vs Исполняемый файл
|
||||
|
||||
| Характеристика | Python скрипт | Исполняемый файл |
|
||||
|----------------|---------------|------------------|
|
||||
| Размер | ~50 KB | ~40-60 MB |
|
||||
| Зависимости | Требует Python + pip | Автономный |
|
||||
| Скорость запуска | Быстро (~1 сек) | Медленно (~5-10 сек) |
|
||||
| Обновление | Просто заменить .py | Требуется пересборка |
|
||||
| Совместимость | Любая ОС с Python | Только для целевой ОС |
|
||||
| Установка | Требует venv setup | Скачать и запустить |
|
||||
| Certbot | Через subprocess | Через subprocess |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Рекомендации
|
||||
|
||||
### Используйте Python скрипт если:
|
||||
- ✅ Python уже установлен в системе
|
||||
- ✅ Нужны частые обновления кода
|
||||
- ✅ Используете виртуальное окружение
|
||||
- ✅ Работаете на серверах (production)
|
||||
|
||||
### Используйте исполняемый файл если:
|
||||
- ✅ Python не установлен
|
||||
- ✅ Нужна простота развертывания
|
||||
- ✅ Распространяете для конечных пользователей
|
||||
- ✅ Тестирование на чистых системах
|
||||
|
||||
---
|
||||
|
||||
## 📦 Пример использования собранного файла
|
||||
|
||||
### Linux:
|
||||
|
||||
```bash
|
||||
# Скачать и распаковать
|
||||
wget https://github.com/user/repo/releases/download/v1.0/letsencrypt-regru-linux-x86_64.tar.gz
|
||||
tar -xzf letsencrypt-regru-linux-x86_64.tar.gz
|
||||
|
||||
# Установить
|
||||
sudo mv letsencrypt-regru /usr/local/bin/
|
||||
sudo chmod +x /usr/local/bin/letsencrypt-regru
|
||||
|
||||
# Использовать
|
||||
sudo letsencrypt-regru --help
|
||||
sudo letsencrypt-regru --check -c /etc/letsencrypt-regru/config.json
|
||||
```
|
||||
|
||||
### Windows:
|
||||
|
||||
```powershell
|
||||
# Скачать и распаковать
|
||||
Invoke-WebRequest -Uri "https://github.com/user/repo/releases/download/v1.0/letsencrypt-regru-windows-x86_64.zip" -OutFile "letsencrypt-regru.zip"
|
||||
Expand-Archive -Path letsencrypt-regru.zip -DestinationPath "C:\Program Files\LetsEncrypt-RegRu"
|
||||
|
||||
# Использовать
|
||||
cd "C:\Program Files\LetsEncrypt-RegRu"
|
||||
.\letsencrypt-regru.exe --help
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Дополнительные ресурсы
|
||||
|
||||
- [PyInstaller Documentation](https://pyinstaller.org/en/stable/)
|
||||
- [PyInstaller FAQ](https://pyinstaller.org/en/stable/FAQ.html)
|
||||
- [Building Cross-Platform Applications](https://pyinstaller.org/en/stable/operating-mode.html)
|
||||
|
||||
---
|
||||
|
||||
## 📄 Лицензия
|
||||
|
||||
Этот проект использует лицензию согласно основному README.md.
|
||||
|
||||
---
|
||||
|
||||
**Автор:** Фофанов Дмитрий
|
||||
**Дата обновления:** 28.10.2025
|
||||
@@ -0,0 +1,153 @@
|
||||
# 📋 Журнал изменений (Changelog)
|
||||
|
||||
## [2.1.0] - 2025-10-27
|
||||
|
||||
### 🆕 Добавлено
|
||||
|
||||
#### Генерация тестовых SSL сертификатов
|
||||
- ✨ **Новый класс `TestCertificateGenerator`** - генерация самоподписанных сертификатов
|
||||
- ✨ **Команда `--test-cert`** в Python скрипте для создания тестовых сертификатов
|
||||
- ✨ **Скрипт `test_certificate.sh`** - автономное создание через OpenSSL
|
||||
- ✨ **Команда `make test-cert`** в Makefile для быстрого тестирования
|
||||
|
||||
#### Документация
|
||||
- 📘 **TESTING_GUIDE.md** (370+ строк) - полное руководство по тестированию
|
||||
- Обход лимитов Let's Encrypt (5 сертификатов в неделю)
|
||||
- Сравнение методов создания сертификатов
|
||||
- Примеры для CI/CD и Docker
|
||||
- Переход с тестовых на production
|
||||
- Частые вопросы и решения
|
||||
|
||||
- 📘 **PROJECT_STRUCTURE.md** - структура проекта
|
||||
- Описание всех файлов
|
||||
- Список возможностей
|
||||
- Технологии
|
||||
|
||||
- 📘 **CHEATSHEET.md** - быстрая шпаргалка
|
||||
- Основные команды
|
||||
- Сценарии использования
|
||||
- Частые ошибки и решения
|
||||
- Workflow разработки
|
||||
|
||||
#### Функциональность
|
||||
- ✨ Поддержка **неограниченного количества** тестовых сертификатов
|
||||
- ✨ **Мгновенное создание** (1-2 секунды) без DNS валидации
|
||||
- ✨ **Автоматическая загрузка** тестовых сертификатов в NPM
|
||||
- ✨ **Полная совместимость** структуры с Let's Encrypt
|
||||
- ✨ **Wildcard поддержка** для тестовых сертификатов
|
||||
|
||||
### 🔧 Улучшено
|
||||
|
||||
#### Python скрипт
|
||||
- Добавлен импорт библиотеки `cryptography` с проверкой установки
|
||||
- Новые параметры командной строки:
|
||||
- `--test-cert` - создание тестового сертификата
|
||||
- `--auto` - явное указание автоматического режима
|
||||
- Улучшенная обработка тестовых сертификатов в NPM
|
||||
- Детальное логирование процесса генерации
|
||||
|
||||
#### Makefile
|
||||
- Добавлена команда `make test-cert` с красивым выводом
|
||||
- Информационные сообщения о преимуществах тестовых сертификатов
|
||||
- Предупреждения о безопасности
|
||||
|
||||
#### README.md
|
||||
- Раздел "Создание тестового самоподписанного сертификата"
|
||||
- Обновленное содержание с ссылкой на тестовые сертификаты
|
||||
- Примеры использования тестовых сертификатов
|
||||
- Интеграция с NPM для тестовых сертификатов
|
||||
- Ссылки на дополнительную документацию
|
||||
|
||||
### 🎯 Преимущества
|
||||
|
||||
#### Для разработчиков
|
||||
- ✅ **Нет лимитов** - неограниченное количество сертификатов
|
||||
- ✅ **Быстро** - создание за 1-2 секунды
|
||||
- ✅ **Офлайн** - работает без интернета
|
||||
- ✅ **Идентичная структура** - те же файлы что и Let's Encrypt
|
||||
|
||||
#### Для тестирования
|
||||
- ✅ **CI/CD friendly** - быстрое создание в pipeline
|
||||
- ✅ **Docker ready** - легко встраивается в контейнеры
|
||||
- ✅ **Staging окружения** - идеально для тестовых серверов
|
||||
- ✅ **Локальная разработка** - HTTPS на localhost
|
||||
|
||||
### 📊 Статистика
|
||||
|
||||
- **Строк кода**: 1,411 (Python скрипт)
|
||||
- **Строк в Makefile**: 415
|
||||
- **Строк документации**: 2,200+
|
||||
- **Команд в Makefile**: 13
|
||||
- **Режимов работы**: 4 (obtain, renew, auto, test-cert)
|
||||
|
||||
---
|
||||
|
||||
## [2.0.0] - 2025-10-27
|
||||
|
||||
### 🆕 Добавлено
|
||||
- ✨ Интеграция с Nginx Proxy Manager (NPM)
|
||||
- ✨ Класс `NginxProxyManagerAPI` для управления сертификатами через API
|
||||
- ✨ Автоматическая загрузка сертификатов в NPM
|
||||
- ✨ Автоматическое обновление сертификатов в NPM
|
||||
- ✨ Автоматическая проверка срока действия
|
||||
- ✨ Настраиваемый порог обновления (`renewal_days`)
|
||||
- ✨ Makefile для автоматизации установки/удаления
|
||||
- ✨ Systemd service + timer
|
||||
- ✨ Cron автоматизация
|
||||
|
||||
### 🔧 Улучшено
|
||||
- Консолидация документации в единый README.md
|
||||
- Подробное логирование с статусами операций
|
||||
- Валидация конфигурации
|
||||
- Улучшенная обработка ошибок
|
||||
|
||||
### 📘 Документация
|
||||
- Полное руководство по NPM интеграции
|
||||
- Быстрый старт за 3 команды
|
||||
- Примеры автоматизации
|
||||
|
||||
---
|
||||
|
||||
## [1.0.0] - 2025-10-26
|
||||
|
||||
### 🆕 Первый релиз
|
||||
- Python скрипт для Let's Encrypt через reg.ru API
|
||||
- Bash скрипт с certbot-dns-regru
|
||||
- PowerShell версия для Windows
|
||||
- DNS-01 валидация
|
||||
- Wildcard сертификаты
|
||||
- Базовая документация
|
||||
|
||||
---
|
||||
|
||||
## Roadmap (Планы)
|
||||
|
||||
### [2.2.0] - Планируется
|
||||
- [ ] Веб-интерфейс для управления
|
||||
- [ ] Поддержка множественных доменов
|
||||
- [ ] Notifications (email, telegram)
|
||||
- [ ] Grafana dashboard для мониторинга
|
||||
- [ ] Backup сертификатов
|
||||
|
||||
### [3.0.0] - Будущее
|
||||
- [ ] Поддержка других DNS провайдеров
|
||||
- [ ] Cloudflare API
|
||||
- [ ] Route53 (AWS)
|
||||
- [ ] Google Cloud DNS
|
||||
|
||||
---
|
||||
|
||||
## Типы изменений
|
||||
- `🆕 Добавлено` - новый функционал
|
||||
- `🔧 Улучшено` - улучшения существующего функционала
|
||||
- `🐛 Исправлено` - исправление багов
|
||||
- `🗑️ Удалено` - удаленный функционал
|
||||
- `🔒 Безопасность` - изменения безопасности
|
||||
- `📘 Документация` - изменения в документации
|
||||
|
||||
---
|
||||
|
||||
**Версионирование**: Semantic Versioning (MAJOR.MINOR.PATCH)
|
||||
- **MAJOR**: Несовместимые изменения API
|
||||
- **MINOR**: Новый функционал с обратной совместимостью
|
||||
- **PATCH**: Исправления багов
|
||||
@@ -0,0 +1,287 @@
|
||||
# ⚡ Шпаргалка по SSL сертификатам
|
||||
|
||||
## 🚀 Быстрый старт
|
||||
|
||||
### Установка за 3 команды
|
||||
```bash
|
||||
sudo make install
|
||||
sudo nano /etc/letsencrypt/regru_config.json # Заполнить данные
|
||||
sudo make test-cert # Тест
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Тестирование (БЕЗ лимитов Let's Encrypt)
|
||||
|
||||
```bash
|
||||
# Создать тестовый сертификат (неограниченно)
|
||||
sudo make test-cert
|
||||
|
||||
# Проверить статус
|
||||
sudo make status
|
||||
|
||||
# Просмотреть логи
|
||||
sudo make logs
|
||||
```
|
||||
|
||||
**Когда использовать:**
|
||||
- ⚠️ Let's Encrypt: макс. 5 сертификатов/неделю
|
||||
- ✅ Тестовые: НЕОГРАНИЧЕННО
|
||||
- ⚡ Создание: 1-2 секунды vs 2-5 минут
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Production (Let's Encrypt)
|
||||
|
||||
```bash
|
||||
# Получить настоящий сертификат
|
||||
sudo make obtain
|
||||
|
||||
# Автоматический режим (проверка + обновление)
|
||||
sudo make run
|
||||
|
||||
# Принудительное обновление
|
||||
sudo make renew
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 Основные команды
|
||||
|
||||
### Команды letsencrypt-regru
|
||||
|
||||
| Команда | Описание | Лимиты | Использование |
|
||||
|---------|----------|--------|---------------|
|
||||
| `--check` | Проверить срок действия | - | Мониторинг |
|
||||
| `--obtain` | Получить новый сертификат | ⚠️ 5/неделю | Первое создание |
|
||||
| `--renew` | Обновить существующий | ⚠️ 5/неделю | Продление |
|
||||
| `--auto` | Авто-проверка и обновление | ⚠️ 5/неделю | Cron/systemd |
|
||||
| `--test-cert` | Тестовый сертификат | ✅ Нет | Разработка |
|
||||
| `--test-api` | Проверить API reg.ru | - | Диагностика |
|
||||
| `--test-dns` | Тест создания DNS записи | - | Проверка перед SSL |
|
||||
| `--help` | Справка | - | Помощь |
|
||||
| `-v` | Подробный вывод | - | Отладка |
|
||||
|
||||
### Команды Makefile
|
||||
|
||||
| Команда | Описание | Эквивалент |
|
||||
|---------|----------|------------|
|
||||
| `make test-cert` | Тестовый сертификат | `letsencrypt-regru --test-cert` |
|
||||
| `make obtain` | Let's Encrypt новый | `letsencrypt-regru --obtain` |
|
||||
| `make renew` | Обновить существующий | `letsencrypt-regru --renew` |
|
||||
| `make run` | Авто-режим | `letsencrypt-regru --auto` |
|
||||
| `make status` | Статус системы | - |
|
||||
| `make logs` | Показать логи | `journalctl -u letsencrypt-regru` |
|
||||
| `make check-config` | Проверить конфигурацию | - |
|
||||
|
||||
### Команды letsencrypt_regru.sh
|
||||
|
||||
| Команда | Описание |
|
||||
|---------|----------|
|
||||
| `sudo bash letsencrypt_regru.sh install` | Установить приложение |
|
||||
| `sudo bash letsencrypt_regru.sh update` | Обновить приложение |
|
||||
| `sudo bash letsencrypt_regru.sh uninstall` | Удалить приложение |
|
||||
|
||||
---
|
||||
|
||||
## 📝 Конфигурация
|
||||
|
||||
### Минимальная (тестирование)
|
||||
```json
|
||||
{
|
||||
"domain": "test.example.com",
|
||||
"wildcard": true,
|
||||
"cert_dir": "/etc/letsencrypt/live"
|
||||
}
|
||||
```
|
||||
|
||||
### Полная (production + NPM)
|
||||
```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"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Workflow
|
||||
|
||||
### Разработка → Production
|
||||
|
||||
```bash
|
||||
# 1. Разработка (тестовые сертификаты)
|
||||
sudo make test-cert # Создать тестовый
|
||||
# Тестировать приложение...
|
||||
|
||||
# 2. Production (Let's Encrypt)
|
||||
sudo rm -rf /etc/letsencrypt/live/example.com/ # Удалить тест
|
||||
sudo make obtain # Создать production
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 Важные пути
|
||||
|
||||
```bash
|
||||
# Конфигурация
|
||||
/etc/letsencrypt/regru_config.json
|
||||
|
||||
# Сертификаты
|
||||
/etc/letsencrypt/live/example.com/
|
||||
├── privkey.pem # Приватный ключ
|
||||
├── cert.pem # Сертификат
|
||||
├── fullchain.pem # Полная цепочка (для nginx)
|
||||
└── chain.pem # CA цепочка
|
||||
|
||||
# Скрипты
|
||||
/opt/letsencrypt-regru/letsencrypt_regru_api.py
|
||||
|
||||
# Логи
|
||||
/var/log/letsencrypt_regru.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Проверка
|
||||
|
||||
```bash
|
||||
# Проверить конфигурацию
|
||||
sudo make check-config
|
||||
|
||||
# Проверить сертификат
|
||||
openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -text -noout
|
||||
|
||||
# Проверить срок действия
|
||||
openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -noout -dates
|
||||
|
||||
# Проверить systemd
|
||||
sudo systemctl status letsencrypt-regru.timer
|
||||
sudo systemctl list-timers letsencrypt-regru.timer
|
||||
|
||||
# Проверить cron
|
||||
sudo crontab -l | grep letsencrypt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Отладка
|
||||
|
||||
```bash
|
||||
# Подробные логи
|
||||
sudo make logs
|
||||
|
||||
# Тестовый запуск с подробностями
|
||||
sudo python3 /opt/letsencrypt-regru/letsencrypt_regru_api.py \
|
||||
-c /etc/letsencrypt/regru_config.json --check -v
|
||||
|
||||
# Логи certbot
|
||||
sudo tail -f /var/log/letsencrypt/letsencrypt.log
|
||||
|
||||
# Логи systemd
|
||||
sudo journalctl -u letsencrypt-regru.service -f
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ Частые ошибки
|
||||
|
||||
### Let's Encrypt: Rate limit exceeded
|
||||
```bash
|
||||
# РЕШЕНИЕ: Используйте тестовые сертификаты
|
||||
sudo make test-cert
|
||||
```
|
||||
|
||||
### NPM: Certificate not found
|
||||
```bash
|
||||
# РЕШЕНИЕ: Проверьте настройки NPM
|
||||
sudo make check-config
|
||||
|
||||
# Проверьте подключение
|
||||
curl -k https://npm.example.com
|
||||
```
|
||||
|
||||
### Permission denied
|
||||
```bash
|
||||
# РЕШЕНИЕ: Запускайте с sudo
|
||||
sudo make test-cert
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Сценарии использования
|
||||
|
||||
### Локальная разработка
|
||||
```bash
|
||||
sudo make test-cert
|
||||
# Открыть https://localhost (игнорировать предупреждение)
|
||||
```
|
||||
|
||||
### CI/CD тестирование
|
||||
```bash
|
||||
# В pipeline
|
||||
sudo make test-cert
|
||||
# Запустить тесты...
|
||||
sudo make status
|
||||
```
|
||||
|
||||
### Staging окружение
|
||||
```bash
|
||||
sudo make test-cert # Или
|
||||
sudo make obtain # Если есть домен
|
||||
```
|
||||
|
||||
### Production окружение
|
||||
```bash
|
||||
sudo make install
|
||||
sudo make obtain
|
||||
# Автоматическое обновление через cron/systemd
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 Документация
|
||||
|
||||
- **README.md** - Полное руководство (1420+ строк)
|
||||
- **TESTING_GUIDE.md** - Тестирование (370+ строк)
|
||||
- **PROJECT_STRUCTURE.md** - Структура проекта
|
||||
- **CHEATSHEET.md** - Эта шпаргалка
|
||||
|
||||
---
|
||||
|
||||
## 🆘 Быстрая помощь
|
||||
|
||||
```bash
|
||||
# Показать все команды
|
||||
make help
|
||||
|
||||
# Проверить установку
|
||||
sudo make status
|
||||
|
||||
# Полная переустановка
|
||||
sudo make uninstall
|
||||
sudo make install
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💡 Советы
|
||||
|
||||
1. **Всегда начинайте с тестовых сертификатов** - избегайте лимитов
|
||||
2. **Проверяйте конфигурацию** - `make check-config`
|
||||
3. **Мониторьте логи** - `make logs`
|
||||
4. **Автоматизируйте** - systemd/cron уже настроены
|
||||
5. **Храните бэкапы** конфигурации
|
||||
|
||||
---
|
||||
|
||||
**Версия**: 2.1
|
||||
**Обновлено**: 27.10.2025
|
||||
@@ -0,0 +1,133 @@
|
||||
# 🔒 SSL Certificate Manager для Let's Encrypt + reg.ru
|
||||
|
||||
**Автоматическое управление SSL сертификатами Let's Encrypt с DNS-валидацией через API reg.ru и интеграцией с Nginx Proxy Manager**
|
||||
|
||||
## 📖 Описание
|
||||
|
||||
Комплексное решение для автоматизации создания, обновления и управления SSL сертификатами Let's Encrypt для доменов, зарегистрированных на reg.ru. Поддерживает DNS-01 валидацию, wildcard сертификаты, автоматическую загрузку в Nginx Proxy Manager и генерацию тестовых сертификатов для разработки.
|
||||
|
||||
### ✨ Основные возможности
|
||||
|
||||
- 🔐 **Автоматическое получение SSL сертификатов** через Let's Encrypt
|
||||
- 🌐 **DNS-01 валидация** через API reg.ru (поддержка wildcard доменов)
|
||||
- 🔄 **Автоматическое обновление** сертификатов с настраиваемым порогом
|
||||
- 📦 **Интеграция с Nginx Proxy Manager** - автоматическая загрузка и обновление
|
||||
- 🧪 **Тестовые сертификаты** - обход лимитов Let's Encrypt (5 в неделю)
|
||||
- ⚙️ **Полная автоматизация** через systemd/cron
|
||||
- 🔀 **Синхронизация репозиториев** - автоматическая синхронизация Gitea → GitHub
|
||||
|
||||
### 🚀 Быстрый старт
|
||||
|
||||
```bash
|
||||
# Установка через Makefile
|
||||
sudo make install
|
||||
|
||||
# Настройка конфигурации
|
||||
sudo nano /etc/letsencrypt/regru_config.json
|
||||
|
||||
# Создание тестового сертификата (без лимитов)
|
||||
sudo make test-cert
|
||||
|
||||
# Получение production сертификата
|
||||
sudo make obtain
|
||||
```
|
||||
|
||||
### 📋 Требования
|
||||
|
||||
- **ОС**: Linux (Ubuntu/Debian/CentOS)
|
||||
- **Python**: 3.6+
|
||||
- **Зависимости**: certbot, requests, cryptography
|
||||
- **API**: reg.ru (доступ к DNS управлению)
|
||||
- **Опционально**: Nginx Proxy Manager
|
||||
|
||||
### 🎯 Сценарии использования
|
||||
|
||||
- ✅ Автоматизация SSL сертификатов для web-серверов
|
||||
- ✅ Централизованное управление через Nginx Proxy Manager
|
||||
- ✅ Тестирование и разработка с самоподписанными сертификатами
|
||||
- ✅ CI/CD интеграция
|
||||
- ✅ Мультидоменные конфигурации с wildcard
|
||||
|
||||
### 📚 Документация
|
||||
|
||||
- [README.md](README.md) - Полное руководство (1400+ строк)
|
||||
- [TESTING_GUIDE.md](TESTING_GUIDE.md) - Руководство по тестированию
|
||||
- [GITEA_SYNC.md](GITEA_SYNC.md) - Синхронизация Gitea → GitHub
|
||||
- [CHEATSHEET.md](CHEATSHEET.md) - Быстрая шпаргалка
|
||||
|
||||
---
|
||||
|
||||
## 📖 Description (English)
|
||||
|
||||
**Automated Let's Encrypt SSL Certificate Manager with DNS validation via reg.ru API and Nginx Proxy Manager integration**
|
||||
|
||||
Comprehensive solution for automating the creation, renewal, and management of Let's Encrypt SSL certificates for domains registered with reg.ru. Supports DNS-01 validation, wildcard certificates, automatic upload to Nginx Proxy Manager, and test certificate generation for development.
|
||||
|
||||
### ✨ Key Features
|
||||
|
||||
- 🔐 **Automatic SSL certificate** issuance via Let's Encrypt
|
||||
- 🌐 **DNS-01 validation** via reg.ru API (wildcard domain support)
|
||||
- 🔄 **Automatic renewal** with configurable threshold
|
||||
- 📦 **Nginx Proxy Manager integration** - automatic upload and update
|
||||
- 🧪 **Test certificates** - bypass Let's Encrypt rate limits (5 per week)
|
||||
- ⚙️ **Full automation** via systemd/cron
|
||||
- 🔀 **Repository sync** - automatic Gitea → GitHub synchronization
|
||||
|
||||
### 🚀 Quick Start
|
||||
|
||||
```bash
|
||||
# Install via Makefile
|
||||
sudo make install
|
||||
|
||||
# Configure
|
||||
sudo nano /etc/letsencrypt/regru_config.json
|
||||
|
||||
# Create test certificate (no limits)
|
||||
sudo make test-cert
|
||||
|
||||
# Get production certificate
|
||||
sudo make obtain
|
||||
```
|
||||
|
||||
### 📋 Requirements
|
||||
|
||||
- **OS**: Linux (Ubuntu/Debian/CentOS)
|
||||
- **Python**: 3.6+
|
||||
- **Dependencies**: certbot, requests, cryptography
|
||||
- **API**: reg.ru (DNS management access)
|
||||
- **Optional**: Nginx Proxy Manager
|
||||
|
||||
### 🎯 Use Cases
|
||||
|
||||
- ✅ SSL certificate automation for web servers
|
||||
- ✅ Centralized management via Nginx Proxy Manager
|
||||
- ✅ Development and testing with self-signed certificates
|
||||
- ✅ CI/CD integration
|
||||
- ✅ Multi-domain configurations with wildcards
|
||||
|
||||
### 📚 Documentation
|
||||
|
||||
- [README.md](README.md) - Complete guide (1400+ lines)
|
||||
- [TESTING_GUIDE.md](TESTING_GUIDE.md) - Testing guide
|
||||
- [GITEA_SYNC.md](GITEA_SYNC.md) - Gitea → GitHub sync
|
||||
- [CHEATSHEET.md](CHEATSHEET.md) - Quick reference
|
||||
|
||||
---
|
||||
|
||||
## 👤 Автор / Author
|
||||
|
||||
**Фофанов Дмитрий** @ 2025
|
||||
|
||||
## 📄 Лицензия / License
|
||||
|
||||
Open Source - Free to use
|
||||
|
||||
## 🤝 Вклад / Contributing
|
||||
|
||||
Pull requests приветствуются / Pull requests are welcome!
|
||||
|
||||
## 🔗 Ссылки / Links
|
||||
|
||||
- **Документация reg.ru API**: https://www.reg.ru/support/api
|
||||
- **Let's Encrypt**: https://letsencrypt.org/
|
||||
- **Nginx Proxy Manager**: https://nginxproxymanager.com/
|
||||
@@ -0,0 +1,111 @@
|
||||
# 📚 Documentation Index / Индекс документации
|
||||
|
||||
## 🇷🇺 Русская документация / Russian Documentation
|
||||
|
||||
### Основные руководства / Main Guides
|
||||
- **[README.md](README.md)** - Полное руководство (1,420+ строк)
|
||||
- **[TESTING_GUIDE.md](TESTING_GUIDE.md)** - Руководство по тестированию
|
||||
- **[GITEA_SYNC.md](GITEA_SYNC.md)** - Синхронизация Gitea → GitHub
|
||||
- **[PROJECT_STRUCTURE.md](PROJECT_STRUCTURE.md)** - Структура проекта
|
||||
|
||||
### Справочная информация / Reference
|
||||
- **[CHEATSHEET.md](CHEATSHEET.md)** - Быстрая шпаргалка
|
||||
- **[CHANGELOG.md](CHANGELOG.md)** - История изменений
|
||||
- **[DESCRIPTION.md](DESCRIPTION.md)** - Описание проекта
|
||||
|
||||
### Git Hooks
|
||||
- **[gitea-hooks/README.md](gitea-hooks/README.md)** - Установка Git hooks
|
||||
|
||||
---
|
||||
|
||||
## 🇬🇧 English Documentation / Английская документация
|
||||
|
||||
### Main Guides / Основные руководства
|
||||
- **[README_EN.md](README_EN.md)** - Complete Guide (Coming Soon)
|
||||
- **[TESTING_GUIDE_EN.md](TESTING_GUIDE_EN.md)** - Testing Guide ✅
|
||||
- **[GITEA_SYNC_EN.md](GITEA_SYNC_EN.md)** - Gitea → GitHub Sync ✅
|
||||
- **[PROJECT_STRUCTURE_EN.md](PROJECT_STRUCTURE_EN.md)** - Project Structure ✅
|
||||
|
||||
### Reference / Справочная информация
|
||||
- **[CHEATSHEET_EN.md](CHEATSHEET_EN.md)** - Quick Reference ✅
|
||||
- **[CHANGELOG_EN.md](CHANGELOG_EN.md)** - Change History ✅
|
||||
- **[DESCRIPTION.md](DESCRIPTION.md)** - Project Description (Bilingual) ✅
|
||||
|
||||
### Git Hooks
|
||||
- **[gitea-hooks/README_EN.md](gitea-hooks/README_EN.md)** - Git Hooks Installation ✅
|
||||
|
||||
---
|
||||
|
||||
## 📖 Quick Links / Быстрые ссылки
|
||||
|
||||
### For Users / Для пользователей
|
||||
| Topic | Russian | English |
|
||||
|-------|---------|---------|
|
||||
| Getting Started | [README.md](README.md) | [README_EN.md](README_EN.md) |
|
||||
| Testing Certificates | [TESTING_GUIDE.md](TESTING_GUIDE.md) | [TESTING_GUIDE_EN.md](TESTING_GUIDE_EN.md) |
|
||||
| Quick Commands | [CHEATSHEET.md](CHEATSHEET.md) | [CHEATSHEET_EN.md](CHEATSHEET_EN.md) |
|
||||
|
||||
### For Developers / Для разработчиков
|
||||
| Topic | Russian | English |
|
||||
|-------|---------|---------|
|
||||
| Project Structure | [PROJECT_STRUCTURE.md](PROJECT_STRUCTURE.md) | [PROJECT_STRUCTURE_EN.md](PROJECT_STRUCTURE_EN.md) |
|
||||
| Repository Sync | [GITEA_SYNC.md](GITEA_SYNC.md) | [GITEA_SYNC_EN.md](GITEA_SYNC_EN.md) |
|
||||
| Changelog | [CHANGELOG.md](CHANGELOG.md) | [CHANGELOG_EN.md](CHANGELOG_EN.md) |
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Quick Start / Быстрый старт
|
||||
|
||||
### Installation / Установка
|
||||
```bash
|
||||
sudo make install
|
||||
sudo nano /etc/letsencrypt/regru_config.json
|
||||
sudo make test-cert
|
||||
```
|
||||
|
||||
### Documentation Priority / Приоритет документации
|
||||
1. Start here / Начните здесь: **README.md** / **README_EN.md**
|
||||
2. Testing / Тестирование: **TESTING_GUIDE.md** / **TESTING_GUIDE_EN.md**
|
||||
3. Quick ref / Шпаргалка: **CHEATSHEET.md** / **CHEATSHEET_EN.md**
|
||||
|
||||
---
|
||||
|
||||
## 📊 Documentation Status / Статус документации
|
||||
|
||||
| File | Russian | English | Lines | Status |
|
||||
|------|---------|---------|-------|--------|
|
||||
| Main Guide | ✅ | 🔄 | 1,420+ | RU Complete |
|
||||
| Testing Guide | ✅ | ✅ | 370+ | Both Complete |
|
||||
| Cheatsheet | ✅ | ✅ | 200+ | Both Complete |
|
||||
| Project Structure | ✅ | ✅ | 200+ | Both Complete |
|
||||
| Gitea Sync | ✅ | ✅ | 400+ | Both Complete |
|
||||
| Changelog | ✅ | ✅ | 150+ | Both Complete |
|
||||
| Git Hooks | ✅ | ✅ | 100+ | Both Complete |
|
||||
|
||||
**Legend:**
|
||||
- ✅ Complete / Готово
|
||||
- 🔄 In Progress / В разработке
|
||||
- ❌ Not Started / Не начато
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Choose Your Language / Выберите язык
|
||||
|
||||
### Prefer Russian? / Предпочитаете русский?
|
||||
👉 Начните с [README.md](README.md)
|
||||
|
||||
### Prefer English? / Предпочитаете английский?
|
||||
👉 Start with [README_EN.md](README_EN.md) or [DESCRIPTION.md](DESCRIPTION.md)
|
||||
|
||||
---
|
||||
|
||||
## 💡 Contributing / Вклад
|
||||
|
||||
Help us translate / Помогите с переводом:
|
||||
- [ ] Complete README_EN.md / Завершить README_EN.md
|
||||
- [ ] Translate docs/ folder / Перевести папку docs/
|
||||
|
||||
---
|
||||
|
||||
**Last Updated / Обновлено**: October 27, 2025
|
||||
**Maintained by / Поддерживает**: Фофанов Дмитрий
|
||||
@@ -0,0 +1,425 @@
|
||||
# 🔄 Синхронизация Gitea → GitHub
|
||||
|
||||
Автоматическая синхронизация репозитория из Gitea в GitHub после каждого push.
|
||||
|
||||
---
|
||||
|
||||
## 📋 Доступные методы
|
||||
|
||||
| Метод | Сложность | Скорость | Надежность | Рекомендация |
|
||||
|-------|-----------|----------|------------|--------------|
|
||||
| **1. Git Hooks** | ⭐⭐ | ⚡ Мгновенно | ✅ Высокая | Рекомендуется |
|
||||
| **2. GitHub Actions** | ⭐⭐⭐ | ⏱️ 1-5 мин | ✅ Высокая | Для сложных сценариев |
|
||||
| **3. Gitea Mirror** | ⭐ | ⏱️ По расписанию | ⭐⭐ Средняя | Самый простой |
|
||||
| **4. Двойной Remote** | ⭐ | ⚡ Мгновенно | ⭐⭐ Средняя | Локальная работа |
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Метод 1: Git Hooks (Рекомендуется)
|
||||
|
||||
### Установка
|
||||
|
||||
**1. На сервере Gitea найдите путь к репозиторию:**
|
||||
```bash
|
||||
# Обычно это:
|
||||
/var/lib/gitea/data/gitea-repositories/username/configure_nginx_manager.git
|
||||
# Или
|
||||
/home/git/gitea-repositories/username/configure_nginx_manager.git
|
||||
```
|
||||
|
||||
**2. Создайте post-receive hook:**
|
||||
```bash
|
||||
cd /path/to/gitea/repos/username/configure_nginx_manager.git/hooks/
|
||||
nano post-receive
|
||||
```
|
||||
|
||||
**3. Вставьте содержимое** из файла `gitea-hooks/post-receive` (в этом репозитории)
|
||||
|
||||
**4. Настройте параметры:**
|
||||
```bash
|
||||
# В файле post-receive измените:
|
||||
GITHUB_REPO="git@github.com:YOUR_USERNAME/configure_nginx_manager.git"
|
||||
# Или для HTTPS с токеном:
|
||||
GITHUB_REPO="https://YOUR_TOKEN@github.com/YOUR_USERNAME/configure_nginx_manager.git"
|
||||
```
|
||||
|
||||
**5. Сделайте скрипт исполняемым:**
|
||||
```bash
|
||||
chmod +x post-receive
|
||||
```
|
||||
|
||||
**6. Создайте директорию для логов:**
|
||||
```bash
|
||||
mkdir -p /var/log/gitea
|
||||
chown git:git /var/log/gitea
|
||||
```
|
||||
|
||||
### Настройка SSH ключей (для git@github.com)
|
||||
|
||||
**На сервере Gitea:**
|
||||
|
||||
**Шаг 1: Определите пользователя Gitea**
|
||||
```bash
|
||||
# Проверьте под каким пользователем запущен Gitea
|
||||
ps aux | grep gitea | grep -v grep
|
||||
|
||||
# Обычно это один из:
|
||||
# - git (стандартная установка)
|
||||
# - gitea (установка через Docker/LXC)
|
||||
```
|
||||
|
||||
**Шаг 2: Переключитесь на этого пользователя**
|
||||
```bash
|
||||
# Попробуйте git:
|
||||
sudo su - git
|
||||
|
||||
# Если не работает, попробуйте gitea:
|
||||
sudo su - gitea
|
||||
|
||||
# Проверьте текущего пользователя
|
||||
whoami # Должно быть: git или gitea
|
||||
```
|
||||
|
||||
**Шаг 3: Создайте SSH ключ**
|
||||
```bash
|
||||
# Создайте SSH ключ (если его ещё нет)
|
||||
ssh-keygen -t ed25519 -C "gitea-to-github-sync" -f ~/.ssh/id_ed25519 -N ""
|
||||
|
||||
# Скопируйте публичный ключ
|
||||
cat ~/.ssh/id_ed25519.pub
|
||||
```
|
||||
|
||||
**На GitHub:**
|
||||
1. Settings → SSH and GPG keys
|
||||
2. New SSH key
|
||||
3. Вставьте публичный ключ
|
||||
4. Save
|
||||
|
||||
**⚠️ ВАЖНО: Добавьте GitHub в known_hosts:**
|
||||
```bash
|
||||
# От того же пользователя (git или gitea)
|
||||
ssh-keyscan -H github.com >> ~/.ssh/known_hosts
|
||||
|
||||
# Проверьте что ключ добавлен
|
||||
cat ~/.ssh/known_hosts | grep github.com
|
||||
```
|
||||
|
||||
**Проверка подключения:**
|
||||
```bash
|
||||
ssh -T git@github.com
|
||||
# Должно вывести: Hi username! You've successfully authenticated...
|
||||
```
|
||||
|
||||
### Настройка токена (для HTTPS)
|
||||
|
||||
**На GitHub:**
|
||||
1. Settings → Developer settings → Personal access tokens → Tokens (classic)
|
||||
2. Generate new token
|
||||
3. Выберите scope: `repo` (полный доступ к репозиториям)
|
||||
4. Скопируйте токен
|
||||
|
||||
**В hook файле:**
|
||||
```bash
|
||||
GITHUB_REPO="https://ghp_YOUR_TOKEN_HERE@github.com/username/configure_nginx_manager.git"
|
||||
```
|
||||
|
||||
### Тестирование
|
||||
|
||||
```bash
|
||||
# Сделайте тестовый commit в Gitea
|
||||
cd /tmp
|
||||
git clone http://gitea.example.com/username/configure_nginx_manager.git
|
||||
cd configure_nginx_manager
|
||||
echo "test" >> README.md
|
||||
git add README.md
|
||||
git commit -m "Test sync to GitHub"
|
||||
git push
|
||||
|
||||
# Проверьте лог
|
||||
tail -f /var/log/gitea/github-sync.log
|
||||
|
||||
# Проверьте GitHub - изменения должны появиться
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Метод 2: GitHub Actions
|
||||
|
||||
### Установка
|
||||
|
||||
**1. Создайте workflow в GitHub репозитории:**
|
||||
|
||||
Файл уже создан: `.github/workflows/sync-from-gitea.yml`
|
||||
|
||||
**2. Настройте секреты в GitHub:**
|
||||
|
||||
GitHub Repository → Settings → Secrets and variables → Actions → New repository secret
|
||||
|
||||
Добавьте:
|
||||
- **Name**: `GITEA_URL`
|
||||
- **Value**: `https://gitea.example.com/username/configure_nginx_manager.git`
|
||||
|
||||
- **Name**: `GITEA_TOKEN`
|
||||
- **Value**: Токен доступа Gitea
|
||||
|
||||
### Получение токена Gitea
|
||||
|
||||
**В Gitea:**
|
||||
1. Settings → Applications → Generate New Token
|
||||
2. Token Name: "GitHub Sync"
|
||||
3. Select permissions: `read:repository`
|
||||
4. Generate Token
|
||||
5. Скопируйте токен
|
||||
|
||||
### Запуск синхронизации
|
||||
|
||||
**Автоматически (по расписанию):**
|
||||
- Каждый час проверяет изменения
|
||||
|
||||
**Вручную:**
|
||||
1. GitHub → Actions
|
||||
2. Выберите workflow "Sync from Gitea"
|
||||
3. Run workflow
|
||||
|
||||
**Через webhook от Gitea:**
|
||||
|
||||
В Gitea репозитории:
|
||||
1. Settings → Webhooks → Add Webhook → Gitea
|
||||
2. Target URL: `https://api.github.com/repos/USERNAME/configure_nginx_manager/dispatches`
|
||||
3. HTTP Method: `POST`
|
||||
4. POST Content Type: `application/json`
|
||||
5. Secret: оставьте пустым или используйте
|
||||
6. Trigger On: `Push events`
|
||||
7. Body:
|
||||
```json
|
||||
{
|
||||
"event_type": "gitea-push"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🪞 Метод 3: Gitea Mirror (Встроенная функция)
|
||||
|
||||
### Настройка
|
||||
|
||||
**В Gitea репозитории:**
|
||||
1. Settings → Repository
|
||||
2. Прокрутите до "Mirror Settings"
|
||||
3. Нажмите "Add Push Mirror"
|
||||
4. Заполните:
|
||||
- **Git Remote Repository URL**: `https://github.com/username/configure_nginx_manager.git`
|
||||
- **Username**: ваш GitHub username
|
||||
- **Password**: GitHub Personal Access Token
|
||||
- **Sync Interval**: `8h` (каждые 8 часов) или `0` (только вручную)
|
||||
5. Save
|
||||
|
||||
### Ручная синхронизация
|
||||
|
||||
Settings → Repository → Mirror Settings → Sync Now
|
||||
|
||||
### Преимущества
|
||||
- ✅ Встроенная функция
|
||||
- ✅ Не требует скриптов
|
||||
- ✅ Управление через веб-интерфейс
|
||||
|
||||
### Недостатки
|
||||
- ⚠️ Работает по расписанию (не мгновенно)
|
||||
- ⚠️ Доступно не во всех версиях Gitea
|
||||
|
||||
---
|
||||
|
||||
## 🔀 Метод 4: Двойной Remote
|
||||
|
||||
### Для локальной работы
|
||||
|
||||
**Настройка:**
|
||||
```bash
|
||||
# В вашем локальном репозитории
|
||||
cd configure_nginx_manager
|
||||
|
||||
# Добавьте GitHub как второй remote
|
||||
git remote add github git@github.com:username/configure_nginx_manager.git
|
||||
|
||||
# Или настройте push в оба репозитория одновременно
|
||||
git remote set-url --add --push origin git@github.com:username/configure_nginx_manager.git
|
||||
|
||||
# Проверьте
|
||||
git remote -v
|
||||
```
|
||||
|
||||
**Использование:**
|
||||
```bash
|
||||
# Обычный push (только в Gitea)
|
||||
git push origin main
|
||||
|
||||
# Push в GitHub
|
||||
git push github main
|
||||
|
||||
# Push в оба репозитория
|
||||
git push origin main
|
||||
git push github main
|
||||
|
||||
# Или создайте alias
|
||||
git config alias.pushall '!git push origin main && git push github main'
|
||||
git pushall
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Проверка синхронизации
|
||||
|
||||
### Проверка через Git
|
||||
|
||||
```bash
|
||||
# Сравнить коммиты
|
||||
git ls-remote git@gitea.example.com:username/configure_nginx_manager.git
|
||||
git ls-remote git@github.com:username/configure_nginx_manager.git
|
||||
|
||||
# Должны быть одинаковые SHA
|
||||
```
|
||||
|
||||
### Проверка логов (Метод 1 - Hooks)
|
||||
|
||||
```bash
|
||||
# На сервере Gitea
|
||||
tail -f /var/log/gitea/github-sync.log
|
||||
```
|
||||
|
||||
### Проверка GitHub Actions (Метод 2)
|
||||
|
||||
1. GitHub Repository → Actions
|
||||
2. Смотрите последние запуски
|
||||
3. Проверьте логи выполнения
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Рекомендованная конфигурация
|
||||
|
||||
Для максимальной надежности используйте **комбинацию методов**:
|
||||
|
||||
1. **Git Hook** (основной) - мгновенная синхронизация
|
||||
2. **GitHub Actions** (резервный) - проверка каждый час на случай сбоя hook
|
||||
|
||||
### Установка обоих методов
|
||||
|
||||
```bash
|
||||
# 1. Установите Git Hook на сервере Gitea
|
||||
# (см. Метод 1)
|
||||
|
||||
# 2. Настройте GitHub Actions
|
||||
# (см. Метод 2)
|
||||
|
||||
# 3. GitHub Actions будет подхватывать пропущенные изменения
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Устранение проблем
|
||||
|
||||
### Проблема: Hook не срабатывает
|
||||
|
||||
**Проверка:**
|
||||
```bash
|
||||
# На сервере Gitea
|
||||
ls -la /path/to/repo.git/hooks/post-receive
|
||||
# Должно быть -rwxr-xr-x
|
||||
|
||||
# Проверьте права
|
||||
chmod +x /path/to/repo.git/hooks/post-receive
|
||||
chown git:git /path/to/repo.git/hooks/post-receive
|
||||
|
||||
# Проверьте лог ошибок Gitea
|
||||
tail -f /var/log/gitea/gitea.log
|
||||
```
|
||||
|
||||
### Проблема: Permission denied (SSH)
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Убедитесь что SSH ключ добавлен в GitHub
|
||||
ssh -T git@github.com
|
||||
|
||||
# Проверьте права на .ssh
|
||||
chmod 700 ~/.ssh
|
||||
chmod 600 ~/.ssh/id_ed25519
|
||||
```
|
||||
|
||||
### Проблема: Authentication failed (HTTPS)
|
||||
|
||||
**Решение:**
|
||||
- Проверьте токен GitHub (должен иметь scope `repo`)
|
||||
- Токен не истёк
|
||||
- Правильный формат URL: `https://TOKEN@github.com/user/repo.git`
|
||||
|
||||
### Проблема: GitHub Actions не запускается
|
||||
|
||||
**Решение:**
|
||||
1. Проверьте секреты в Settings → Secrets
|
||||
2. Проверьте формат webhook от Gitea
|
||||
3. Запустите вручную для теста
|
||||
|
||||
---
|
||||
|
||||
## 📊 Сравнение методов
|
||||
|
||||
### Скорость синхронизации
|
||||
- **Git Hooks**: ⚡ < 1 секунды
|
||||
- **GitHub Actions (webhook)**: ⏱️ 10-30 секунд
|
||||
- **GitHub Actions (schedule)**: ⏱️ до 1 часа
|
||||
- **Gitea Mirror**: ⏱️ по расписанию
|
||||
|
||||
### Надежность
|
||||
- **Git Hooks**: ⭐⭐⭐⭐⭐ (при правильной настройке)
|
||||
- **GitHub Actions**: ⭐⭐⭐⭐⭐ (очень надежно)
|
||||
- **Gitea Mirror**: ⭐⭐⭐ (зависит от версии Gitea)
|
||||
- **Двойной Remote**: ⭐⭐ (требует ручного действия)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Итоговая рекомендация
|
||||
|
||||
Для проекта `configure_nginx_manager`:
|
||||
|
||||
**1. Основной метод: Git Hook**
|
||||
- Быстро
|
||||
- Надежно
|
||||
- Автоматически
|
||||
|
||||
**2. Резервный метод: GitHub Actions**
|
||||
- Проверка каждый час
|
||||
- Подхватит пропущенные изменения
|
||||
- Можно запустить вручную
|
||||
|
||||
**3. Мониторинг:**
|
||||
```bash
|
||||
# Еженедельная проверка
|
||||
git ls-remote origin | head -1
|
||||
git ls-remote github | head -1
|
||||
# SHA должны совпадать
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Быстрая установка
|
||||
|
||||
```bash
|
||||
# На сервере Gitea
|
||||
sudo su - git
|
||||
cd /path/to/gitea-repositories/username/configure_nginx_manager.git/hooks/
|
||||
|
||||
# Скачайте hook
|
||||
wget https://raw.githubusercontent.com/username/configure_nginx_manager/main/gitea-hooks/post-receive
|
||||
|
||||
# Настройте
|
||||
nano post-receive
|
||||
# Измените GITHUB_REPO
|
||||
|
||||
# Права
|
||||
chmod +x post-receive
|
||||
|
||||
# Тест
|
||||
echo "test" | ./post-receive
|
||||
```
|
||||
|
||||
Готово! 🎉
|
||||
@@ -0,0 +1,415 @@
|
||||
# Руководство по использованию 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 свободного места на диске
|
||||
- Интернет соединение
|
||||
|
||||
## Быстрая установка
|
||||
|
||||
**Способ 1: Автоматическая установка (рекомендуется)**
|
||||
|
||||
Самый быстрый способ - запустить установку напрямую с GitHub:
|
||||
|
||||
```bash
|
||||
sudo bash -c "$(curl -fsSL https://github.com/DFofanov/configure_nginx_manager/raw/refs/heads/master/letsencrypt_regru.sh)"
|
||||
```
|
||||
|
||||
Эта команда:
|
||||
- Автоматически скачает установочный скрипт
|
||||
- Запустит его с правами root
|
||||
- Проведет через интерактивную настройку
|
||||
|
||||
**Способ 2: Через клонирование репозитория**
|
||||
|
||||
Если вы хотите изучить код перед установкой:
|
||||
|
||||
```bash
|
||||
# 1. Скачайте репозиторий
|
||||
git clone https://github.com/DFofanov/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://10.10.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
|
||||
```
|
||||
|
||||
### 🧪 Команды диагностики и тестирования
|
||||
|
||||
```bash
|
||||
# Проверить доступ к API reg.ru
|
||||
# - Показывает текущий IP
|
||||
# - Тестирует подключение к API
|
||||
# - Отображает баланс аккаунта
|
||||
letsencrypt-regru --test-api
|
||||
|
||||
# Тестовое создание DNS записи TXT
|
||||
# - Полная симуляция процесса SSL сертификации
|
||||
# - Создает временную TXT запись _acme-challenge
|
||||
# - Ожидает распространения DNS (60 секунд)
|
||||
# - Проверяет через публичные DNS серверы
|
||||
# - Автоматически удаляет тестовую запись
|
||||
letsencrypt-regru --test-dns
|
||||
|
||||
# Показать справку по всем командам
|
||||
letsencrypt-regru --help
|
||||
|
||||
# Включить подробный вывод (verbose mode)
|
||||
letsencrypt-regru --obtain -v
|
||||
letsencrypt-regru --check -v
|
||||
```
|
||||
|
||||
### ⚙️ Служебные команды (внутреннее использование)
|
||||
|
||||
```bash
|
||||
# Certbot authentication hook (используется certbot автоматически)
|
||||
letsencrypt-regru --auth-hook
|
||||
|
||||
# Certbot cleanup hook (используется certbot автоматически)
|
||||
letsencrypt-regru --cleanup-hook
|
||||
```
|
||||
|
||||
### 📋 Описание команд
|
||||
|
||||
| Команда | Описание | Использование |
|
||||
|---------|----------|---------------|
|
||||
| `--check` | Проверяет срок действия сертификата | Регулярная проверка |
|
||||
| `--obtain` | Получает новый сертификат от Let's Encrypt | Первое создание |
|
||||
| `--renew` | Обновляет существующий сертификат | Продление срока |
|
||||
| `--auto` | Автоматическая проверка и обновление | Для cron/systemd |
|
||||
| `--test-cert` | Создает тестовый самоподписанный сертификат | Разработка/тестирование |
|
||||
| `--test-api` | Проверяет доступ к API reg.ru | Диагностика подключения |
|
||||
| `--test-dns` | Тестирует создание DNS записи | Проверка перед SSL |
|
||||
| `--auth-hook` | Hook для certbot (создание DNS) | Внутреннее |
|
||||
| `--cleanup-hook` | Hook для certbot (удаление DNS) | Внутреннее |
|
||||
| `--help` | Показывает справку | Помощь |
|
||||
| `-v` | Подробный вывод | Отладка |
|
||||
|
||||
## Автоматическое обновление
|
||||
|
||||
Установщик настраивает 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://10.10.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
|
||||
@@ -0,0 +1,154 @@
|
||||
# Makefile Commands - Quick Reference
|
||||
|
||||
## 📋 Категории команд
|
||||
|
||||
### 🛠️ Установка и развертывание
|
||||
|
||||
```bash
|
||||
make install # Полная установка приложения
|
||||
make uninstall # Удаление приложения
|
||||
make status # Проверка статуса установки
|
||||
make check-config # Проверка конфигурации
|
||||
```
|
||||
|
||||
### 🔨 Сборка исполняемых файлов
|
||||
|
||||
```bash
|
||||
make build # Собрать для текущей ОС
|
||||
make build-linux # Собрать для Linux
|
||||
make build-windows # Собрать для Windows
|
||||
make build-all # Собрать для всех платформ
|
||||
```
|
||||
|
||||
### 📦 Создание пакетов
|
||||
|
||||
```bash
|
||||
make package-linux # Создать tar.gz для Linux
|
||||
make package-windows # Создать zip для Windows
|
||||
make release # Полный цикл релиза
|
||||
```
|
||||
|
||||
### 🧪 Тестирование
|
||||
|
||||
```bash
|
||||
make test-run # Тестовый запуск скрипта
|
||||
make test-cert # Создать тестовый сертификат
|
||||
make test-build # Протестировать собранный файл
|
||||
```
|
||||
|
||||
### 🚀 Запуск операций
|
||||
|
||||
```bash
|
||||
make run # Автоматическая проверка и обновление
|
||||
make obtain # Получить новый сертификат
|
||||
make renew # Обновить существующий сертификат
|
||||
```
|
||||
|
||||
### 📊 Мониторинг
|
||||
|
||||
```bash
|
||||
make logs # Показать логи
|
||||
make status # Статус служб
|
||||
```
|
||||
|
||||
### 🧹 Очистка
|
||||
|
||||
```bash
|
||||
make clean # Очистить временные файлы Python
|
||||
make clean-build # Очистить артефакты сборки
|
||||
```
|
||||
|
||||
### ℹ️ Информация
|
||||
|
||||
```bash
|
||||
make help # Показать справку
|
||||
make build-info # Информация о среде сборки
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Типовые сценарии
|
||||
|
||||
### Первоначальная установка
|
||||
```bash
|
||||
sudo make install
|
||||
sudo make check-config
|
||||
sudo make test-run
|
||||
```
|
||||
|
||||
### Сборка релиза для GitHub
|
||||
```bash
|
||||
make clean-build
|
||||
make release
|
||||
# Файлы будут в dist/
|
||||
```
|
||||
|
||||
### Создание тестового окружения
|
||||
```bash
|
||||
sudo make install
|
||||
sudo make test-cert
|
||||
sudo make status
|
||||
```
|
||||
|
||||
### Обновление сертификата вручную
|
||||
```bash
|
||||
sudo make run
|
||||
sudo make logs
|
||||
```
|
||||
|
||||
### Удаление приложения
|
||||
```bash
|
||||
sudo make uninstall
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Переменные окружения
|
||||
|
||||
Основные переменные определены в Makefile:
|
||||
|
||||
```makefile
|
||||
INSTALL_DIR = /opt/letsencrypt-regru
|
||||
CONFIG_FILE = /etc/letsencrypt/regru_config.json
|
||||
LOG_FILE = /var/log/letsencrypt_regru.log
|
||||
SERVICE_NAME = letsencrypt-regru
|
||||
PYTHON = python3
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔐 Требуемые права
|
||||
|
||||
**Требуют sudo:**
|
||||
- `make install`
|
||||
- `make uninstall`
|
||||
- `make run`
|
||||
- `make obtain`
|
||||
- `make renew`
|
||||
- `make test-run`
|
||||
- `make test-cert`
|
||||
|
||||
**Не требуют sudo:**
|
||||
- `make build*`
|
||||
- `make package*`
|
||||
- `make clean*`
|
||||
- `make help`
|
||||
- `make build-info`
|
||||
|
||||
---
|
||||
|
||||
## 💡 Полезные комбинации
|
||||
|
||||
```bash
|
||||
# Полная переустановка
|
||||
sudo make uninstall && sudo make install
|
||||
|
||||
# Сборка и тестирование
|
||||
make build && make test-build
|
||||
|
||||
# Очистка и релиз
|
||||
make clean-build && make release
|
||||
|
||||
# Проверка после установки
|
||||
sudo make status && sudo make test-run && sudo make logs
|
||||
```
|
||||
@@ -0,0 +1,258 @@
|
||||
# 📁 Структура проекта configure_nginx_manager
|
||||
|
||||
## Основные скрипты
|
||||
|
||||
### Python (Рекомендуется)
|
||||
- **letsencrypt_regru_api.py** (1,411 строк)
|
||||
- Полнофункциональный Python скрипт
|
||||
- Прямая работа с API reg.ru
|
||||
- Интеграция с Nginx Proxy Manager
|
||||
- Автоматическая проверка и обновление сертификатов
|
||||
- Генерация тестовых самоподписанных сертификатов
|
||||
- Поддержка wildcard доменов
|
||||
|
||||
### Bash
|
||||
- **letsencrypt_regru_dns.sh**
|
||||
- Bash скрипт с certbot-dns-regru плагином
|
||||
- Простота использования
|
||||
- Минимальные зависимости
|
||||
|
||||
### PowerShell
|
||||
- **letsencrypt_regru.ps1**
|
||||
- Windows версия
|
||||
- Аналогична Bash скрипту
|
||||
|
||||
### Тестирование
|
||||
- **test_certificate.sh**
|
||||
- Быстрое создание тестовых сертификатов через OpenSSL
|
||||
- Автономная работа без Python
|
||||
- Поддержка wildcard доменов
|
||||
|
||||
## Автоматизация
|
||||
|
||||
### Makefile
|
||||
- **Makefile** (415 строк)
|
||||
- `make install` - Полная установка и настройка
|
||||
- `make uninstall` - Чистое удаление
|
||||
- `make status` - Проверка состояния
|
||||
- `make test-cert` - Создание тестового сертификата
|
||||
- `make obtain` - Получение Let's Encrypt сертификата
|
||||
- `make renew` - Обновление сертификата
|
||||
- `make logs` - Просмотр логов
|
||||
- `make check-config` - Валидация конфигурации
|
||||
|
||||
## Конфигурация
|
||||
|
||||
### config.json.example
|
||||
Пример конфигурации со всеми параметрами:
|
||||
- Учетные данные reg.ru API
|
||||
- Настройки домена и email
|
||||
- Параметры обновления (renewal_days)
|
||||
- Настройки Nginx Proxy Manager
|
||||
- Пути к директориям и логам
|
||||
|
||||
## Документация
|
||||
|
||||
### README.md (1,420+ строк)
|
||||
Основная документация:
|
||||
- Введение и возможности
|
||||
- Быстрый старт
|
||||
- Установка через Makefile
|
||||
- Создание тестовых сертификатов
|
||||
- Требования и установка зависимостей
|
||||
- Настройка и использование
|
||||
- Интеграция с NPM
|
||||
- Автоматическая проверка и обновление
|
||||
- Автоматизация через cron/systemd
|
||||
- Устранение неполадок
|
||||
|
||||
### TESTING_GUIDE.md (370+ строк)
|
||||
Руководство по тестированию:
|
||||
- Зачем нужны тестовые сертификаты
|
||||
- Обход лимитов Let's Encrypt (5 в неделю)
|
||||
- Быстрый старт с тестовыми сертификатами
|
||||
- Сравнение методов создания
|
||||
- Использование в разработке
|
||||
- Автоматизация тестирования
|
||||
- Переход с тестовых на production
|
||||
- Частые вопросы
|
||||
- Примеры для CI/CD и Docker
|
||||
|
||||
### GITEA_SYNC.md
|
||||
Синхронизация Gitea → GitHub:
|
||||
- 4 метода синхронизации (Git Hooks, GitHub Actions, Gitea Mirror, Double Remote)
|
||||
- Пошаговые инструкции установки
|
||||
- Настройка SSH и токенов
|
||||
- Webhook интеграция
|
||||
- Устранение проблем
|
||||
- Сравнение методов
|
||||
|
||||
### CHEATSHEET.md
|
||||
Быстрая шпаргалка:
|
||||
- Основные команды
|
||||
- Workflow разработки
|
||||
- Сценарии использования
|
||||
- Частые ошибки и решения
|
||||
- Проверка и отладка
|
||||
|
||||
### PROJECT_STRUCTURE.md (этот файл)
|
||||
- Описание всех файлов проекта
|
||||
- Краткая характеристика каждого компонента
|
||||
|
||||
### CHANGELOG.md
|
||||
История изменений:
|
||||
- Версии и обновления
|
||||
- Новые возможности
|
||||
- Исправления
|
||||
- Roadmap
|
||||
|
||||
## Интеграция с Git
|
||||
|
||||
### .github/workflows/sync-from-gitea.yml
|
||||
GitHub Actions для синхронизации:
|
||||
- Автоматическая проверка каждый час
|
||||
- Webhook триггер от Gitea
|
||||
- Ручной запуск
|
||||
- Merge изменений из Gitea
|
||||
- Push в GitHub
|
||||
|
||||
### gitea-hooks/
|
||||
Git hooks для Gitea сервера:
|
||||
|
||||
**post-receive**
|
||||
- Автоматический push в GitHub после commit
|
||||
- Мгновенная синхронизация (< 1 секунды)
|
||||
- Логирование операций
|
||||
- Синхронизация тегов
|
||||
- Поддержка SSH и HTTPS
|
||||
|
||||
**README.md**
|
||||
- Инструкции по установке hook
|
||||
- Настройка аутентификации
|
||||
- Устранение проблем
|
||||
|
||||
## Вспомогательные файлы
|
||||
|
||||
### Markdown документы
|
||||
- **Add Let's Encrypt Certificate для провайдера reg.ru.md**
|
||||
- Первоначальные инструкции
|
||||
|
||||
- **Создание и продление SSL сертификата.md**
|
||||
- Дополнительная информация о процессе
|
||||
|
||||
## Возможности
|
||||
|
||||
### ✅ Основные
|
||||
- [x] Создание Let's Encrypt сертификатов через reg.ru DNS API
|
||||
- [x] Wildcard сертификаты (*.domain.com)
|
||||
- [x] Автоматическое обновление сертификатов
|
||||
- [x] DNS-01 валидация
|
||||
- [x] Интеграция с Nginx Proxy Manager
|
||||
- [x] Автоматическая загрузка/обновление в NPM
|
||||
|
||||
### ✅ Продвинутые
|
||||
- [x] Автоматическая проверка срока действия
|
||||
- [x] Настраиваемый порог обновления (renewal_days)
|
||||
- [x] Systemd service + timer
|
||||
- [x] Cron автоматизация
|
||||
- [x] Подробное логирование
|
||||
- [x] Валидация конфигурации
|
||||
|
||||
### 🆕 Тестирование
|
||||
- [x] Генерация самоподписанных тестовых сертификатов
|
||||
- [x] Обход лимитов Let's Encrypt (5/неделю)
|
||||
- [x] Мгновенное создание без DNS
|
||||
- [x] Интеграция тестовых сертификатов с NPM
|
||||
- [x] Полная совместимость структуры с Let's Encrypt
|
||||
|
||||
### 🔄 Синхронизация репозиториев
|
||||
- [x] Автоматическая синхронизация Gitea → GitHub
|
||||
- [x] Git Hooks (мгновенная синхронизация)
|
||||
- [x] GitHub Actions (проверка каждый час)
|
||||
- [x] Webhook интеграция
|
||||
- [x] SSH и HTTPS аутентификация
|
||||
|
||||
## Установка
|
||||
|
||||
### Быстрая установка
|
||||
```bash
|
||||
sudo make install
|
||||
sudo nano /etc/letsencrypt/regru_config.json
|
||||
sudo make test-cert # Для тестирования
|
||||
sudo make obtain # Для production
|
||||
```
|
||||
|
||||
### Структура после установки
|
||||
```
|
||||
/opt/letsencrypt-regru/
|
||||
├── letsencrypt_regru_api.py
|
||||
|
||||
/etc/letsencrypt/
|
||||
├── regru_config.json
|
||||
└── live/
|
||||
└── example.com/
|
||||
├── privkey.pem
|
||||
├── cert.pem
|
||||
├── fullchain.pem
|
||||
└── chain.pem
|
||||
|
||||
/etc/systemd/system/
|
||||
├── letsencrypt-regru.service
|
||||
└── letsencrypt-regru.timer
|
||||
|
||||
/var/log/letsencrypt/
|
||||
└── letsencrypt_regru.log
|
||||
```
|
||||
|
||||
## Использование
|
||||
|
||||
### Тестирование (без лимитов)
|
||||
```bash
|
||||
sudo make test-cert # Создать тестовый сертификат
|
||||
sudo make status # Проверить статус
|
||||
```
|
||||
|
||||
### Production
|
||||
```bash
|
||||
sudo make obtain # Получить Let's Encrypt сертификат
|
||||
sudo make renew # Обновить сертификат
|
||||
sudo make run # Автоматический режим
|
||||
```
|
||||
|
||||
### Мониторинг
|
||||
```bash
|
||||
sudo make logs # Просмотр логов
|
||||
sudo make status # Статус служб
|
||||
sudo make check-config # Проверка конфигурации
|
||||
```
|
||||
|
||||
## Технологии
|
||||
|
||||
- **Python 3.6+** - Основной язык
|
||||
- **Certbot** - Let's Encrypt клиент
|
||||
- **requests** - HTTP запросы к API
|
||||
- **cryptography** - Генерация тестовых сертификатов
|
||||
- **systemd** - Автоматизация запуска
|
||||
- **cron** - Альтернативная автоматизация
|
||||
- **Make** - Управление установкой
|
||||
- **OpenSSL** - Альтернативная генерация сертификатов
|
||||
|
||||
## Лицензия
|
||||
|
||||
Open Source - свободное использование
|
||||
|
||||
## Автор
|
||||
|
||||
Фофанов Дмитрий @ 2025
|
||||
|
||||
## Поддержка
|
||||
|
||||
См. документацию:
|
||||
- [README.md](README.md) - Основное руководство
|
||||
- [TESTING_GUIDE.md](TESTING_GUIDE.md) - Руководство по тестированию
|
||||
|
||||
---
|
||||
|
||||
**Версия**: 2.1
|
||||
**Дата**: 27 октября 2025
|
||||
**Статус**: ✅ Production Ready
|
||||
@@ -0,0 +1,111 @@
|
||||
# 🎯 Быстрый старт - Сборка исполняемых файлов
|
||||
|
||||
Это краткое руководство для тех, кто хочет быстро собрать исполняемый файл.
|
||||
|
||||
## Для Linux
|
||||
|
||||
### 1. Установите зависимости
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y python3 python3-pip git make
|
||||
```
|
||||
|
||||
### 2. Клонируйте репозиторий
|
||||
```bash
|
||||
git clone https://github.com/DFofanov/configure_nginx_manager.git
|
||||
cd configure_nginx_manager
|
||||
```
|
||||
|
||||
### 3. Соберите
|
||||
```bash
|
||||
make build-linux
|
||||
```
|
||||
|
||||
### 4. Результат
|
||||
```bash
|
||||
ls -lh dist/letsencrypt-regru
|
||||
# Исполняемый файл готов!
|
||||
```
|
||||
|
||||
### 5. Установите (опционально)
|
||||
```bash
|
||||
sudo cp dist/letsencrypt-regru /usr/local/bin/
|
||||
sudo chmod +x /usr/local/bin/letsencrypt-regru
|
||||
```
|
||||
|
||||
### 6. Используйте
|
||||
```bash
|
||||
letsencrypt-regru --help
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Для Windows
|
||||
|
||||
### 1. Установите Python
|
||||
Скачайте с [python.org](https://www.python.org/downloads/) и установите
|
||||
|
||||
### 2. Клонируйте репозиторий
|
||||
```powershell
|
||||
git clone https://github.com/DFofanov/configure_nginx_manager.git
|
||||
cd configure_nginx_manager
|
||||
```
|
||||
|
||||
### 3. Соберите
|
||||
```powershell
|
||||
make build-windows
|
||||
```
|
||||
|
||||
### 4. Результат
|
||||
```powershell
|
||||
dir dist\letsencrypt-regru.exe
|
||||
# Исполняемый файл готов!
|
||||
```
|
||||
|
||||
### 5. Используйте
|
||||
```powershell
|
||||
.\dist\letsencrypt-regru.exe --help
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Создание релиза для обеих платформ
|
||||
|
||||
```bash
|
||||
# Это создаст пакеты для Linux и Windows
|
||||
make release
|
||||
```
|
||||
|
||||
**Результат в `dist/`:**
|
||||
- `letsencrypt-regru-linux-x86_64.tar.gz`
|
||||
- `letsencrypt-regru-windows-x86_64.zip`
|
||||
|
||||
---
|
||||
|
||||
## Полезные команды
|
||||
|
||||
```bash
|
||||
# Показать справку по всем командам
|
||||
make help
|
||||
|
||||
# Информация о среде сборки
|
||||
make build-info
|
||||
|
||||
# Протестировать собранный файл
|
||||
make test-build
|
||||
|
||||
# Очистить артефакты
|
||||
make clean-build
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ❓ Проблемы?
|
||||
|
||||
См. [BUILD_GUIDE.md](BUILD_GUIDE.md) для подробных инструкций и решения проблем.
|
||||
|
||||
---
|
||||
|
||||
**Размер файла:** ~40-60 MB (включая Python runtime)
|
||||
**Время сборки:** ~2-5 минут
|
||||
**Требования:** Python 3.8+, PyInstaller
|
||||
@@ -0,0 +1,173 @@
|
||||
# 🎯 Краткое руководство: Автоматические релизы
|
||||
|
||||
## Для GitHub
|
||||
|
||||
### 1. Создание релиза
|
||||
|
||||
```bash
|
||||
# Создать тег
|
||||
git tag -a v1.0.0 -m "Release version 1.0.0"
|
||||
|
||||
# Отправить тег
|
||||
git push origin v1.0.0
|
||||
```
|
||||
|
||||
### 2. Что произойдет автоматически
|
||||
|
||||
GitHub Actions запустит `.github/workflows/build-release.yml`:
|
||||
|
||||
1. ✅ Сборка Linux версии (Ubuntu runner)
|
||||
2. ✅ Сборка Windows версии (Windows runner)
|
||||
3. ✅ Создание пакетов
|
||||
4. ✅ Генерация SHA256 checksums
|
||||
5. ✅ Создание GitHub Release
|
||||
6. ✅ Загрузка артефактов
|
||||
|
||||
### 3. Результат
|
||||
|
||||
Релиз появится на: `https://github.com/USER/REPO/releases/tag/v1.0.0`
|
||||
|
||||
**Файлы:**
|
||||
- `letsencrypt-regru-linux-x86_64.tar.gz`
|
||||
- `letsencrypt-regru-linux-x86_64.tar.gz.sha256`
|
||||
- `letsencrypt-regru-windows-x86_64.zip`
|
||||
- `letsencrypt-regru-windows-x86_64.zip.sha256`
|
||||
|
||||
---
|
||||
|
||||
## Для Gitea
|
||||
|
||||
### 1. Настройка (один раз)
|
||||
|
||||
#### Включить Actions в Gitea:
|
||||
|
||||
Отредактируйте `app.ini`:
|
||||
|
||||
```ini
|
||||
[actions]
|
||||
ENABLED = true
|
||||
DEFAULT_ACTIONS_URL = https://gitea.com
|
||||
```
|
||||
|
||||
#### Установить Gitea Runner:
|
||||
|
||||
```bash
|
||||
# Скачать
|
||||
wget https://dl.gitea.com/act_runner/latest/act_runner-linux-amd64 -O act_runner
|
||||
chmod +x act_runner
|
||||
|
||||
# Зарегистрировать
|
||||
./act_runner register --no-interactive \
|
||||
--instance https://your-gitea.com \
|
||||
--token YOUR_RUNNER_TOKEN
|
||||
|
||||
# Запустить
|
||||
./act_runner daemon
|
||||
```
|
||||
|
||||
### 2. Создание релиза
|
||||
|
||||
```bash
|
||||
# Создать тег
|
||||
git tag -a v1.0.0 -m "Release version 1.0.0"
|
||||
|
||||
# Отправить тег
|
||||
git push origin v1.0.0
|
||||
```
|
||||
|
||||
### 3. Что произойдет
|
||||
|
||||
Gitea Actions запустит `.gitea/workflows/release.yml`:
|
||||
|
||||
1. ✅ Сборка Linux версии
|
||||
2. ✅ Сборка Windows версии
|
||||
3. ✅ Создание пакетов
|
||||
4. ✅ Генерация SHA256 + MD5 checksums
|
||||
5. ✅ Создание Gitea Release
|
||||
6. ✅ Детальные release notes
|
||||
|
||||
### 4. Результат
|
||||
|
||||
Релиз появится на: `https://your-gitea.com/USER/REPO/releases/tag/v1.0.0`
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Проверка перед релизом
|
||||
|
||||
```bash
|
||||
# 1. Локальная сборка
|
||||
make clean-build
|
||||
make release
|
||||
|
||||
# 2. Тестирование
|
||||
make test-build
|
||||
|
||||
# 3. Проверка файлов
|
||||
ls -lh dist/
|
||||
|
||||
# 4. Если все OK - создать тег
|
||||
git tag -a v1.0.0 -m "Release 1.0.0"
|
||||
git push origin v1.0.0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Мониторинг
|
||||
|
||||
### GitHub:
|
||||
`https://github.com/USER/REPO/actions`
|
||||
|
||||
### Gitea:
|
||||
`https://your-gitea.com/USER/REPO/actions`
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Если что-то пошло не так
|
||||
|
||||
### Удалить тег и релиз:
|
||||
|
||||
```bash
|
||||
# Удалить локальный тег
|
||||
git tag -d v1.0.0
|
||||
|
||||
# Удалить удаленный тег
|
||||
git push --delete origin v1.0.0
|
||||
|
||||
# Удалить релиз вручную через веб-интерфейс
|
||||
```
|
||||
|
||||
### Пересоздать релиз:
|
||||
|
||||
```bash
|
||||
# Исправить проблему
|
||||
git commit -am "Fix build"
|
||||
|
||||
# Пересоздать тег
|
||||
git tag -a v1.0.0 -m "Release 1.0.0" --force
|
||||
git push origin v1.0.0 --force
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Semantic Versioning
|
||||
|
||||
```bash
|
||||
# Major (несовместимые изменения)
|
||||
git tag v2.0.0
|
||||
|
||||
# Minor (новые функции)
|
||||
git tag v1.1.0
|
||||
|
||||
# Patch (исправления)
|
||||
git tag v1.0.1
|
||||
|
||||
# Pre-release
|
||||
git tag v1.0.0-beta.1
|
||||
git tag v1.0.0-rc.1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**См. также:**
|
||||
- [.gitea/README.md](.gitea/README.md) - Полная документация по Gitea Actions
|
||||
- [BUILD_GUIDE.md](BUILD_GUIDE.md) - Руководство по сборке
|
||||
@@ -0,0 +1,170 @@
|
||||
# Автоматизация SSL сертификатов Let's Encrypt для reg.ru
|
||||
|
||||
Набор скриптов для автоматического создания и обновления SSL сертификатов Let's Encrypt с использованием DNS-валидации через API reg.ru.
|
||||
|
||||
## 📁 Содержимое проекта
|
||||
|
||||
- **letsencrypt_regru_dns.sh** - Bash скрипт (Linux) с certbot-dns-regru
|
||||
- **letsencrypt_regru_api.py** - Python скрипт с прямым API интеграцией
|
||||
- **letsencrypt_regru.ps1** - PowerShell скрипт (Windows)
|
||||
- **config.json.example** - Пример файла конфигурации
|
||||
- **USAGE.md** - Подробная инструкция по использованию
|
||||
|
||||
## 🚀 Быстрый старт
|
||||
|
||||
### Linux (Bash)
|
||||
|
||||
```bash
|
||||
# 1. Отредактируйте конфигурацию в скрипте
|
||||
nano letsencrypt_regru_dns.sh
|
||||
|
||||
# 2. Установите права
|
||||
chmod +x letsencrypt_regru_dns.sh
|
||||
|
||||
# 3. Запустите
|
||||
sudo ./letsencrypt_regru_dns.sh
|
||||
```
|
||||
|
||||
### Linux (Python)
|
||||
|
||||
```bash
|
||||
# 1. Создайте конфигурацию
|
||||
sudo python3 letsencrypt_regru_api.py --create-config /etc/letsencrypt/regru_config.json
|
||||
|
||||
# 2. Отредактируйте конфигурацию
|
||||
sudo nano /etc/letsencrypt/regru_config.json
|
||||
|
||||
# 3. Получите сертификат
|
||||
sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json --obtain
|
||||
```
|
||||
|
||||
### Windows (PowerShell)
|
||||
|
||||
```powershell
|
||||
# 1. Создайте файл конфигурации config.json на основе config.json.example
|
||||
|
||||
# 2. Запустите скрипт
|
||||
.\letsencrypt_regru.ps1 -ConfigFile .\config.json
|
||||
```
|
||||
|
||||
## ⚙️ Конфигурация
|
||||
|
||||
Отредактируйте `config.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"regru_username": "ваш_логин",
|
||||
"regru_password": "ваш_пароль",
|
||||
"domain": "dfv24.com",
|
||||
"wildcard": true,
|
||||
"email": "admin@dfv24.com"
|
||||
}
|
||||
```
|
||||
|
||||
## 📋 Требования
|
||||
|
||||
### Linux
|
||||
- certbot
|
||||
- Python 3.6+
|
||||
- pip3
|
||||
- requests, cryptography (Python модули)
|
||||
- certbot-dns-regru (опционально)
|
||||
|
||||
### Windows
|
||||
- certbot
|
||||
- PowerShell 5.1+
|
||||
- openssl (для проверки сертификатов)
|
||||
|
||||
## 🔄 Автоматическое обновление
|
||||
|
||||
### Через cron (Linux)
|
||||
|
||||
```bash
|
||||
# Добавьте в crontab
|
||||
sudo crontab -e
|
||||
|
||||
# Проверка каждый день в 3:00
|
||||
0 3 * * * /usr/bin/python3 /path/to/letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json
|
||||
```
|
||||
|
||||
### Через Task Scheduler (Windows)
|
||||
|
||||
1. Откройте Task Scheduler
|
||||
2. Создайте новую задачу
|
||||
3. Триггер: Ежедневно в 3:00
|
||||
4. Действие: Запуск PowerShell скрипта
|
||||
|
||||
## 📖 Функции
|
||||
|
||||
✅ Создание wildcard сертификатов (*.domain.com)
|
||||
✅ Автоматическая DNS-валидация через API reg.ru
|
||||
✅ Проверка срока действия сертификата
|
||||
✅ Автоматическое обновление перед истечением
|
||||
✅ Перезагрузка веб-сервера после обновления
|
||||
✅ Подробное логирование всех операций
|
||||
|
||||
## 🔧 Использование с Nginx Proxy Manager
|
||||
|
||||
После получения сертификата:
|
||||
|
||||
1. Войдите в NPM: http://192.168.10.14:81/
|
||||
2. SSL Certificates → Add SSL Certificate → Custom
|
||||
3. Вставьте содержимое:
|
||||
- Certificate Key: `/etc/letsencrypt/live/domain.com/privkey.pem`
|
||||
- Certificate: `/etc/letsencrypt/live/domain.com/fullchain.pem`
|
||||
|
||||
## 📝 Логи
|
||||
|
||||
- Bash: `/var/log/letsencrypt_regru.log`
|
||||
- Python: `/var/log/letsencrypt_regru.log`
|
||||
- PowerShell: `.\letsencrypt_regru.log`
|
||||
- Certbot: `/var/log/letsencrypt/letsencrypt.log`
|
||||
|
||||
## 🆘 Устранение неполадок
|
||||
|
||||
### Ошибка аутентификации API
|
||||
- Проверьте учетные данные reg.ru
|
||||
- Убедитесь, что домен под вашим управлением
|
||||
|
||||
### DNS запись не распространяется
|
||||
- Увеличьте `dns_propagation_wait` до 120 секунд
|
||||
- Проверьте DNS: `nslookup -type=TXT _acme-challenge.domain.com`
|
||||
|
||||
### Certbot не найден
|
||||
```bash
|
||||
# Ubuntu/Debian
|
||||
sudo apt-get install certbot
|
||||
|
||||
# Или через snap
|
||||
sudo snap install --classic certbot
|
||||
```
|
||||
|
||||
## 📚 Документация
|
||||
|
||||
Подробная документация в файле [USAGE.md](USAGE.md)
|
||||
|
||||
## 🔐 Безопасность
|
||||
|
||||
- Храните учетные данные в безопасности
|
||||
- Используйте `chmod 600` для конфигурационных файлов
|
||||
- Регулярно обновляйте пароли
|
||||
|
||||
## ⚠️ Важно
|
||||
|
||||
- Let's Encrypt сертификаты действительны 90 дней
|
||||
- Рекомендуется настроить автоматическое обновление
|
||||
- Для wildcard сертификатов требуется DNS-валидация
|
||||
|
||||
## 📞 Поддержка
|
||||
|
||||
- [Документация reg.ru API](https://www.reg.ru/support/api)
|
||||
- [Документация Let's Encrypt](https://letsencrypt.org/docs/)
|
||||
- [Certbot Documentation](https://certbot.eff.org/docs/)
|
||||
|
||||
## 📄 Лицензия
|
||||
|
||||
Скрипты предоставляются "как есть" для свободного использования.
|
||||
|
||||
---
|
||||
|
||||
**Успешной автоматизации! 🔒**
|
||||
@@ -0,0 +1,382 @@
|
||||
# 🧪 Руководство по тестированию SSL сертификатов
|
||||
|
||||
## Зачем нужны тестовые сертификаты?
|
||||
|
||||
Let's Encrypt имеет **строгие ограничения**:
|
||||
- ⚠️ Максимум **5 сертификатов в неделю** на один домен
|
||||
- ⚠️ Максимум **50 сертификатов в неделю** на аккаунт
|
||||
- ⚠️ **Бан на 1 неделю** при превышении лимита
|
||||
|
||||
**Решение**: Используйте самоподписанные тестовые сертификаты для разработки!
|
||||
|
||||
---
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
### Вариант 1: Через Makefile (рекомендуется)
|
||||
|
||||
```bash
|
||||
# После установки скрипта (make install)
|
||||
sudo make test-cert
|
||||
```
|
||||
|
||||
**Результат**: Создан сертификат в `/etc/letsencrypt/live/ваш-домен/`
|
||||
|
||||
### Вариант 2: Через Python скрипт
|
||||
|
||||
```bash
|
||||
sudo python3 letsencrypt_regru_api.py \
|
||||
--config /etc/letsencrypt/regru_config.json \
|
||||
--test-cert -v
|
||||
```
|
||||
|
||||
### Вариант 3: Через Bash скрипт (автономный)
|
||||
|
||||
```bash
|
||||
# Простой домен
|
||||
sudo ./test_certificate.sh example.com no
|
||||
|
||||
# С wildcard
|
||||
sudo ./test_certificate.sh example.com yes
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Сравнение методов
|
||||
|
||||
| Метод | Скорость | Требования | NPM интеграция | Лимиты |
|
||||
|-------|----------|------------|----------------|--------|
|
||||
| **Let's Encrypt** | 2-5 минут | Internet, DNS | ✅ Да | ⚠️ 5/неделю |
|
||||
| **Тестовый (Python)** | 1-2 секунды | Только Python | ✅ Да | ✅ Нет |
|
||||
| **Тестовый (Bash)** | 1-2 секунды | Только OpenSSL | ❌ Ручная | ✅ Нет |
|
||||
|
||||
---
|
||||
|
||||
## Детальная инструкция
|
||||
|
||||
### 1. Подготовка конфигурации
|
||||
|
||||
```bash
|
||||
# Создать конфигурацию
|
||||
sudo nano /etc/letsencrypt/regru_config.json
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"domain": "test.example.com",
|
||||
"wildcard": true,
|
||||
"cert_dir": "/etc/letsencrypt/live",
|
||||
"npm_enabled": true,
|
||||
"npm_host": "https://npm.example.com",
|
||||
"npm_email": "admin@example.com",
|
||||
"npm_password": "your_password"
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Создание тестового сертификата
|
||||
|
||||
```bash
|
||||
sudo make test-cert
|
||||
```
|
||||
|
||||
### 3. Проверка созданных файлов
|
||||
|
||||
```bash
|
||||
ls -la /etc/letsencrypt/live/test.example.com/
|
||||
# Должны быть:
|
||||
# - privkey.pem (приватный ключ)
|
||||
# - cert.pem (сертификат)
|
||||
# - fullchain.pem (полная цепочка)
|
||||
# - chain.pem (CA цепочка)
|
||||
```
|
||||
|
||||
### 4. Просмотр информации о сертификате
|
||||
|
||||
```bash
|
||||
openssl x509 -in /etc/letsencrypt/live/test.example.com/cert.pem -text -noout
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Использование в Nginx
|
||||
|
||||
### Прямое использование
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 443 ssl;
|
||||
server_name test.example.com;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/test.example.com/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/test.example.com/privkey.pem;
|
||||
|
||||
# ... остальная конфигурация
|
||||
}
|
||||
```
|
||||
|
||||
### Через Nginx Proxy Manager
|
||||
|
||||
Если `npm_enabled: true` в конфигурации, сертификат автоматически загрузится в NPM.
|
||||
|
||||
**Проверка в NPM:**
|
||||
1. Откройте веб-интерфейс NPM
|
||||
2. Перейдите в **SSL Certificates**
|
||||
3. Найдите ваш домен в списке
|
||||
4. ⚠️ Будет помечен как "Custom" (не Let's Encrypt)
|
||||
|
||||
---
|
||||
|
||||
## Автоматизация тестирования
|
||||
|
||||
### Скрипт для CI/CD
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# test_ssl_integration.sh
|
||||
|
||||
set -e
|
||||
|
||||
echo "🧪 Тестирование SSL интеграции..."
|
||||
|
||||
# 1. Создать тестовый сертификат
|
||||
sudo python3 letsencrypt_regru_api.py \
|
||||
--config test_config.json \
|
||||
--test-cert
|
||||
|
||||
# 2. Проверить файлы
|
||||
if [ ! -f "/etc/letsencrypt/live/test.example.com/fullchain.pem" ]; then
|
||||
echo "❌ Сертификат не создан"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 3. Проверить валидность
|
||||
openssl x509 -in /etc/letsencrypt/live/test.example.com/cert.pem -noout -checkend 0
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "✅ Сертификат валиден"
|
||||
else
|
||||
echo "❌ Сертификат невалиден"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 4. Проверить загрузку в NPM (опционально)
|
||||
# ... ваша проверка через API NPM
|
||||
|
||||
echo "✅ Все тесты пройдены"
|
||||
```
|
||||
|
||||
### Makefile для тестирования
|
||||
|
||||
```makefile
|
||||
.PHONY: test-ssl test-npm test-all
|
||||
|
||||
test-ssl:
|
||||
@echo "Создание тестового сертификата..."
|
||||
sudo make test-cert
|
||||
@echo "Проверка файлов..."
|
||||
test -f /etc/letsencrypt/live/$(DOMAIN)/fullchain.pem
|
||||
@echo "✅ SSL тест пройден"
|
||||
|
||||
test-npm:
|
||||
@echo "Проверка интеграции с NPM..."
|
||||
# Ваши проверки API NPM
|
||||
@echo "✅ NPM тест пройден"
|
||||
|
||||
test-all: test-ssl test-npm
|
||||
@echo "✅ Все тесты пройдены"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Переход на production
|
||||
|
||||
### Шаг 1: Тестирование
|
||||
|
||||
```bash
|
||||
# 1. Создать тестовый сертификат
|
||||
sudo make test-cert
|
||||
|
||||
# 2. Проверить работу с NPM
|
||||
# Открыть https://ваш-домен и проверить
|
||||
|
||||
# 3. Убедиться что все работает
|
||||
```
|
||||
|
||||
### Шаг 2: Переключение на Let's Encrypt
|
||||
|
||||
```bash
|
||||
# 1. Удалить тестовый сертификат
|
||||
sudo rm -rf /etc/letsencrypt/live/ваш-домен/
|
||||
|
||||
# 2. Получить настоящий сертификат
|
||||
sudo make obtain
|
||||
|
||||
# 3. Проверить обновление в NPM
|
||||
sudo make status
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Частые вопросы
|
||||
|
||||
### Q: Почему браузер показывает предупреждение?
|
||||
|
||||
**A:** Самоподписанные сертификаты не доверяются браузерами. Это нормально для тестирования.
|
||||
|
||||
Чтобы избежать предупреждения в браузере (только для локального тестирования):
|
||||
1. Chrome: `chrome://flags/#allow-insecure-localhost`
|
||||
2. Firefox: Нажмите "Advanced" → "Accept the Risk"
|
||||
|
||||
### Q: Можно ли использовать для production?
|
||||
|
||||
**A:** ❌ **НЕТ!** Тестовые сертификаты только для разработки и тестирования.
|
||||
|
||||
### Q: Как часто можно создавать тестовые сертификаты?
|
||||
|
||||
**A:** ✅ Неограниченно! Нет никаких лимитов.
|
||||
|
||||
### Q: Загружаются ли в NPM автоматически?
|
||||
|
||||
**A:** ✅ Да, если `npm_enabled: true` в конфигурации.
|
||||
|
||||
### Q: Работают ли с wildcard доменами?
|
||||
|
||||
**A:** ✅ Да! Просто установите `"wildcard": true` в конфигурации.
|
||||
|
||||
### Q: Как проверить срок действия?
|
||||
|
||||
```bash
|
||||
openssl x509 -in /etc/letsencrypt/live/ваш-домен/cert.pem -noout -dates
|
||||
```
|
||||
|
||||
### Q: Как изменить срок действия?
|
||||
|
||||
Отредактируйте `validity_days` в функции `generate_self_signed_certificate()`:
|
||||
|
||||
```python
|
||||
validity_days: int = 365 # Изменить на нужное количество дней
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Устранение проблем
|
||||
|
||||
### Ошибка: Permission denied
|
||||
|
||||
```bash
|
||||
# Запускайте с sudo
|
||||
sudo make test-cert
|
||||
```
|
||||
|
||||
### Ошибка: Module 'cryptography' not found
|
||||
|
||||
```bash
|
||||
# Установите зависимости
|
||||
sudo pip3 install cryptography
|
||||
```
|
||||
|
||||
### NPM не показывает сертификат
|
||||
|
||||
1. Проверьте настройки NPM в конфигурации
|
||||
2. Проверьте логи: `sudo make logs`
|
||||
3. Попробуйте загрузить вручную через веб-интерфейс NPM
|
||||
|
||||
### Сертификат не создается
|
||||
|
||||
```bash
|
||||
# Проверьте права
|
||||
ls -la /etc/letsencrypt/live/
|
||||
|
||||
# Создайте директорию вручную
|
||||
sudo mkdir -p /etc/letsencrypt/live/
|
||||
|
||||
# Проверьте конфигурацию
|
||||
sudo make check-config
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Примеры использования
|
||||
|
||||
### Разработка с Docker
|
||||
|
||||
```dockerfile
|
||||
FROM nginx:alpine
|
||||
|
||||
# Копировать тестовый сертификат
|
||||
COPY test-certs/ /etc/nginx/ssl/
|
||||
|
||||
# Конфигурация nginx
|
||||
COPY nginx.conf /etc/nginx/nginx.conf
|
||||
|
||||
EXPOSE 443
|
||||
```
|
||||
|
||||
### Локальное тестирование
|
||||
|
||||
```bash
|
||||
# Создать сертификат для localhost
|
||||
sudo python3 letsencrypt_regru_api.py --test-cert
|
||||
|
||||
# Добавить в /etc/hosts
|
||||
echo "127.0.0.1 test.example.com" | sudo tee -a /etc/hosts
|
||||
|
||||
# Запустить nginx
|
||||
sudo nginx -t && sudo nginx -s reload
|
||||
|
||||
# Открыть в браузере
|
||||
open https://test.example.com
|
||||
```
|
||||
|
||||
### Автоматическое тестирование перед deployment
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# pre-deploy.sh
|
||||
|
||||
# Тестовая проверка SSL
|
||||
sudo make test-cert
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "✅ Тестовый сертификат создан успешно"
|
||||
echo "✅ Готово к созданию production сертификата"
|
||||
sudo make obtain
|
||||
else
|
||||
echo "❌ Ошибка при создании тестового сертификата"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Дополнительные ресурсы
|
||||
|
||||
- 📘 [Let's Encrypt Rate Limits](https://letsencrypt.org/docs/rate-limits/)
|
||||
- 📘 [OpenSSL Documentation](https://www.openssl.org/docs/)
|
||||
- 📘 [Nginx Proxy Manager Docs](https://nginxproxymanager.com/guide/)
|
||||
|
||||
---
|
||||
|
||||
## Итоговая шпаргалка
|
||||
|
||||
```bash
|
||||
# Установка
|
||||
sudo make install
|
||||
|
||||
# Конфигурация
|
||||
sudo nano /etc/letsencrypt/regru_config.json
|
||||
|
||||
# Создать тестовый сертификат
|
||||
sudo make test-cert
|
||||
|
||||
# Проверить
|
||||
sudo make check-config
|
||||
sudo make status
|
||||
|
||||
# Переход на production
|
||||
sudo rm -rf /etc/letsencrypt/live/домен/
|
||||
sudo make obtain
|
||||
|
||||
# Автоматическое обновление
|
||||
sudo make run
|
||||
```
|
||||
|
||||
**Готово!** 🎉 Теперь вы можете тестировать SSL сертификаты без ограничений!
|
||||
@@ -0,0 +1,79 @@
|
||||
# Подробная инструкция по настройке Nginx Proxy Manager с одним глобальным SSL сертификатом для всех доменов dfv24.com
|
||||
|
||||
## Предпосылки
|
||||
- Установлен и запущен [Nginx Proxy Manager](http://192.168.10.14:81/)
|
||||
- Основной домен: dfv24.com
|
||||
- Хостинг и DNS записи домена находятся на reg.ru
|
||||
- Нужно использовать один SSL сертификат (например, wildcard) для всех поддоменов dfv24.com
|
||||
|
||||
---
|
||||
|
||||
## Шаг 1. Покупка и получение SSL Wildcard сертификата для dfv24.com
|
||||
1. На reg.ru или любом другом удостоверяющем центре (CA) закажите wildcard сертификат на домен вида `*.dfv24.com`.
|
||||
2. Получите файлы сертификата:
|
||||
- Главный сертификат (CRT)
|
||||
- Промежуточные сертификаты (CA Bundle)
|
||||
- Приватный ключ (KEY)
|
||||
|
||||
---
|
||||
|
||||
## Шаг 2. Импорт вашего SSL сертификата в Nginx Proxy Manager
|
||||
1. Авторизуйтесь в Nginx Proxy Manager на http://192.168.10.14:81/
|
||||
2. Перейдите в раздел **SSL Certificates** → кнопку **Add SSL Certificate**
|
||||
3. Выберите **Custom** (пользовательский сертификат)
|
||||
4. В поля вставьте:
|
||||
- **Certificate** — основной CRT + CA Bundle (если CA Bundle раздельно, склейте в один файл или вставляйте последовательно)
|
||||
- **Key** — содержимое приватного ключа
|
||||
- Имя сертификата задайте, например, `dfv24_wildcard`
|
||||
5. Сохраните
|
||||
|
||||
---
|
||||
|
||||
## Шаг 3. Настройка прокси-хостов с использованием глобального сертификата
|
||||
|
||||
1. Перейдите в **Proxy Hosts** → **Add Proxy Host**
|
||||
2. Заполните поля:
|
||||
- **Domain Names**: Например, `sub1.dfv24.com` (для первого поддомена)
|
||||
- **Scheme**: http или https, в зависимости от бекенда
|
||||
- **Forward Hostname / IP**: IP или DNS адрес вашего внутреннего сервиса
|
||||
- **Forward Port**: порт сервиса (например, 80 или 443)
|
||||
3. Включите **SSL** → Отметьте **Use a shared SSL certificate** (если такая опция доступна) или выберите ранее импортированный сертификат из списка
|
||||
4. Активируйте: **Block Common Exploits**, **Websockets Support**, выставьте Redirect HTTP to HTTPS, если требуется
|
||||
5. Сохраните прокси-хост
|
||||
|
||||
6. Повторите для всех поддоменов, указывая нужные домены и выбирая тот же wildcard SSL сертификат
|
||||
|
||||
---
|
||||
|
||||
## Шаг 4. Настройка DNS записей на reg.ru
|
||||
|
||||
1. Войдите в панель управления доменом на reg.ru
|
||||
2. Создайте или отредактируйте DNS записи типа A:
|
||||
- `dfv24.com` → IP вашего Nginx Proxy Manager (например, 192.168.10.14)
|
||||
- `*.dfv24.com` → тот же IP или конкретные поддомены, если есть специальные
|
||||
3. Сохраните изменения
|
||||
4. Дождитесь обновления DNS (от нескольких минут до 24 часов)
|
||||
|
||||
---
|
||||
|
||||
## Шаг 5. Тест и проверка работы
|
||||
|
||||
1. В браузере откройте любой из поддоменов `https://sub1.dfv24.com`
|
||||
2. Сертификат должен быть валидным, выданным на wildcard `*.dfv24.com`
|
||||
3. Проверьте работу прокси и корректность подстановки сертификата
|
||||
4. При необходимости проверьте логи Nginx Proxy Manager и исправьте ошибки
|
||||
|
||||
---
|
||||
|
||||
## Дополнительно
|
||||
|
||||
- Если в Nginx Proxy Manager нет GUI опции выбора общего сертификата, можно вручную сконфигурировать конфиги через директорий `/data/nginx/proxy_host` и прописать SSL сертификат для всех хостов.
|
||||
- При обновлении сертификата — повторно импортировать его в Nginx Proxy Manager.
|
||||
- Можно использовать LetsEncrypt для автоматического получения wildcard сертификата с помощью DNS-валидации (если поддерживается вашим DNS-провайдером).
|
||||
|
||||
---
|
||||
|
||||
# Итог
|
||||
|
||||
Используйте один wildcard сертификат для всех поддоменов, импортируйте его как пользовательский сертификат в Nginx Proxy Manager, при создании прокси-хостов выбирайте его в настройках SSL. Управляйте DNS записями на reg.ru, направляя domен на IP Nginx Proxy Manager.
|
||||
Это позволит юридически использовать единый сертификат для всех сервисов с различными поддоменами под вашим доменом dfv24.com.
|
||||
@@ -0,0 +1,86 @@
|
||||
# Инструкция по созданию wildcard сертификата *.dfv24.com в Nginx Proxy Manager и настройке автоматического продления SSL
|
||||
|
||||
---
|
||||
|
||||
## Шаг 1. Подготовка
|
||||
|
||||
- Убедитесь, что Nginx Proxy Manager (NPM) установлен и доступен по адресу http://192.168.10.14:81/
|
||||
- У вас есть доступ к DNS-записям домена dfv24.com в панели управления reg.ru или у другого регистратора
|
||||
|
||||
---
|
||||
|
||||
## Шаг 2. Создание Wildcard SSL сертификата в Nginx Proxy Manager
|
||||
|
||||
1. Войдите в админку Nginx Proxy Manager по адресу http://192.168.10.14:81/
|
||||
|
||||
2. Перейдите в раздел **SSL Certificates** → нажмите кнопку **Add SSL Certificate**
|
||||
|
||||
3. Выберите пункт **Let's Encrypt**
|
||||
|
||||
4. Заполните поля:
|
||||
- **Domain Names:**
|
||||
Введите `*.dfv24.com` — для wildcard сертификата
|
||||
Также рекомендуется добавить основной домен `dfv24.com` (через запятую или в новом поле)
|
||||
- **Email Address:**
|
||||
Укажите ваш Email для уведомлений от Let's Encrypt (обязательно)
|
||||
- **HTTP Challenge:**
|
||||
Оставьте проверку HTTP, если NPM доступен из интернета по порту 80 и 443, или настройте DNS Challenge если поддерживается вашим DNS
|
||||
|
||||
5. Отметьте галочку "Agree to the Let's Encrypt Terms of Service"
|
||||
|
||||
6. Нажмите **Save**
|
||||
|
||||
- NPM начнёт процесс получения сертификата с проверкой домена.
|
||||
- При успешном запросе сертификата вы увидите новый сертификат в списке.
|
||||
|
||||
---
|
||||
|
||||
## Шаг 3. Настройка автоматического продления
|
||||
|
||||
- Nginx Proxy Manager автоматически заботится о продлении сертификатов Let's Encrypt.
|
||||
- Для этого сервер должен быть доступен из интернета по портам 80 и 443, и DNS-записи правильно указывать на ваш сервер.
|
||||
- NPM периодически (обычно за 30 дней до окончания) запрашивает обновление сертификата.
|
||||
- В случае использования DNS Challenge необходимо чтобы в NPM была настроена интеграция с DNS провайдером (если поддерживается).
|
||||
|
||||
---
|
||||
|
||||
## Шаг 4. Использование wildcard сертификата в Proxy Hosts
|
||||
|
||||
1. Перейдите в **Proxy Hosts** → Создайте или отредактируйте запись прокси
|
||||
|
||||
2. В поле **Domain Names** укажите нужный поддомен из dfv24.com, например:
|
||||
`api.dfv24.com` или `www.dfv24.com`
|
||||
|
||||
3. В разделе **SSL** выберите ваш wildcard сертификат `*.dfv24.com`, который вы получили на шаге 2
|
||||
|
||||
4. Включите опции:
|
||||
- Use SSL
|
||||
- Force SSL
|
||||
- HSTS (при необходимости)
|
||||
|
||||
5. Сохраните изменения.
|
||||
|
||||
---
|
||||
|
||||
## Шаг 5. Проверка
|
||||
|
||||
1. Проверьте, что для всех поддоменов используется единый сертификат
|
||||
2. Посетите https://api.dfv24.com или другие поддомены из браузера
|
||||
3. Убедитесь, что сертификат валиден, не просрочен и выдан на *.dfv24.com
|
||||
4. Проверяйте в разделе SSL Certificates статус продления сертификата
|
||||
|
||||
---
|
||||
|
||||
## Дополнительно
|
||||
|
||||
- Если Let's Encrypt не может выполнить HTTP Challenge из-за закрытого порта, настройте DNS Challenge (может потребоваться ключ API DNS провайдера)
|
||||
- Для безопасности и уведомлений держите Email в актуальном состоянии
|
||||
- Проверяйте логи Nginx Proxy Manager для выявления ошибок продления
|
||||
|
||||
---
|
||||
|
||||
# Итог
|
||||
|
||||
Nginx Proxy Manager позволяет легко получать и автоматически обновлять wildcard SSL сертификаты для домена *.dfv24.com с помощью Let's Encrypt.
|
||||
Главное — правильно настроить DNS записи и обеспечить интернет доступ на HTTP/HTTPS порты.
|
||||
Далее используйте один глобальный сертификат для всех ваших поддоменов через настройки Proxy Hosts.
|
||||
@@ -0,0 +1,168 @@
|
||||
# Git Hooks для Gitea
|
||||
|
||||
Автоматическая синхронизация с GitHub после push в Gitea.
|
||||
|
||||
## 📁 Файлы
|
||||
|
||||
- **post-receive** - Hook для автоматического push в GitHub
|
||||
|
||||
## 🚀 Установка
|
||||
|
||||
### 1. Найдите путь к репозиторию на сервере Gitea
|
||||
|
||||
```bash
|
||||
# Обычно это один из путей:
|
||||
/var/lib/gitea/data/gitea-repositories/username/configure_nginx_manager.git
|
||||
# или
|
||||
/home/git/gitea-repositories/username/configure_nginx_manager.git
|
||||
```
|
||||
|
||||
### 2. Скопируйте hook
|
||||
|
||||
```bash
|
||||
# На сервере Gitea
|
||||
cd /path/to/gitea-repositories/username/configure_nginx_manager.git/hooks/
|
||||
|
||||
# Скопируйте файл
|
||||
cp /path/to/this/repo/gitea-hooks/post-receive ./
|
||||
|
||||
# Или загрузите напрямую
|
||||
wget https://raw.githubusercontent.com/username/configure_nginx_manager/main/gitea-hooks/post-receive
|
||||
```
|
||||
|
||||
### 3. Настройте hook
|
||||
|
||||
```bash
|
||||
nano post-receive
|
||||
```
|
||||
|
||||
Измените:
|
||||
```bash
|
||||
GITHUB_REPO="git@github.com:YOUR_USERNAME/configure_nginx_manager.git"
|
||||
```
|
||||
|
||||
### 4. Сделайте исполняемым
|
||||
|
||||
```bash
|
||||
chmod +x post-receive
|
||||
chown git:git post-receive
|
||||
```
|
||||
|
||||
### 5. Создайте директорию для логов
|
||||
|
||||
```bash
|
||||
mkdir -p /var/log/gitea
|
||||
chown git:git /var/log/gitea
|
||||
```
|
||||
|
||||
## 🔑 Настройка аутентификации
|
||||
|
||||
### Вариант A: SSH (Рекомендуется)
|
||||
|
||||
```bash
|
||||
# На сервере Gitea под пользователем git
|
||||
sudo su - git
|
||||
ssh-keygen -t ed25519 -C "gitea-sync"
|
||||
|
||||
# Скопируйте публичный ключ
|
||||
cat ~/.ssh/id_ed25519.pub
|
||||
|
||||
# Добавьте на GitHub:
|
||||
# Settings → SSH and GPG keys → New SSH key
|
||||
|
||||
# Проверьте
|
||||
ssh -T git@github.com
|
||||
```
|
||||
|
||||
### Вариант B: HTTPS с токеном
|
||||
|
||||
1. Создайте Personal Access Token на GitHub
|
||||
- Settings → Developer settings → Personal access tokens
|
||||
- Scope: `repo`
|
||||
|
||||
2. Используйте в hook:
|
||||
```bash
|
||||
GITHUB_REPO="https://YOUR_TOKEN@github.com/username/configure_nginx_manager.git"
|
||||
```
|
||||
|
||||
## ✅ Проверка
|
||||
|
||||
```bash
|
||||
# Тестовый push
|
||||
cd /tmp
|
||||
git clone http://gitea.example.com/username/configure_nginx_manager.git
|
||||
cd configure_nginx_manager
|
||||
echo "test" >> README.md
|
||||
git add README.md
|
||||
git commit -m "Test sync"
|
||||
git push
|
||||
|
||||
# Проверьте лог
|
||||
tail -f /var/log/gitea/github-sync.log
|
||||
|
||||
# Проверьте GitHub - изменения должны появиться через 1-2 секунды
|
||||
```
|
||||
|
||||
## 📊 Что делает hook
|
||||
|
||||
1. ✅ Отслеживает push в ветки `main` и `master`
|
||||
2. ✅ Автоматически пушит в GitHub
|
||||
3. ✅ Синхронизирует теги
|
||||
4. ✅ Логирует все операции
|
||||
5. ✅ Показывает красивый вывод с эмодзи
|
||||
|
||||
## 🐛 Устранение проблем
|
||||
|
||||
### Hook не срабатывает
|
||||
|
||||
```bash
|
||||
# Проверьте права
|
||||
ls -la post-receive
|
||||
# Должно быть: -rwxr-xr-x
|
||||
|
||||
# Проверьте владельца
|
||||
chown git:git post-receive
|
||||
|
||||
# Проверьте синтаксис
|
||||
bash -n post-receive
|
||||
```
|
||||
|
||||
### Permission denied
|
||||
|
||||
```bash
|
||||
# Для SSH
|
||||
ssh -T git@github.com
|
||||
|
||||
# Проверьте права на ключ
|
||||
chmod 600 ~/.ssh/id_ed25519
|
||||
|
||||
# Для HTTPS - проверьте токен
|
||||
```
|
||||
|
||||
### Не находит git
|
||||
|
||||
```bash
|
||||
# Добавьте PATH в начало hook:
|
||||
export PATH=/usr/bin:/usr/local/bin:$PATH
|
||||
```
|
||||
|
||||
## 📝 Логи
|
||||
|
||||
```bash
|
||||
# Просмотр логов синхронизации
|
||||
tail -f /var/log/gitea/github-sync.log
|
||||
|
||||
# Очистка старых логов
|
||||
> /var/log/gitea/github-sync.log
|
||||
```
|
||||
|
||||
## 🔄 Альтернативы
|
||||
|
||||
Если Git Hook не подходит, см. другие методы в [GITEA_SYNC.md](../GITEA_SYNC.md):
|
||||
- GitHub Actions (каждый час)
|
||||
- Gitea Mirror (встроенная функция)
|
||||
- Двойной remote (локально)
|
||||
|
||||
---
|
||||
|
||||
**См. также**: [GITEA_SYNC.md](../GITEA_SYNC.md) для подробной документации
|
||||
@@ -0,0 +1,168 @@
|
||||
# Git Hooks for Gitea
|
||||
|
||||
Automatic synchronization with GitHub after push to Gitea.
|
||||
|
||||
## 📁 Files
|
||||
|
||||
- **post-receive** - Hook for automatic push to GitHub
|
||||
|
||||
## 🚀 Installation
|
||||
|
||||
### 1. Find Repository Path on Gitea Server
|
||||
|
||||
```bash
|
||||
# Usually one of these paths:
|
||||
/var/lib/gitea/data/gitea-repositories/username/configure_nginx_manager.git
|
||||
# or
|
||||
/home/git/gitea-repositories/username/configure_nginx_manager.git
|
||||
```
|
||||
|
||||
### 2. Copy Hook
|
||||
|
||||
```bash
|
||||
# On Gitea server
|
||||
cd /path/to/gitea-repositories/username/configure_nginx_manager.git/hooks/
|
||||
|
||||
# Copy file
|
||||
cp /path/to/this/repo/gitea-hooks/post-receive ./
|
||||
|
||||
# Or download directly
|
||||
wget https://raw.githubusercontent.com/username/configure_nginx_manager/main/gitea-hooks/post-receive
|
||||
```
|
||||
|
||||
### 3. Configure Hook
|
||||
|
||||
```bash
|
||||
nano post-receive
|
||||
```
|
||||
|
||||
Change:
|
||||
```bash
|
||||
GITHUB_REPO="git@github.com:YOUR_USERNAME/configure_nginx_manager.git"
|
||||
```
|
||||
|
||||
### 4. Make Executable
|
||||
|
||||
```bash
|
||||
chmod +x post-receive
|
||||
chown git:git post-receive
|
||||
```
|
||||
|
||||
### 5. Create Log Directory
|
||||
|
||||
```bash
|
||||
mkdir -p /var/log/gitea
|
||||
chown git:git /var/log/gitea
|
||||
```
|
||||
|
||||
## 🔑 Authentication Setup
|
||||
|
||||
### Option A: SSH (Recommended)
|
||||
|
||||
```bash
|
||||
# On Gitea server as git user
|
||||
sudo su - git
|
||||
ssh-keygen -t ed25519 -C "gitea-sync"
|
||||
|
||||
# Copy public key
|
||||
cat ~/.ssh/id_ed25519.pub
|
||||
|
||||
# Add to GitHub:
|
||||
# Settings → SSH and GPG keys → New SSH key
|
||||
|
||||
# Verify
|
||||
ssh -T git@github.com
|
||||
```
|
||||
|
||||
### Option B: HTTPS with Token
|
||||
|
||||
1. Create Personal Access Token on GitHub
|
||||
- Settings → Developer settings → Personal access tokens
|
||||
- Scope: `repo`
|
||||
|
||||
2. Use in hook:
|
||||
```bash
|
||||
GITHUB_REPO="https://YOUR_TOKEN@github.com/username/configure_nginx_manager.git"
|
||||
```
|
||||
|
||||
## ✅ Verification
|
||||
|
||||
```bash
|
||||
# Test push
|
||||
cd /tmp
|
||||
git clone http://gitea.example.com/username/configure_nginx_manager.git
|
||||
cd configure_nginx_manager
|
||||
echo "test" >> README.md
|
||||
git add README.md
|
||||
git commit -m "Test sync"
|
||||
git push
|
||||
|
||||
# Check log
|
||||
tail -f /var/log/gitea/github-sync.log
|
||||
|
||||
# Check GitHub - changes should appear in 1-2 seconds
|
||||
```
|
||||
|
||||
## 📊 What Hook Does
|
||||
|
||||
1. ✅ Monitors pushes to `main` and `master` branches
|
||||
2. ✅ Automatically pushes to GitHub
|
||||
3. ✅ Synchronizes tags
|
||||
4. ✅ Logs all operations
|
||||
5. ✅ Shows beautiful output with emojis
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
### Hook Not Firing
|
||||
|
||||
```bash
|
||||
# Check permissions
|
||||
ls -la post-receive
|
||||
# Should be: -rwxr-xr-x
|
||||
|
||||
# Check owner
|
||||
chown git:git post-receive
|
||||
|
||||
# Check syntax
|
||||
bash -n post-receive
|
||||
```
|
||||
|
||||
### Permission Denied
|
||||
|
||||
```bash
|
||||
# For SSH
|
||||
ssh -T git@github.com
|
||||
|
||||
# Check key permissions
|
||||
chmod 600 ~/.ssh/id_ed25519
|
||||
|
||||
# For HTTPS - check token
|
||||
```
|
||||
|
||||
### Can't Find Git
|
||||
|
||||
```bash
|
||||
# Add PATH to beginning of hook:
|
||||
export PATH=/usr/bin:/usr/local/bin:$PATH
|
||||
```
|
||||
|
||||
## 📝 Logs
|
||||
|
||||
```bash
|
||||
# View sync logs
|
||||
tail -f /var/log/gitea/github-sync.log
|
||||
|
||||
# Clear old logs
|
||||
> /var/log/gitea/github-sync.log
|
||||
```
|
||||
|
||||
## 🔄 Alternatives
|
||||
|
||||
If Git Hook doesn't work, see other methods in [GITEA_SYNC_EN.md](../GITEA_SYNC_EN.md):
|
||||
- GitHub Actions (every hour)
|
||||
- Gitea Mirror (built-in feature)
|
||||
- Double remote (locally)
|
||||
|
||||
---
|
||||
|
||||
**See also**: [GITEA_SYNC_EN.md](../GITEA_SYNC_EN.md) for detailed documentation
|
||||
@@ -0,0 +1,83 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ==============================================================================
|
||||
# Post-receive hook для Gitea
|
||||
# Автоматически синхронизирует изменения с GitHub после push
|
||||
#
|
||||
# Установка:
|
||||
# 1. Разместить в: /path/to/gitea/data/gitea-repositories/username/repo.git/hooks/
|
||||
# 2. Переименовать в: post-receive
|
||||
# 3. chmod +x post-receive
|
||||
# 4. Настроить переменные ниже
|
||||
# ==============================================================================
|
||||
|
||||
# Конфигурация
|
||||
GITHUB_REPO="git@github.com:username/configure_nginx_manager.git"
|
||||
# Или с HTTPS и токеном:
|
||||
# GITHUB_REPO="https://YOUR_GITHUB_TOKEN@github.com/username/configure_nginx_manager.git"
|
||||
|
||||
LOG_FILE="/var/log/gitea/github-sync.log"
|
||||
|
||||
# Цвета для логов
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# ==============================================================================
|
||||
# Функция логирования
|
||||
# ==============================================================================
|
||||
log() {
|
||||
echo -e "${2:-$NC}[$(date +'%d.%m.%Y %H:%M:%S')] $1${NC}" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
# ==============================================================================
|
||||
# Основная логика
|
||||
# ==============================================================================
|
||||
|
||||
log "═══════════════════════════════════════════════════════════════" "$GREEN"
|
||||
log "🔄 Начало синхронизации с GitHub" "$GREEN"
|
||||
log "═══════════════════════════════════════════════════════════════" "$GREEN"
|
||||
|
||||
# Читаем информацию о push
|
||||
while read oldrev newrev refname; do
|
||||
log "📝 Изменения обнаружены:" "$YELLOW"
|
||||
log " Branch: ${refname#refs/heads/}"
|
||||
log " Old commit: ${oldrev:0:8}"
|
||||
log " New commit: ${newrev:0:8}"
|
||||
|
||||
# Проверяем наличие GitHub remote
|
||||
if ! git remote | grep -q github; then
|
||||
log "➕ Добавление GitHub remote..." "$YELLOW"
|
||||
git remote add github "$GITHUB_REPO" 2>&1 | tee -a "$LOG_FILE"
|
||||
fi
|
||||
|
||||
# Пушим в GitHub
|
||||
log "⬆️ Отправка изменений в GitHub..." "$YELLOW"
|
||||
|
||||
# Только для main/master веток
|
||||
if [[ "$refname" == "refs/heads/main" ]] || [[ "$refname" == "refs/heads/master" ]]; then
|
||||
if git push github "$refname" --force 2>&1 | tee -a "$LOG_FILE"; then
|
||||
log "✅ Успешно синхронизировано с GitHub" "$GREEN"
|
||||
else
|
||||
log "❌ Ошибка при синхронизации с GitHub" "$RED"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Пушим теги
|
||||
log "🏷️ Отправка тегов..." "$YELLOW"
|
||||
if git push github --tags 2>&1 | tee -a "$LOG_FILE"; then
|
||||
log "✅ Теги синхронизированы" "$GREEN"
|
||||
else
|
||||
log "⚠️ Не удалось синхронизировать теги" "$YELLOW"
|
||||
fi
|
||||
else
|
||||
log "ℹ️ Ветка ${refname#refs/heads/} игнорируется (не main/master)" "$YELLOW"
|
||||
fi
|
||||
done
|
||||
|
||||
log "═══════════════════════════════════════════════════════════════" "$GREEN"
|
||||
log "✅ Синхронизация завершена" "$GREEN"
|
||||
log "═══════════════════════════════════════════════════════════════" "$GREEN"
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,556 @@
|
||||
# ============================================================================
|
||||
# Скрипт для создания и обновления SSL сертификата Let's Encrypt
|
||||
# с использованием DNS-валидации через API reg.ru (PowerShell версия)
|
||||
#
|
||||
# Автор: Фофанов Дмитрий
|
||||
# Дата: 27.10.2025
|
||||
# Описание: PowerShell версия скрипта для Windows окружения
|
||||
# ============================================================================
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Автоматизация получения SSL сертификатов Let's Encrypt через DNS-валидацию reg.ru
|
||||
|
||||
.DESCRIPTION
|
||||
Скрипт позволяет автоматически получать и обновлять SSL сертификаты Let's Encrypt
|
||||
для доменов на reg.ru используя DNS-01 challenge через API
|
||||
|
||||
.PARAMETER Domain
|
||||
Основной домен (например, dfv24.com)
|
||||
|
||||
.PARAMETER Email
|
||||
Email для уведомлений Let's Encrypt
|
||||
|
||||
.PARAMETER RegRuUsername
|
||||
Имя пользователя reg.ru
|
||||
|
||||
.PARAMETER RegRuPassword
|
||||
Пароль reg.ru
|
||||
|
||||
.PARAMETER Wildcard
|
||||
Создать wildcard сертификат (*.domain.com)
|
||||
|
||||
.PARAMETER ConfigFile
|
||||
Путь к файлу конфигурации JSON
|
||||
|
||||
.EXAMPLE
|
||||
.\letsencrypt_regru.ps1 -Domain "dfv24.com" -Email "admin@dfv24.com" -Wildcard
|
||||
#>
|
||||
|
||||
param(
|
||||
[Parameter(Mandatory=$false)]
|
||||
[string]$Domain = "dfv24.com",
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[string]$Email = "admin@dfv24.com",
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[string]$RegRuUsername = "",
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[string]$RegRuPassword = "",
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[switch]$Wildcard = $true,
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[string]$ConfigFile = ".\config.json",
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[switch]$Verbose = $false
|
||||
)
|
||||
|
||||
# ============================================================================
|
||||
# КОНФИГУРАЦИЯ
|
||||
# ============================================================================
|
||||
|
||||
$Script:Config = @{
|
||||
RegRuApiUrl = "https://api.reg.ru/api/regru2"
|
||||
CertbotPath = "certbot"
|
||||
LogFile = ".\letsencrypt_regru.log"
|
||||
DnsPropagationWait = 60
|
||||
DnsCheckAttempts = 10
|
||||
DnsCheckInterval = 10
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# ФУНКЦИИ ЛОГИРОВАНИЯ
|
||||
# ============================================================================
|
||||
|
||||
function Write-Log {
|
||||
param(
|
||||
[string]$Message,
|
||||
[string]$Level = "INFO"
|
||||
)
|
||||
|
||||
$Timestamp = Get-Date -Format "dd.MM.yyyy HH:mm:ss"
|
||||
$LogMessage = "[$Timestamp] [$Level] $Message"
|
||||
|
||||
# Вывод в консоль
|
||||
switch ($Level) {
|
||||
"ERROR" { Write-Host $LogMessage -ForegroundColor Red }
|
||||
"WARNING" { Write-Host $LogMessage -ForegroundColor Yellow }
|
||||
"SUCCESS" { Write-Host $LogMessage -ForegroundColor Green }
|
||||
default { Write-Host $LogMessage }
|
||||
}
|
||||
|
||||
# Запись в файл
|
||||
Add-Content -Path $Script:Config.LogFile -Value $LogMessage
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# ФУНКЦИИ РАБОТЫ С КОНФИГУРАЦИЕЙ
|
||||
# ============================================================================
|
||||
|
||||
function Load-Configuration {
|
||||
param([string]$ConfigPath)
|
||||
|
||||
Write-Log "Загрузка конфигурации из: $ConfigPath"
|
||||
|
||||
if (Test-Path $ConfigPath) {
|
||||
try {
|
||||
$config = Get-Content -Path $ConfigPath -Raw | ConvertFrom-Json
|
||||
|
||||
# Обновляем параметры скрипта из конфигурации
|
||||
if ($config.domain) { $Script:Domain = $config.domain }
|
||||
if ($config.email) { $Script:Email = $config.email }
|
||||
if ($config.regru_username) { $Script:RegRuUsername = $config.regru_username }
|
||||
if ($config.regru_password) { $Script:RegRuPassword = $config.regru_password }
|
||||
if ($null -ne $config.wildcard) { $Script:Wildcard = $config.wildcard }
|
||||
|
||||
Write-Log "Конфигурация успешно загружена" "SUCCESS"
|
||||
return $true
|
||||
}
|
||||
catch {
|
||||
Write-Log "Ошибка при загрузке конфигурации: $_" "ERROR"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
else {
|
||||
Write-Log "Файл конфигурации не найден: $ConfigPath" "WARNING"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
function Create-SampleConfig {
|
||||
param([string]$OutputPath = ".\config.json")
|
||||
|
||||
$sampleConfig = @{
|
||||
regru_username = "your_username"
|
||||
regru_password = "your_password"
|
||||
domain = "dfv24.com"
|
||||
wildcard = $true
|
||||
email = "admin@dfv24.com"
|
||||
dns_propagation_wait = 60
|
||||
dns_check_attempts = 10
|
||||
dns_check_interval = 10
|
||||
}
|
||||
|
||||
$sampleConfig | ConvertTo-Json -Depth 10 | Set-Content -Path $OutputPath
|
||||
Write-Log "Пример конфигурации создан: $OutputPath" "SUCCESS"
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# ФУНКЦИИ РАБОТЫ С REG.RU API
|
||||
# ============================================================================
|
||||
|
||||
function Invoke-RegRuApi {
|
||||
param(
|
||||
[string]$Method,
|
||||
[hashtable]$Params
|
||||
)
|
||||
|
||||
$url = "$($Script:Config.RegRuApiUrl)/$Method"
|
||||
|
||||
# Добавляем учетные данные
|
||||
$Params["username"] = $Script:RegRuUsername
|
||||
$Params["password"] = $Script:RegRuPassword
|
||||
$Params["output_format"] = "json"
|
||||
|
||||
Write-Log "Отправка запроса к API: $Method" "DEBUG"
|
||||
|
||||
try {
|
||||
$response = Invoke-RestMethod -Uri $url -Method Post -Body $Params -ContentType "application/x-www-form-urlencoded"
|
||||
|
||||
if ($response.result -eq "success") {
|
||||
Write-Log "Запрос $Method выполнен успешно" "DEBUG"
|
||||
return $response
|
||||
}
|
||||
else {
|
||||
$errorMsg = if ($response.error_text) { $response.error_text } else { "Неизвестная ошибка" }
|
||||
Write-Log "Ошибка API: $errorMsg" "ERROR"
|
||||
throw "API Error: $errorMsg"
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Log "Ошибка HTTP запроса: $_" "ERROR"
|
||||
throw
|
||||
}
|
||||
}
|
||||
|
||||
function Get-DnsRecords {
|
||||
param([string]$Domain)
|
||||
|
||||
Write-Log "Получение DNS записей для домена: $Domain"
|
||||
|
||||
$params = @{
|
||||
domain = $Domain
|
||||
}
|
||||
|
||||
$response = Invoke-RegRuApi -Method "zone/get_resource_records" -Params $params
|
||||
|
||||
if ($response.answer -and $response.answer.records) {
|
||||
$records = $response.answer.records
|
||||
Write-Log "Получено $($records.Count) DNS записей"
|
||||
return $records
|
||||
}
|
||||
else {
|
||||
Write-Log "DNS записи не найдены" "WARNING"
|
||||
return @()
|
||||
}
|
||||
}
|
||||
|
||||
function Add-TxtRecord {
|
||||
param(
|
||||
[string]$Domain,
|
||||
[string]$Subdomain,
|
||||
[string]$TxtValue
|
||||
)
|
||||
|
||||
Write-Log "Добавление TXT записи: $Subdomain.$Domain = $TxtValue"
|
||||
|
||||
$params = @{
|
||||
domain = $Domain
|
||||
subdomain = $Subdomain
|
||||
text = $TxtValue
|
||||
output_content_type = "plain"
|
||||
}
|
||||
|
||||
try {
|
||||
$null = Invoke-RegRuApi -Method "zone/add_txt" -Params $params
|
||||
Write-Log "TXT запись успешно добавлена" "SUCCESS"
|
||||
return $true
|
||||
}
|
||||
catch {
|
||||
Write-Log "Не удалось добавить TXT запись: $_" "ERROR"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
function Remove-TxtRecord {
|
||||
param(
|
||||
[string]$Domain,
|
||||
[string]$Subdomain,
|
||||
[string]$TxtValue
|
||||
)
|
||||
|
||||
Write-Log "Удаление TXT записи: $Subdomain.$Domain"
|
||||
|
||||
# Получаем список записей
|
||||
$records = Get-DnsRecords -Domain $Domain
|
||||
|
||||
# Ищем нужную TXT запись
|
||||
$record = $records | Where-Object {
|
||||
$_.rectype -eq "TXT" -and
|
||||
$_.subdomain -eq $Subdomain -and
|
||||
$_.text -eq $TxtValue
|
||||
} | Select-Object -First 1
|
||||
|
||||
if (-not $record) {
|
||||
Write-Log "TXT запись для удаления не найдена" "WARNING"
|
||||
return $false
|
||||
}
|
||||
|
||||
$params = @{
|
||||
domain = $Domain
|
||||
record_id = $record.id
|
||||
}
|
||||
|
||||
try {
|
||||
$null = Invoke-RegRuApi -Method "zone/remove_record" -Params $params
|
||||
Write-Log "TXT запись успешно удалена" "SUCCESS"
|
||||
return $true
|
||||
}
|
||||
catch {
|
||||
Write-Log "Не удалось удалить TXT запись: $_" "ERROR"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# ФУНКЦИИ РАБОТЫ С CERTBOT
|
||||
# ============================================================================
|
||||
|
||||
function Test-CertbotInstalled {
|
||||
try {
|
||||
$version = & certbot --version 2>&1
|
||||
Write-Log "Certbot установлен: $version"
|
||||
return $true
|
||||
}
|
||||
catch {
|
||||
Write-Log "Certbot не установлен!" "ERROR"
|
||||
Write-Log "Установите Certbot: https://certbot.eff.org/instructions" "ERROR"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
function Get-CertificateExpiry {
|
||||
param([string]$Domain)
|
||||
|
||||
$certPath = Join-Path $env:ProgramData "letsencrypt\live\$Domain\cert.pem"
|
||||
|
||||
if (-not (Test-Path $certPath)) {
|
||||
Write-Log "Сертификат не найден: $certPath"
|
||||
return $null
|
||||
}
|
||||
|
||||
try {
|
||||
# Используем openssl для проверки сертификата
|
||||
$expiryText = & openssl x509 -enddate -noout -in $certPath 2>&1
|
||||
|
||||
if ($expiryText -match "notAfter=(.+)") {
|
||||
$expiryDate = [DateTime]::Parse($matches[1])
|
||||
$daysLeft = ($expiryDate - (Get-Date)).Days
|
||||
|
||||
Write-Log "Сертификат истекает: $($expiryDate.ToString('yyyy-MM-dd'))"
|
||||
Write-Log "Осталось дней: $daysLeft"
|
||||
|
||||
return $daysLeft
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Log "Ошибка при проверке сертификата: $_" "ERROR"
|
||||
}
|
||||
|
||||
return $null
|
||||
}
|
||||
|
||||
function Invoke-DnsChallenge {
|
||||
param(
|
||||
[string]$Domain,
|
||||
[string]$ValidationToken
|
||||
)
|
||||
|
||||
Write-Log "=== DNS Challenge: Добавление TXT записи ===" "INFO"
|
||||
|
||||
# Извлекаем поддомен
|
||||
$subdomain = "_acme-challenge"
|
||||
|
||||
# Добавляем TXT запись
|
||||
$success = Add-TxtRecord -Domain $Script:Domain -Subdomain $subdomain -TxtValue $ValidationToken
|
||||
|
||||
if ($success) {
|
||||
# Ждем распространения DNS
|
||||
$waitTime = $Script:Config.DnsPropagationWait
|
||||
Write-Log "Ожидание распространения DNS ($waitTime секунд)..."
|
||||
Start-Sleep -Seconds $waitTime
|
||||
|
||||
Write-Log "DNS валидация готова" "SUCCESS"
|
||||
return $true
|
||||
}
|
||||
|
||||
return $false
|
||||
}
|
||||
|
||||
function Invoke-DnsCleanup {
|
||||
param(
|
||||
[string]$Domain,
|
||||
[string]$ValidationToken
|
||||
)
|
||||
|
||||
Write-Log "=== DNS Challenge: Удаление TXT записи ===" "INFO"
|
||||
|
||||
$subdomain = "_acme-challenge"
|
||||
|
||||
return Remove-TxtRecord -Domain $Script:Domain -Subdomain $subdomain -TxtValue $ValidationToken
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# ГЛАВНЫЕ ФУНКЦИИ
|
||||
# ============================================================================
|
||||
|
||||
function Get-Certificate {
|
||||
param([string]$Domain, [bool]$WildcardCert)
|
||||
|
||||
Write-Log "=== Запрос нового SSL сертификата ===" "INFO"
|
||||
|
||||
# Формируем список доменов
|
||||
$domains = @($Domain)
|
||||
if ($WildcardCert) {
|
||||
$domains += "*.$Domain"
|
||||
}
|
||||
|
||||
$domainArgs = @()
|
||||
foreach ($d in $domains) {
|
||||
$domainArgs += "-d"
|
||||
$domainArgs += $d
|
||||
}
|
||||
|
||||
Write-Log "Домены для сертификата: $($domains -join ', ')"
|
||||
|
||||
# Создаем временные скрипты для хуков
|
||||
$authHookScript = Join-Path $env:TEMP "certbot_auth_hook.ps1"
|
||||
$cleanupHookScript = Join-Path $env:TEMP "certbot_cleanup_hook.ps1"
|
||||
|
||||
# Скрипт для аутентификации
|
||||
@"
|
||||
param([string]`$Domain, [string]`$Token)
|
||||
# Вызов функции добавления TXT записи
|
||||
# Здесь должна быть логика работы с API reg.ru
|
||||
"@ | Set-Content -Path $authHookScript
|
||||
|
||||
# Скрипт для очистки
|
||||
@"
|
||||
param([string]`$Domain, [string]`$Token)
|
||||
# Вызов функции удаления TXT записи
|
||||
"@ | Set-Content -Path $cleanupHookScript
|
||||
|
||||
Write-Log "Примечание: Для полной автоматизации используйте Linux версию скрипта" "WARNING"
|
||||
Write-Log "На Windows рекомендуется использовать плагин certbot-dns-регru или выполнить вручную" "WARNING"
|
||||
|
||||
# Команда certbot (базовая, требует ручной DNS валидации)
|
||||
$certbotArgs = @(
|
||||
"certonly",
|
||||
"--manual",
|
||||
"--preferred-challenges", "dns",
|
||||
"--email", $Script:Email,
|
||||
"--agree-tos",
|
||||
"--manual-public-ip-logging-ok"
|
||||
) + $domainArgs
|
||||
|
||||
Write-Log "Запуск certbot..."
|
||||
Write-Log "ВАЖНО: Certbot запросит вас добавить TXT записи в DNS" "WARNING"
|
||||
Write-Log "Используйте API reg.ru или добавьте записи вручную через панель управления" "WARNING"
|
||||
|
||||
try {
|
||||
& certbot @certbotArgs
|
||||
|
||||
Write-Log "Процесс получения сертификата завершен" "SUCCESS"
|
||||
return $true
|
||||
}
|
||||
catch {
|
||||
Write-Log "Ошибка при получении сертификата: $_" "ERROR"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
function Update-Certificate {
|
||||
Write-Log "=== Обновление SSL сертификата ===" "INFO"
|
||||
|
||||
try {
|
||||
& certbot renew
|
||||
|
||||
Write-Log "Проверка обновления завершена" "SUCCESS"
|
||||
return $true
|
||||
}
|
||||
catch {
|
||||
Write-Log "Ошибка при обновлении: $_" "ERROR"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
function Show-CertificateInfo {
|
||||
param([string]$Domain)
|
||||
|
||||
$certPath = Join-Path $env:ProgramData "letsencrypt\live\$Domain\cert.pem"
|
||||
|
||||
if (-not (Test-Path $certPath)) {
|
||||
Write-Log "Сертификат не найден" "WARNING"
|
||||
return
|
||||
}
|
||||
|
||||
Write-Log ("=" * 60)
|
||||
Write-Log "ИНФОРМАЦИЯ О СЕРТИФИКАТЕ"
|
||||
Write-Log ("=" * 60)
|
||||
|
||||
try {
|
||||
$certInfo = & openssl x509 -in $certPath -text -noout
|
||||
|
||||
# Выводим основную информацию
|
||||
$certInfo -split "`n" | Where-Object {
|
||||
$_ -match "Subject:|Issuer:|Not Before|Not After|DNS:"
|
||||
} | ForEach-Object {
|
||||
Write-Log $_.Trim()
|
||||
}
|
||||
|
||||
Write-Log ("=" * 60)
|
||||
Write-Log "ПУТИ К ФАЙЛАМ СЕРТИФИКАТА:"
|
||||
Write-Log " Сертификат: $certPath"
|
||||
Write-Log " Приватный ключ: $(Join-Path $env:ProgramData "letsencrypt\live\$Domain\privkey.pem")"
|
||||
Write-Log " Цепочка: $(Join-Path $env:ProgramData "letsencrypt\live\$Domain\chain.pem")"
|
||||
Write-Log " Полная цепочка: $(Join-Path $env:ProgramData "letsencrypt\live\$Domain\fullchain.pem")"
|
||||
Write-Log ("=" * 60)
|
||||
}
|
||||
catch {
|
||||
Write-Log "Ошибка при чтении сертификата: $_" "ERROR"
|
||||
}
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# ОСНОВНАЯ ЛОГИКА
|
||||
# ============================================================================
|
||||
|
||||
function Main {
|
||||
Write-Log ("=" * 60)
|
||||
Write-Log "СКРИПТ УПРАВЛЕНИЯ SSL СЕРТИФИКАТАМИ LET'S ENCRYPT"
|
||||
Write-Log ("=" * 60)
|
||||
|
||||
# Проверка прав администратора
|
||||
$currentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
|
||||
$principal = New-Object Security.Principal.WindowsPrincipal($currentUser)
|
||||
$isAdmin = $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
|
||||
|
||||
if (-not $isAdmin) {
|
||||
Write-Log "ПРЕДУПРЕЖДЕНИЕ: Скрипт запущен без прав администратора" "WARNING"
|
||||
Write-Log "Некоторые операции могут потребовать повышенных прав" "WARNING"
|
||||
}
|
||||
|
||||
# Загрузка конфигурации
|
||||
if ($ConfigFile -and (Test-Path $ConfigFile)) {
|
||||
Load-Configuration -ConfigPath $ConfigFile
|
||||
}
|
||||
|
||||
# Проверка обязательных параметров
|
||||
if (-not $Script:RegRuUsername -or -not $Script:RegRuPassword) {
|
||||
Write-Log "ОШИБКА: Не указаны учетные данные reg.ru" "ERROR"
|
||||
Write-Log "Укажите RegRuUsername и RegRuPassword или создайте файл конфигурации" "ERROR"
|
||||
return
|
||||
}
|
||||
|
||||
# Проверка Certbot
|
||||
if (-not (Test-CertbotInstalled)) {
|
||||
Write-Log "Установите Certbot и повторите попытку" "ERROR"
|
||||
return
|
||||
}
|
||||
|
||||
# Проверка срока действия сертификата
|
||||
$daysLeft = Get-CertificateExpiry -Domain $Script:Domain
|
||||
|
||||
if ($null -eq $daysLeft) {
|
||||
Write-Log "Сертификат не найден. Требуется создание нового." "INFO"
|
||||
$success = Get-Certificate -Domain $Script:Domain -WildcardCert $Script:Wildcard
|
||||
}
|
||||
elseif ($daysLeft -lt 30) {
|
||||
Write-Log "Сертификат истекает через $daysLeft дней. Требуется обновление!" "WARNING"
|
||||
$success = Update-Certificate
|
||||
}
|
||||
else {
|
||||
Write-Log "Сертификат действителен ($daysLeft дней)" "SUCCESS"
|
||||
$success = $true
|
||||
}
|
||||
|
||||
if ($success) {
|
||||
Show-CertificateInfo -Domain $Script:Domain
|
||||
}
|
||||
|
||||
Write-Log ("=" * 60)
|
||||
Write-Log "Скрипт завершен"
|
||||
Write-Log ("=" * 60)
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# ТОЧКА ВХОДА
|
||||
# ============================================================================
|
||||
|
||||
# Запуск основной функции
|
||||
Main
|
||||
@@ -0,0 +1,695 @@
|
||||
#!/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)"
|
||||
local github_raw_url="https://raw.githubusercontent.com/DFofanov/configure_nginx_manager/refs/heads/master"
|
||||
|
||||
msg_info "Установка основного скрипта..."
|
||||
|
||||
# Проверяем наличие файла в текущей директории
|
||||
if [ -f "${script_dir}/letsencrypt_regru_api.py" ]; then
|
||||
msg_info "Файл найден локально, копируем из ${script_dir}"
|
||||
cp "${script_dir}/letsencrypt_regru_api.py" "${APP_DIR}/"
|
||||
chmod 755 "${APP_DIR}/letsencrypt_regru_api.py"
|
||||
msg_ok "Файл скопирован из локальной директории"
|
||||
else
|
||||
msg_warn "Файл letsencrypt_regru_api.py не найден локально"
|
||||
msg_info "Скачивание с GitHub..."
|
||||
|
||||
if command -v curl &> /dev/null; then
|
||||
if curl -fsSL "${github_raw_url}/letsencrypt_regru_api.py" -o "${APP_DIR}/letsencrypt_regru_api.py"; then
|
||||
chmod 755 "${APP_DIR}/letsencrypt_regru_api.py"
|
||||
msg_ok "Файл успешно скачан с GitHub"
|
||||
else
|
||||
msg_error "Не удалось скачать файл с GitHub"
|
||||
msg_info "URL: ${github_raw_url}/letsencrypt_regru_api.py"
|
||||
exit 1
|
||||
fi
|
||||
elif command -v wget &> /dev/null; then
|
||||
if wget -q "${github_raw_url}/letsencrypt_regru_api.py" -O "${APP_DIR}/letsencrypt_regru_api.py"; then
|
||||
chmod 755 "${APP_DIR}/letsencrypt_regru_api.py"
|
||||
msg_ok "Файл успешно скачан с GitHub (wget)"
|
||||
else
|
||||
msg_error "Не удалось скачать файл с GitHub"
|
||||
msg_info "URL: ${github_raw_url}/letsencrypt_regru_api.py"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
msg_error "Не установлены curl или wget для скачивания файлов"
|
||||
msg_info "Установите один из них: sudo apt-get install curl"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
msg_info "Установка дополнительных файлов..."
|
||||
|
||||
# config.json.example
|
||||
if [ -f "${script_dir}/config.json.example" ]; then
|
||||
cp "${script_dir}/config.json.example" "${CONFIG_DIR}/"
|
||||
msg_ok "Пример конфигурации скопирован"
|
||||
else
|
||||
msg_info "Скачивание config.json.example с GitHub..."
|
||||
if command -v curl &> /dev/null; then
|
||||
curl -fsSL "${github_raw_url}/config.json.example" -o "${CONFIG_DIR}/config.json.example" 2>/dev/null && \
|
||||
msg_ok "config.json.example скачан с GitHub" || \
|
||||
msg_warn "Не удалось скачать config.json.example"
|
||||
fi
|
||||
fi
|
||||
|
||||
# README.md
|
||||
if [ -f "${script_dir}/README.md" ]; then
|
||||
cp "${script_dir}/README.md" "${APP_DIR}/"
|
||||
msg_ok "README.md скопирован"
|
||||
else
|
||||
msg_info "Скачивание README.md с GitHub..."
|
||||
if command -v curl &> /dev/null; then
|
||||
curl -fsSL "${github_raw_url}/README.md" -o "${APP_DIR}/README.md" 2>/dev/null && \
|
||||
msg_ok "README.md скачан с GitHub" || \
|
||||
msg_warn "Не удалось скачать README.md"
|
||||
fi
|
||||
fi
|
||||
|
||||
msg_info "Установка systemd файлов..."
|
||||
|
||||
# Systemd service
|
||||
if [ -f "${script_dir}/systemd/letsencrypt-regru.service" ]; then
|
||||
cp "${script_dir}/systemd/letsencrypt-regru.service" "/etc/systemd/system/"
|
||||
msg_ok "Service файл скопирован"
|
||||
else
|
||||
msg_info "Скачивание letsencrypt-regru.service с GitHub..."
|
||||
if command -v curl &> /dev/null; then
|
||||
curl -fsSL "${github_raw_url}/systemd/letsencrypt-regru.service" -o "/etc/systemd/system/letsencrypt-regru.service" 2>/dev/null && \
|
||||
msg_ok "Service файл скачан с GitHub" || \
|
||||
msg_warn "Не удалось скачать service файл, будет создан автоматически"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Systemd timer
|
||||
if [ -f "${script_dir}/systemd/letsencrypt-regru.timer" ]; then
|
||||
cp "${script_dir}/systemd/letsencrypt-regru.timer" "/etc/systemd/system/"
|
||||
msg_ok "Timer файл скопирован"
|
||||
else
|
||||
msg_info "Скачивание letsencrypt-regru.timer с GitHub..."
|
||||
if command -v curl &> /dev/null; then
|
||||
curl -fsSL "${github_raw_url}/systemd/letsencrypt-regru.timer" -o "/etc/systemd/system/letsencrypt-regru.timer" 2>/dev/null && \
|
||||
msg_ok "Timer файл скачан с GitHub" || \
|
||||
msg_warn "Не удалось скачать timer файл, будет создан автоматически"
|
||||
fi
|
||||
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://10.10.10.14:81"
|
||||
npm_email="admin@example.com"
|
||||
npm_password="changeme"
|
||||
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
npm_enabled="true"
|
||||
read -p "Введите адрес NPM (например, http://10.10.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 # Получить новый production сертификат"
|
||||
echo " • letsencrypt-regru --renew # Обновить существующий сертификат"
|
||||
echo " • letsencrypt-regru --auto # Автоматическая проверка и обновление"
|
||||
echo ""
|
||||
echo "🧪 Команды тестирования:"
|
||||
echo " • letsencrypt-regru --staging # Тестовый Let's Encrypt (БЕЗ лимитов!)"
|
||||
echo " • letsencrypt-regru --test-cert # Самоподписанный (локальная разработка)"
|
||||
echo " • letsencrypt-regru --test-api # Проверить доступ к API reg.ru"
|
||||
echo " • letsencrypt-regru --test-dns # Протестировать DNS записи"
|
||||
echo ""
|
||||
echo "📋 Дополнительные команды:"
|
||||
echo " • letsencrypt-regru --help # Показать полную справку"
|
||||
echo " • letsencrypt-regru --obtain -v # Подробный вывод (verbose)"
|
||||
echo ""
|
||||
echo "💡 Рекомендуемый workflow:"
|
||||
echo " 1. letsencrypt-regru --test-api # Проверить API"
|
||||
echo " 2. letsencrypt-regru --test-dns # Проверить DNS"
|
||||
echo " 3. letsencrypt-regru --staging # Тестовый сертификат (сколько угодно раз)"
|
||||
echo " 4. letsencrypt-regru --obtain # Production сертификат"
|
||||
echo ""
|
||||
echo "⏰ Автоматическое обновление:"
|
||||
echo " • Сервис запускается каждые 12 часов"
|
||||
echo " • Управление: systemctl status letsencrypt-regru.timer"
|
||||
echo ""
|
||||
echo "<22> Просмотр логов:"
|
||||
echo " • journalctl -u letsencrypt-regru -f # Системные логи (реальное время)"
|
||||
echo " • tail -f ${LOG_DIR}/letsencrypt_regru.log # Файл логов"
|
||||
echo ""
|
||||
echo "<22>📖 Документация:"
|
||||
echo " • README: ${APP_DIR}/README.md"
|
||||
echo " • GitHub: https://github.com/DFofanov/configure_nginx_manager"
|
||||
echo ""
|
||||
|
||||
echo "🔍 Сравнение режимов тестирования:"
|
||||
echo ""
|
||||
echo " --staging (рекомендуется для тестирования):"
|
||||
echo " ✅ Полный процесс Let's Encrypt"
|
||||
echo " ✅ Тестирует DNS и автоматизацию"
|
||||
echo " ✅ БЕЗ лимитов (неограниченно)"
|
||||
echo " ⚠️ Браузеры не доверяют (staging CA)"
|
||||
echo " ⏱ ~2-3 минуты"
|
||||
echo ""
|
||||
echo " --test-cert (для локальной разработки):"
|
||||
echo " ✅ Мгновенное создание (~1 сек)"
|
||||
echo " ✅ Работает без интернета"
|
||||
echo " ❌ НЕ тестирует DNS/автоматизацию"
|
||||
echo " ⚠️ Браузеры не доверяют (самоподпись)"
|
||||
echo ""
|
||||
echo " --test-dns (проверка DNS):"
|
||||
echo " ✅ Тестирует только DNS"
|
||||
echo " ✅ Не создает сертификат"
|
||||
echo " ⏱ ~1-2 минуты"
|
||||
echo ""
|
||||
|
||||
if grep -q '"npm_enabled": true' "${CONFIG_DIR}/config.json" 2>/dev/null; then
|
||||
echo "🔗 Интеграция с Nginx Proxy Manager: ВКЛЮЧЕНА"
|
||||
echo " Production сертификаты будут автоматически синхронизироваться с NPM"
|
||||
echo " (Staging и test-cert сертификаты НЕ загружаются в NPM)"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
msg_warn "ВАЖНО: Отредактируйте конфигурацию при необходимости:"
|
||||
echo " nano ${CONFIG_DIR}/config.json"
|
||||
echo ""
|
||||
echo "🎉 Готово к использованию! Начните с команды:"
|
||||
echo " letsencrypt-regru --test-api"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# Функция обновления
|
||||
update_application() {
|
||||
header "Обновление приложения"
|
||||
|
||||
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
|
||||
local github_raw_url="https://raw.githubusercontent.com/DFofanov/configure_nginx_manager/refs/heads/master"
|
||||
|
||||
msg_info "Остановка сервиса..."
|
||||
systemctl stop letsencrypt-regru.timer || true
|
||||
|
||||
msg_info "Обновление файлов..."
|
||||
|
||||
# Попытка скопировать локально или скачать с GitHub
|
||||
if [ -n "${script_dir}" ] && [ -f "${script_dir}/letsencrypt_regru_api.py" ]; then
|
||||
msg_info "Копирование из локальной директории..."
|
||||
cp "${script_dir}/letsencrypt_regru_api.py" "${APP_DIR}/"
|
||||
chmod 755 "${APP_DIR}/letsencrypt_regru_api.py"
|
||||
msg_ok "Файл скопирован локально"
|
||||
else
|
||||
msg_info "Скачивание обновления с GitHub..."
|
||||
if command -v curl &> /dev/null; then
|
||||
if curl -fsSL "${github_raw_url}/letsencrypt_regru_api.py" -o "${APP_DIR}/letsencrypt_regru_api.py"; then
|
||||
chmod 755 "${APP_DIR}/letsencrypt_regru_api.py"
|
||||
msg_ok "Файл успешно скачан с GitHub"
|
||||
else
|
||||
msg_error "Не удалось скачать файл с GitHub"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
msg_error "Не установлен curl для скачивания файлов"
|
||||
msg_info "Установите: sudo apt-get install curl"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
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 "ВНИМАНИЕ: Это удалит следующие компоненты:"
|
||||
echo " • Приложение: ${APP_DIR}"
|
||||
echo " • Systemd сервисы: /etc/systemd/system/letsencrypt-regru.*"
|
||||
echo " • Команда: /usr/local/bin/letsencrypt-regru"
|
||||
echo ""
|
||||
msg_info "Будут сохранены:"
|
||||
echo " • Сертификаты: ${CERT_DIR}"
|
||||
echo " • Конфигурация: ${CONFIG_DIR}/config.json (можно удалить отдельно)"
|
||||
echo " • Логи: ${LOG_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 stop letsencrypt-regru.service || true
|
||||
systemctl disable letsencrypt-regru.timer || true
|
||||
systemctl disable letsencrypt-regru.service || 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_ok "Приложение удалено"
|
||||
echo ""
|
||||
|
||||
# Опционально удаляем конфигурацию
|
||||
if [ -d "$CONFIG_DIR" ]; then
|
||||
msg_warn "Удалить конфигурацию?"
|
||||
echo " Путь: ${CONFIG_DIR}/config.json"
|
||||
read -p "Удалить конфигурацию? (y/N): " -n 1 -r
|
||||
echo ""
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
rm -rf "$CONFIG_DIR"
|
||||
msg_ok "Конфигурация удалена"
|
||||
else
|
||||
msg_info "Конфигурация сохранена: ${CONFIG_DIR}/config.json"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Опционально удаляем логи
|
||||
if [ -d "$LOG_DIR" ]; then
|
||||
msg_warn "Удалить логи?"
|
||||
echo " Путь: ${LOG_DIR}"
|
||||
read -p "Удалить логи? (y/N): " -n 1 -r
|
||||
echo ""
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
rm -rf "$LOG_DIR"
|
||||
msg_ok "Логи удалены"
|
||||
else
|
||||
msg_info "Логи сохранены: ${LOG_DIR}"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
msg_ok "Удаление завершено!"
|
||||
msg_info "Сертификаты сохранены в: ${CERT_DIR}"
|
||||
}
|
||||
|
||||
# ==============================================================================
|
||||
# Основная логика
|
||||
# ==============================================================================
|
||||
|
||||
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 "${@}"
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,290 @@
|
||||
#!/bin/bash
|
||||
|
||||
###############################################################################
|
||||
# Скрипт для создания и обновления SSL сертификата Let's Encrypt
|
||||
# с использованием DNS-валидации через API reg.ru
|
||||
#
|
||||
# Автор: Фофанов Дмитрий
|
||||
# Дата: 27.10.2025
|
||||
# Описание: Автоматизация получения wildcard сертификата через Certbot
|
||||
# с использованием DNS-01 challenge и API reg.ru
|
||||
###############################################################################
|
||||
|
||||
# ==============================================================================
|
||||
# КОНФИГУРАЦИЯ
|
||||
# ==============================================================================
|
||||
|
||||
# Учетные данные API reg.ru (получить на https://www.reg.ru/user/account/)
|
||||
REGRU_USERNAME="your_username" # Имя пользователя reg.ru
|
||||
REGRU_PASSWORD="your_password" # Пароль от аккаунта reg.ru
|
||||
|
||||
# Параметры домена и сертификата
|
||||
DOMAIN="dfv24.com" # Основной домен
|
||||
WILDCARD_DOMAIN="*.dfv24.com" # Wildcard домен
|
||||
EMAIL="admin@dfv24.com" # Email для уведомлений Let's Encrypt
|
||||
|
||||
# Директории для хранения сертификатов
|
||||
CERT_DIR="/etc/letsencrypt/live/$DOMAIN"
|
||||
CREDENTIALS_DIR="/etc/letsencrypt/credentials"
|
||||
CREDENTIALS_FILE="$CREDENTIALS_DIR/regru.ini"
|
||||
|
||||
# Логирование
|
||||
LOG_FILE="/var/log/letsencrypt_regru.log"
|
||||
TIMESTAMP=$(date '+%d.%m.%Y %H:%M:%S')
|
||||
|
||||
# ==============================================================================
|
||||
# ФУНКЦИИ
|
||||
# ==============================================================================
|
||||
|
||||
# Логирование сообщений
|
||||
log() {
|
||||
echo "[$TIMESTAMP] $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
# Проверка установки необходимых пакетов
|
||||
check_dependencies() {
|
||||
log "Проверка зависимостей..."
|
||||
|
||||
# Проверка certbot
|
||||
if ! command -v certbot &> /dev/null; then
|
||||
log "ОШИБКА: certbot не установлен. Установите: apt-get install certbot"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Проверка curl
|
||||
if ! command -v curl &> /dev/null; then
|
||||
log "ОШИБКА: curl не установлен. Установите: apt-get install curl"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Проверка jq для обработки JSON
|
||||
if ! command -v jq &> /dev/null; then
|
||||
log "ОШИБКА: jq не установлен. Установите: apt-get install jq"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "Все зависимости установлены"
|
||||
}
|
||||
|
||||
# Создание директории для credentials
|
||||
setup_credentials_dir() {
|
||||
log "Настройка директории для учетных данных..."
|
||||
|
||||
if [ ! -d "$CREDENTIALS_DIR" ]; then
|
||||
mkdir -p "$CREDENTIALS_DIR"
|
||||
chmod 700 "$CREDENTIALS_DIR"
|
||||
fi
|
||||
}
|
||||
|
||||
# Создание файла с учетными данными для certbot-dns-regru
|
||||
create_credentials_file() {
|
||||
log "Создание файла с учетными данными reg.ru..."
|
||||
|
||||
cat > "$CREDENTIALS_FILE" <<EOF
|
||||
# Учетные данные API reg.ru для DNS-валидации
|
||||
dns_regru_username = $REGRU_USERNAME
|
||||
dns_regru_password = $REGRU_PASSWORD
|
||||
EOF
|
||||
|
||||
chmod 600 "$CREDENTIALS_FILE"
|
||||
log "Файл учетных данных создан: $CREDENTIALS_FILE"
|
||||
}
|
||||
|
||||
# Установка плагина certbot-dns-regru (если еще не установлен)
|
||||
install_certbot_plugin() {
|
||||
log "Проверка плагина certbot-dns-regru..."
|
||||
|
||||
if ! pip3 list | grep -q certbot-dns-regru; then
|
||||
log "Установка certbot-dns-regru..."
|
||||
pip3 install certbot-dns-regru
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
log "Плагин certbot-dns-regru успешно установлен"
|
||||
else
|
||||
log "ОШИБКА: Не удалось установить certbot-dns-regru"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
log "Плагин certbot-dns-regru уже установлен"
|
||||
fi
|
||||
}
|
||||
|
||||
# Получение нового сертификата
|
||||
obtain_certificate() {
|
||||
log "Запрос нового SSL сертификата для домена: $DOMAIN и $WILDCARD_DOMAIN"
|
||||
|
||||
certbot certonly \
|
||||
--dns-regru \
|
||||
--dns-regru-credentials "$CREDENTIALS_FILE" \
|
||||
--dns-regru-propagation-seconds 60 \
|
||||
-d "$DOMAIN" \
|
||||
-d "$WILDCARD_DOMAIN" \
|
||||
--email "$EMAIL" \
|
||||
--agree-tos \
|
||||
--non-interactive \
|
||||
--preferred-challenges dns-01
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
log "Сертификат успешно получен!"
|
||||
log "Путь к сертификатам: $CERT_DIR"
|
||||
return 0
|
||||
else
|
||||
log "ОШИБКА: Не удалось получить сертификат"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Обновление существующего сертификата
|
||||
renew_certificate() {
|
||||
log "Проверка и обновление существующих сертификатов..."
|
||||
|
||||
certbot renew \
|
||||
--dns-regru \
|
||||
--dns-regru-credentials "$CREDENTIALS_FILE" \
|
||||
--dns-regru-propagation-seconds 60 \
|
||||
--non-interactive
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
log "Проверка обновления завершена успешно"
|
||||
return 0
|
||||
else
|
||||
log "ОШИБКА: Проблема при обновлении сертификата"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Проверка срока действия сертификата
|
||||
check_certificate_expiry() {
|
||||
log "Проверка срока действия сертификата..."
|
||||
|
||||
if [ -f "$CERT_DIR/cert.pem" ]; then
|
||||
EXPIRY_DATE=$(openssl x509 -enddate -noout -in "$CERT_DIR/cert.pem" | cut -d= -f2)
|
||||
EXPIRY_EPOCH=$(date -d "$EXPIRY_DATE" +%s)
|
||||
CURRENT_EPOCH=$(date +%s)
|
||||
DAYS_LEFT=$(( ($EXPIRY_EPOCH - $CURRENT_EPOCH) / 86400 ))
|
||||
|
||||
log "Сертификат истекает: $EXPIRY_DATE (осталось дней: $DAYS_LEFT)"
|
||||
|
||||
if [ $DAYS_LEFT -lt 30 ]; then
|
||||
log "ВНИМАНИЕ: Сертификат истекает менее чем через 30 дней. Требуется обновление!"
|
||||
return 1
|
||||
else
|
||||
log "Сертификат действителен"
|
||||
return 0
|
||||
fi
|
||||
else
|
||||
log "Сертификат не найден. Требуется создание нового сертификата."
|
||||
return 2
|
||||
fi
|
||||
}
|
||||
|
||||
# Перезагрузка веб-сервера (Nginx/Apache)
|
||||
reload_webserver() {
|
||||
log "Перезагрузка веб-сервера..."
|
||||
|
||||
# Определяем, какой веб-сервер используется
|
||||
if systemctl is-active --quiet nginx; then
|
||||
systemctl reload nginx
|
||||
log "Nginx перезагружен"
|
||||
elif systemctl is-active --quiet apache2; then
|
||||
systemctl reload apache2
|
||||
log "Apache перезагружен"
|
||||
elif systemctl is-active --quiet httpd; then
|
||||
systemctl reload httpd
|
||||
log "Apache (httpd) перезагружен"
|
||||
else
|
||||
log "ВНИМАНИЕ: Веб-сервер не найден или не активен. Пропускаем перезагрузку."
|
||||
fi
|
||||
}
|
||||
|
||||
# Отправка уведомления (опционально)
|
||||
send_notification() {
|
||||
local MESSAGE=$1
|
||||
log "Уведомление: $MESSAGE"
|
||||
|
||||
# Здесь можно добавить отправку email, Telegram, Slack и т.д.
|
||||
# Пример: echo "$MESSAGE" | mail -s "SSL Certificate Update" admin@example.com
|
||||
}
|
||||
|
||||
# Вывод информации о сертификате
|
||||
display_certificate_info() {
|
||||
if [ -f "$CERT_DIR/cert.pem" ]; then
|
||||
log "=========================================="
|
||||
log "Информация о сертификате:"
|
||||
log "=========================================="
|
||||
openssl x509 -in "$CERT_DIR/cert.pem" -text -noout | grep -E "(Subject:|Issuer:|Not Before|Not After|DNS:)" | tee -a "$LOG_FILE"
|
||||
log "=========================================="
|
||||
log "Пути к файлам сертификата:"
|
||||
log " Сертификат: $CERT_DIR/cert.pem"
|
||||
log " Приватный ключ: $CERT_DIR/privkey.pem"
|
||||
log " Цепочка: $CERT_DIR/chain.pem"
|
||||
log " Полная цепочка: $CERT_DIR/fullchain.pem"
|
||||
log "=========================================="
|
||||
fi
|
||||
}
|
||||
|
||||
# ==============================================================================
|
||||
# ОСНОВНАЯ ЛОГИКА
|
||||
# ==============================================================================
|
||||
|
||||
main() {
|
||||
log "=========================================="
|
||||
log "Запуск скрипта управления SSL сертификатом"
|
||||
log "=========================================="
|
||||
|
||||
# Проверка, что скрипт запущен от root
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
log "ОШИБКА: Скрипт должен быть запущен от имени root (sudo)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Проверка зависимостей
|
||||
check_dependencies
|
||||
|
||||
# Настройка директории и файла учетных данных
|
||||
setup_credentials_dir
|
||||
create_credentials_file
|
||||
|
||||
# Установка плагина certbot-dns-regru
|
||||
install_certbot_plugin
|
||||
|
||||
# Проверка существования сертификата
|
||||
check_certificate_expiry
|
||||
CERT_STATUS=$?
|
||||
|
||||
if [ $CERT_STATUS -eq 2 ]; then
|
||||
# Сертификат не существует - создаем новый
|
||||
obtain_certificate
|
||||
if [ $? -eq 0 ]; then
|
||||
display_certificate_info
|
||||
reload_webserver
|
||||
send_notification "Новый SSL сертификат успешно создан для $DOMAIN"
|
||||
else
|
||||
send_notification "ОШИБКА: Не удалось создать SSL сертификат для $DOMAIN"
|
||||
exit 1
|
||||
fi
|
||||
elif [ $CERT_STATUS -eq 1 ]; then
|
||||
# Сертификат скоро истекает - обновляем
|
||||
renew_certificate
|
||||
if [ $? -eq 0 ]; then
|
||||
display_certificate_info
|
||||
reload_webserver
|
||||
send_notification "SSL сертификат успешно обновлен для $DOMAIN"
|
||||
else
|
||||
send_notification "ОШИБКА: Не удалось обновить SSL сертификат для $DOMAIN"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
# Сертификат действителен - только проверяем обновление
|
||||
log "Сертификат действителен. Выполняем проверку на наличие обновлений..."
|
||||
renew_certificate
|
||||
display_certificate_info
|
||||
fi
|
||||
|
||||
log "=========================================="
|
||||
log "Скрипт завершен успешно"
|
||||
log "=========================================="
|
||||
}
|
||||
|
||||
# Запуск основной функции
|
||||
main
|
||||
@@ -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}"
|
||||
@@ -0,0 +1,13 @@
|
||||
# Зависимости для Let's Encrypt RegRu Manager
|
||||
|
||||
# HTTP запросы к API
|
||||
requests>=2.25.0
|
||||
|
||||
# Работа с SSL сертификатами
|
||||
cryptography>=3.4.0
|
||||
|
||||
# Let's Encrypt клиент
|
||||
certbot>=1.12.0
|
||||
|
||||
# Опционально: для сборки исполняемых файлов
|
||||
pyinstaller>=4.10
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1,143 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ==============================================================================
|
||||
# Скрипт для быстрого создания тестового самоподписанного SSL сертификата
|
||||
# Использует: openssl (альтернатива Python скрипту)
|
||||
# ==============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
# Цвета
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Параметры по умолчанию
|
||||
DOMAIN="${1:-example.com}"
|
||||
WILDCARD="${2:-yes}"
|
||||
CERT_DIR="/etc/letsencrypt/live/${DOMAIN}"
|
||||
VALIDITY_DAYS=90
|
||||
|
||||
echo -e "${BLUE}╔════════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║ Создание тестового самоподписанного SSL сертификата ║${NC}"
|
||||
echo -e "${BLUE}╚════════════════════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}Параметры:${NC}"
|
||||
echo -e " Домен: ${GREEN}${DOMAIN}${NC}"
|
||||
echo -e " Wildcard: ${GREEN}${WILDCARD}${NC}"
|
||||
echo -e " Срок действия: ${GREEN}${VALIDITY_DAYS} дней${NC}"
|
||||
echo -e " Директория: ${GREEN}${CERT_DIR}${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}⚠️ ВНИМАНИЕ: Это тестовый сертификат для разработки!${NC}"
|
||||
echo -e "${YELLOW} Браузеры будут показывать предупреждение безопасности.${NC}"
|
||||
echo ""
|
||||
|
||||
# Проверка прав root
|
||||
if [ "$(id -u)" != "0" ]; then
|
||||
echo -e "${RED}✗ Требуются права root${NC}"
|
||||
echo -e "Запустите: sudo $0 $@"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Создание директории
|
||||
echo -e "${YELLOW}→ Создание директории...${NC}"
|
||||
mkdir -p "${CERT_DIR}"
|
||||
cd "${CERT_DIR}"
|
||||
|
||||
# Подготовка конфигурации для альтернативных имен (SAN)
|
||||
if [ "${WILDCARD}" = "yes" ]; then
|
||||
SAN="DNS:${DOMAIN},DNS:*.${DOMAIN}"
|
||||
else
|
||||
SAN="DNS:${DOMAIN}"
|
||||
fi
|
||||
|
||||
# Создание конфигурации OpenSSL
|
||||
cat > openssl.cnf <<EOF
|
||||
[req]
|
||||
default_bits = 2048
|
||||
prompt = no
|
||||
default_md = sha256
|
||||
distinguished_name = dn
|
||||
req_extensions = v3_req
|
||||
|
||||
[dn]
|
||||
C=RU
|
||||
ST=Moscow
|
||||
L=Moscow
|
||||
O=Test Certificate
|
||||
CN=${DOMAIN}
|
||||
|
||||
[v3_req]
|
||||
basicConstraints = CA:FALSE
|
||||
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
|
||||
extendedKeyUsage = serverAuth, clientAuth
|
||||
subjectAltName = ${SAN}
|
||||
EOF
|
||||
|
||||
# Генерация приватного ключа
|
||||
echo -e "${YELLOW}→ Генерация приватного ключа RSA 2048 бит...${NC}"
|
||||
openssl genrsa -out privkey.pem 2048 2>/dev/null
|
||||
chmod 600 privkey.pem
|
||||
echo -e "${GREEN}✓ Приватный ключ сохранен: ${CERT_DIR}/privkey.pem${NC}"
|
||||
|
||||
# Генерация сертификата
|
||||
echo -e "${YELLOW}→ Генерация самоподписанного сертификата...${NC}"
|
||||
openssl req \
|
||||
-new \
|
||||
-x509 \
|
||||
-key privkey.pem \
|
||||
-out cert.pem \
|
||||
-days ${VALIDITY_DAYS} \
|
||||
-config openssl.cnf \
|
||||
-extensions v3_req \
|
||||
2>/dev/null
|
||||
|
||||
echo -e "${GREEN}✓ Сертификат сохранен: ${CERT_DIR}/cert.pem${NC}"
|
||||
|
||||
# Создание fullchain (копия cert для самоподписанного)
|
||||
cp cert.pem fullchain.pem
|
||||
echo -e "${GREEN}✓ Fullchain сохранен: ${CERT_DIR}/fullchain.pem${NC}"
|
||||
|
||||
# Создание пустого chain.pem
|
||||
touch chain.pem
|
||||
echo -e "${GREEN}✓ Chain файл создан: ${CERT_DIR}/chain.pem${NC}"
|
||||
|
||||
# Удаление временного файла конфигурации
|
||||
rm -f openssl.cnf
|
||||
|
||||
echo ""
|
||||
echo -e "${BLUE}╔════════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║ Информация о сертификате ║${NC}"
|
||||
echo -e "${BLUE}╚════════════════════════════════════════════════════════════════╝${NC}"
|
||||
|
||||
# Вывод информации о сертификате
|
||||
openssl x509 -in cert.pem -noout -subject -dates -ext subjectAltName
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}╔════════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${GREEN}║ ✓ Тестовый сертификат успешно создан ║${NC}"
|
||||
echo -e "${GREEN}╚════════════════════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}📁 Файлы сертификата:${NC}"
|
||||
echo -e " • Приватный ключ: ${CERT_DIR}/privkey.pem"
|
||||
echo -e " • Сертификат: ${CERT_DIR}/cert.pem"
|
||||
echo -e " • Fullchain: ${CERT_DIR}/fullchain.pem"
|
||||
echo -e " • Chain: ${CERT_DIR}/chain.pem"
|
||||
echo ""
|
||||
echo -e "${YELLOW}⚠️ ВНИМАНИЕ:${NC}"
|
||||
echo -e " Это самоподписанный тестовый сертификат!"
|
||||
echo -e " Браузеры будут показывать предупреждение о безопасности."
|
||||
echo -e " Используйте ТОЛЬКО для тестирования и разработки!"
|
||||
echo ""
|
||||
echo -e "${YELLOW}Использование в Nginx:${NC}"
|
||||
echo -e " ssl_certificate ${CERT_DIR}/fullchain.pem;"
|
||||
echo -e " ssl_certificate_key ${CERT_DIR}/privkey.pem;"
|
||||
echo ""
|
||||
|
||||
# Предложение загрузить в NPM
|
||||
echo -e "${YELLOW}Загрузить в Nginx Proxy Manager?${NC}"
|
||||
echo -e " Используйте Python скрипт с опцией --test-cert"
|
||||
echo -e " или загрузите вручную через веб-интерфейс NPM"
|
||||
echo ""
|
||||
Reference in New Issue
Block a user