8.5 KiB
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-onSSH & Web Terminal) - Установленный
openssh-client,cron,bashна хосте NPM - В
configuration.yamlHA указана папка/sslдля сертификатов
🛠 Пошаговая настройка
1. 🔑 Настройка беспарольного SSH
Выполните на хосте NPM (192.168.1.2):
# 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. 📜 Создание скрипта синхронизации
sudo mkdir -p /opt/npm/scripts
sudo nano /opt/npm/scripts/sync_ssl_to_ha.sh
Вставьте следующий код:
#!/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. 🔐 Настройка прав и логирования
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
sudo crontab -e
Добавьте строку:
# Ежедневно в 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:
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 вручную:
ssh root@192.168.31.10 "ha core restart"
🧪 Тестирование
- Ручной запуск:
/opt/npm/scripts/sync_ssl_to_ha.sh - Проверка лога:
tail -n 10 /var/log/ha_ssl_sync.log - Валидация в 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
🔗 При изменении архитектуры сети или пути к сертификатам обновите переменные в шапке скрипта.