[//]: # (created 2026-08-14 via user request after SMTP incident: «периодический мониторинг, что отправка с сайтов snolla работает, чтобы жила на vds») # snolla-smtp-send-monitor-vds ## Goal Периодический мониторинг того, что SMTP-отправка писем форм с snolla-сайтов реально работает. **Живёт на VDS (vds-kzntsv)** — проверяет снаружи от воркстейшна, не зависит от рабочей машины. Мотивация — инцидент 12–14.08.2026 (`pilorama-forms-email-down`): Яндекс отключил протокольный доступ к `noreply@snolla.com` → **2 дня тишины**: формы отвечали «успешно», заказы копились в БД, писем не было (mailer глотает ошибку `catch { console.log }`). Монитор должен ловить такой сбой в ближайший тик, а не через N дней. ## Что проверять (тик = ежедневно) 1. **SMTP auth/send-тест** на `smtp.yandex.ru:465` (SSL) с боевыми кредами snolla-почты (`e-16513832@yandex.ru` / пароль приложения, канон-стора `pass snolla-smtp/full-env`): - минимум: `verify()`-эквивалент (auth + RCPT, без тела) — дёшево, ловит 525/535/connection; - опционально 1×/нед: реальная тестовая отправка на `info@pilorama98.ru` + `vitya.kuznetsov@gmail.com` (доставка до ящика, не только до SMTP-сервера). 2. **Parity-чек конфига (дёшево, ловит дрейф до поломки):** SMTP_USER/SMTP_PASSWORD в env Portainer-стеков snolla-сайтов (pilonuxt/конфиг-запечка, tandemmebel 20, emspb 18, labtools 17, labtools-pro 19, kupimknigi 21, on-snolla 22, maljarka 23) == актуальным кредам канон-сторы. Расхождение → алерт (будущий сайт снова сломается молча). ## Где живёт - **Вариант A (рекомендую):** bash/node-скрипт на VDS-хосте + cron (например `08:00 MSK`), креды в root-only файле `/root/.snolla-smtp-monitor.env` (chmod 600, зеркало `pass snolla-smtp/full-env`; в git НЕ класть), лог `/var/log/snolla-smtp-monitor.log`. - **Вариант B:** отдельный маленький контейнер/стек через Portainer (гомогенно с тиражом, но тяжелее — нужен образ). - **Алерт:** ntfy push (ntfy уже живёт на VDS), topic напр. `snolla-smtp`; тишина при OK (или лёгкий daily OK-пинг). При алерте — exit 1 + дубль в лог. ## Acceptance criteria - [ ] Скрипт на VDS выполняет SMTP auth-тест с боевыми кредами; 525/535/connection-fail → ntfy-алерт + exit 1. - [ ] Cron ежедневный (время после 08:00 MSK), логи пишутся. - [ ] Проверено негативом: временно сломать пароль в env-файле → алерт приходит (за < 1 мин при ручном прогоне). - [ ] Parity-проверка Portainer env vs канон реализована (или явно descoped). - [ ] Ранбук/README в `.admin` (`host-stacks/vds-kzntsv/` или `scripts/`), креды — только через pass/root-only файл. ## Key files / refs - Креды: `pass snolla-smtp/full-env` (после ротации 2026-08-14: `e-16513832@yandex.ru` / app-password). - Инцидент: `.tasks/pilorama-forms-email-down.md` (pilorama98) — почему монитор нужен. - Portainer API: `pass vds-kzntsv/full-env` (`PORTAINER_URL`/JWT-аут), `.wiki/concepts/portainer-stack-management-vds.md`. - ntfy: контейнер на VDS (стек из host-stacks).