#!/bin/bash # Silent LE-cert watchdog for manual dns-01 renewal (Prosody reading certs/.crt). # Cron contract (Hermes no_agent cron): empty stdout = SILENT (nothing delivered to the user); # non-empty stdout is delivered verbatim. So stay quiet until renewal is actually due. # Deployed copy (ICQ): /opt/hermes/.hermes/scripts/check_icq_cert.sh, cron job ca2a23a34905, # daily 0 10 * * *, deliver=telegram: (explicit target required from CLI sessions). # Usage: check_icq_cert.sh [CERT_PATH] (default /opt/icq/certs/nixg.ru.crt) # Override: THRESHOLD=30 check_icq_cert.sh (days before expiry to start shouting) CERT="${1:-/opt/icq/certs/nixg.ru.crt}" THRESHOLD="${THRESHOLD:-45}" if [ ! -f "$CERT" ]; then echo "⚠️ ОТСУТСТВУЕТ сертификат $CERT — XMPP c2s/s2s скоро перестанет работать!" echo "Проверь бэкап и восстанови (см. backup.sh)." exit 0 fi END=$(openssl x509 -enddate -noout -in "$CERT" | cut -d= -f2) END_EPOCH=$(date -d "$END" +%s) NOW_EPOCH=$(date +%s) DAYS=$(( (END_EPOCH - NOW_EPOCH) / 86400 )) if [ "$DAYS" -gt "$THRESHOLD" ]; then exit 0 # тишина: до истечения больше порога, напоминание не нужно fi # ---- Шумим: до истечения <= THRESHOLD дней ---- echo "🔐 LE-сертификат истекает через ${DAYS} дн. (${END}). Нужно продлить вручную через dns-01:" echo "" echo "1. sudo certbot renew --manual-auth-hook /bin/true --manual-cleanup-hook /bin/true" echo " → он напечатает НОВЫЕ TXT-значения для _acme-challenge.nixg.ru и _acme-challenge.xmpp.nixg.ru" echo "2. Добавить эти TXT-записи в панели DNS (заменить старые)" echo "3. Подождать 1–2 мин, проверить: dig @1.1.1.1 _acme-challenge.nixg.ru TXT +short" echo "4. Повторить ту же команду certbot renew — сертификат продлится" echo "5. Скопировать свежий серт:" echo " sudo cp -L /etc/letsencrypt/live/nixg.ru/fullchain.pem /opt/icq/certs/nixg.ru.crt" echo " sudo cp -L /etc/letsencrypt/live/nixg.ru/privkey.pem /opt/icq/certs/nixg.ru.key" echo "6. Перезапустить Prosody: cd /opt/icq && docker compose restart prosody" echo "7. Проверить: openssl x509 -enddate -noout -in /opt/icq/certs/nixg.ru.crt" # Домашняя проверка (офлайн): запусти с THRESHOLD=100 → должен зашуметь; обычный запуск → пустой вывод.