Files
SSL-Sync--Nginx-Proxy-Manag…/README.md
T
2026-04-11 21:33:15 +03:00

191 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### 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`*
🔗 *При изменении архитектуры сети или пути к сертификатам обновите переменные в шапке скрипта.*