From 36d5de913de2c21c09d6fbc4e541ca654335e5d0 Mon Sep 17 00:00:00 2001 From: host Date: Sat, 11 Apr 2026 21:33:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 191 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..ea4e8c0 --- /dev/null +++ b/README.md @@ -0,0 +1,191 @@ +### ASSISTANT +# 🔄 SSL Sync: Nginx Proxy Manager → Home Assistant + +> 📖 **Описание** +> Автоматическая синхронизация Let's Encrypt сертификатов с сервера **Nginx Proxy Manager** в **Home Assistant** через SSH и cron. +> Оптимизировано для работы через туннель Keenetic, включает проверку целостности, логирование и безопасный перезапуск HA. + +--- + +## 🌐 Архитектура решения +| Компонент | IP / Путь | Роль | +|-----------|-----------|------| +| **Nginx Proxy Manager** | `192.168.1.2` | Хост-сервер, хранит сертификаты | +| **Home Assistant** | `192.168.31.10` | VM-клиент, принимает сертификаты в `/ssl/` | +| **Сеть** | Туннель Keenetic | Обеспечивает маршрутизацию между подсетями `192.168.1.0/24` и `192.168.31.0/24` | +| **Цель** | `/opt/npm/letsencrypt/live/npm-44/` → `root@192.168.31.10:/ssl/` | Ежедневная авто-синхронизация | + +--- + +## ✅ Требования +- Доступ к **хосту NPM** по SSH (скрипт выполняется в базовой ОС, а не в контейнере) +- SSH-доступ к HA от пользователя `root` (включен в HA OS или через Add-on `SSH & Web Terminal`) +- Установленный `openssh-client`, `cron`, `bash` на хосте NPM +- В `configuration.yaml` HA указана папка `/ssl` для сертификатов + +--- + +## 🛠 Пошаговая настройка + +### 1. 🔑 Настройка беспарольного SSH +Выполните на **хосте NPM** (`192.168.1.2`): + +```bash +# 1. Генерация ключа (если отсутствует) +ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_npm_ha -N "" -C "npm-to-ha" + +# 2. Копирование публичного ключа на HA +ssh-copy-id -i ~/.ssh/id_ed25519_npm_ha.pub root@192.168.31.10 + +# 3. Проверка подключения +ssh -i ~/.ssh/id_ed25519_npm_ha -o ConnectTimeout=10 root@192.168.31.10 echo "✅ SSH OK" +``` +> ⚠️ **HA OS**: Если используется Home Assistant OS, убедитесь, что SSH включен через `Settings → Add-ons → SSH & Web Terminal`, а ключ добавлен в поле `Authorized Keys`. + +--- + +### 2. 📜 Создание скрипта синхронизации +```bash +sudo mkdir -p /opt/npm/scripts +sudo nano /opt/npm/scripts/sync_ssl_to_ha.sh +``` + +Вставьте следующий код: + +```bash +#!/bin/bash + +# === КОНФИГУРАЦИЯ === +FULLCHAIN="/opt/npm/letsencrypt/live/npm-44/fullchain.pem" +PRIVKEY="/opt/npm/letsencrypt/live/npm-44/privkey.pem" +HA_USER="root" +HA_IP="192.168.31.10" +DEST_DIR="/ssl" +SSH_KEY="/root/.ssh/id_ed25519_npm_ha" +LOG="/var/log/ha_ssl_sync.log" +SSH_OPTS="-i $SSH_KEY -o StrictHostKeyChecking=no -o ConnectTimeout=10 -o ServerAliveInterval=5" + +log() { echo "$(date '+%Y-%m-%d %H:%M:%S') | $1" >> "$LOG"; } + +log "=== Старт синхронизации ===" + +# Проверка исходных файлов +if [[ ! -f "$FULLCHAIN" || ! -f "$PRIVKEY" ]]; then + log "❌ Исходные сертификаты не найдены: $FULLCHAIN или $PRIVKEY" + exit 1 +fi + +# Копирование +scp $SSH_OPTS "$FULLCHAIN" "$HA_USER@$HA_IP:$DEST_DIR/fullchain.pem" >> "$LOG" 2>&1 +SCP1=$? +scp $SSH_OPTS "$PRIVKEY" "$HA_USER@$HA_IP:$DEST_DIR/privkey.pem" >> "$LOG" 2>&1 +SCP2=$? + +# Логика перезапуска +if [[ $SCP1 -eq 0 && $SCP2 -eq 0 ]]; then + log "✅ Файлы успешно скопированы" + # Фиксим права на приватный ключ и перезапускаем core HA + ssh $SSH_OPTS "$HA_USER@$HA_IP" "chmod 600 $DEST_DIR/privkey.pem && ha core restart" >> "$LOG" 2>&1 + log "🔄 Команда рестарта HA отправлена" +else + log "❌ Ошибка копирования (fullchain=$SCP1, privkey=$SCP2). Рестарт отменён." + exit 1 +fi +``` + +--- + +### 3. 🔐 Настройка прав и логирования +```bash +sudo chmod +x /opt/npm/scripts/sync_ssl_to_ha.sh +sudo touch /var/log/ha_ssl_sync.log +sudo chown root:root /opt/npm/scripts/sync_ssl_to_ha.sh +sudo chmod 750 /opt/npm/scripts/sync_ssl_to_ha.sh +``` + +--- + +### 4. ⏰ Автоматизация через Cron +```bash +sudo crontab -e +``` +Добавьте строку: +```cron +# Ежедневно в 04:15 (через 15 мин после планового обновления Let's Encrypt в NPM) +15 4 * * * /bin/bash /opt/npm/scripts/sync_ssl_to_ha.sh +``` +> 💡 **Почему 04:15?** NPM запускает проверку обновления сертификатов в `04:00`. Задержка в 15 минут гарантирует, что свежие файлы уже записаны на диск. + +--- + +### 5. ⚙️ Конфигурация Home Assistant +В `configuration.yaml` убедитесь, что указан путь к `/ssl`: + +```yaml +http: + ssl_certificate: /ssl/fullchain.pem + ssl_key: /ssl/privkey.pem + # server_port: 443 # Раскомментируйте, если HA слушает 443 напрямую + use_x_forwarded_for: true + trusted_proxies: + - 192.168.1.2 + - 127.0.0.1 +``` +После первого изменения перезапустите HA вручную: +```bash +ssh root@192.168.31.10 "ha core restart" +``` + +--- + +## 🧪 Тестирование + +1. **Ручной запуск:** + ```bash + /opt/npm/scripts/sync_ssl_to_ha.sh + ``` +2. **Проверка лога:** + ```bash + tail -n 10 /var/log/ha_ssl_sync.log + ``` +3. **Валидация в HA:** + - Откройте `https://<ваш-домен-или-ip>:443` + - Убедитесь, что браузер не ругается на сертификат + - В `Настройки → Система → Журналы` не должно быть ошибок SSL + +--- + +## 🐛 Устранение неполадок + +| Симптом | Причина | Решение | +|--------|---------|---------| +| `Permission denied` при `scp` | Ключ не добавлен или неправильные права | Проверьте `~/.ssh/authorized_keys` на HA и `chmod 600 ~/.ssh/id_ed25519_npm_ha` | +| `ha: command not found` | CLI не установлен или не в PATH | Используйте `docker restart homeassistant` или `systemctl restart home-assistant@homeassistant` в скрипте | +| HA не стартует после синхронизации | Неправильные права на `privkey.pem` | Скрипт уже делает `chmod 600`. Если ошибка: проверьте, не перезаписывается ли файл Supervisor'ом | +| Cron не запускает скрипт | Отсутствие полных путей или переменных окружения | В cron всегда указывайте `/bin/bash /полный/путь/скрипт.sh` | +| Таймаут по SSH | Нестабильный туннель Keenetic | Увеличьте `ConnectTimeout=15` и добавьте `ServerAliveCountMax=3` в `SSH_OPTS` | + +--- + +## 🔒 Безопасность и рекомендации + +- ✅ Ключ SSH хранится с правами `600`. Не передавайте его третьим лицам. +- ✅ `StrictHostKeyChecking=no` безопасен только во внутренней LAN. Для внешних сетей используйте `known_hosts`. +- ✅ Скрипт перезапускает `ha core` **только** при успешном копировании обоих файлов. +- ✅ Для мониторинга добавьте в скрипт отправку уведомления в HA/Telegram при `exit 1`. +- 🔄 Раз в квартал проверяйте актуальность ключа SSH и ротацию `authorized_keys` на HA. + +--- + +## 📦 Структура файлов +``` +/opt/npm/scripts/ +└── sync_ssl_to_ha.sh # Основной скрипт +/var/log/ +└── ha_ssl_sync.log # Лог операций +/etc/crontab # Задача cron +``` + +--- +📝 *Документация подготовлена для размещения в Gitea/Wiki. Версия: `1.0.0` | Обновлено: `2026-04-12`* +🔗 *При изменении архитектуры сети или пути к сертификатам обновите переменные в шапке скрипта.* \ No newline at end of file