38 lines
4.0 KiB
Markdown
38 lines
4.0 KiB
Markdown
[//]: # (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).
|