Удалить README.md
This commit is contained in:
@@ -1,191 +0,0 @@
|
|||||||
### 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`*
|
|
||||||
🔗 *При изменении архитектуры сети или пути к сертификатам обновите переменные в шапке скрипта.*
|
|
||||||
Reference in New Issue
Block a user