revert: отозвана snolla-mailer-per-recipient-send (создана без согласования vitya)
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
# Admin Task Board
|
# Admin Task Board
|
||||||
_Updated: 2026-08-14 — ⚪ **[snolla-mailer-per-recipient-send] заведена** (follow-up SMTP-инцидента). Холодный ящик e-16513832@yandex.ru → Яндекс 554 SPAM на письмах с 2+ получателями (проверено изоляционно; старый ящик был прогрет). 11 форм в БД с 2–3 админами → их письма падают. Фикс: mailer шлёт по одному письму на получателя (код victor/snolla) + деплой тиража + вернуть vitya в FormRecipients пилорама-checkout (аварийно удалён 2026-08-14). Спека: `.tasks/snolla-mailer-per-recipient-send.md`._
|
|
||||||
_Updated: 2026-08-14 — 🟢 **[snolla-smtp-send-monitor-vds] DONE** (по запросу vitya). Монитор SMTP-отправки snolla-сайтов задеплоен на VDS: `/root/snolla-smtp-monitor/monitor.py` (smtp-auth + weekly real-send + parity Portainer env 7 стеков) + cron 08:00 MSK; негатив-тест пройден (535 → ntfy-alert HTTP 200); parity зелёный после роллаута SMTP. Копия: `.admin/scripts/snolla-smtp-monitor/`. Попутно: msmtp на VDS (бэкап-отчёты) переведён на новые креды + From в run.sh (был мёртвый noreply@snolla.com)._
|
_Updated: 2026-08-14 — 🟢 **[snolla-smtp-send-monitor-vds] DONE** (по запросу vitya). Монитор SMTP-отправки snolla-сайтов задеплоен на VDS: `/root/snolla-smtp-monitor/monitor.py` (smtp-auth + weekly real-send + parity Portainer env 7 стеков) + cron 08:00 MSK; негатив-тест пройден (535 → ntfy-alert HTTP 200); parity зелёный после роллаута SMTP. Копия: `.admin/scripts/snolla-smtp-monitor/`. Попутно: msmtp на VDS (бэкап-отчёты) переведён на новые креды + From в run.sh (был мёртвый noreply@snolla.com)._
|
||||||
_Updated: 2026-08-13 — 🟢 **[stostayer-web-deploy-0-3-23] CLOSED.** Запрос их прогера (письмо в `.agents/inbox/2026-08-13T08-43-41Z-stostayer-new.md`): calculator-баннер про цены при покупке запчастей + фикс краша (snolla loadCity/loadSite) + стек-фикс легаси (vue/vuex/vue-router/mariadb явные deps, nmHoistingLimits). Образ `stostayer-web:0.3.23` (коммиты `e5f7bd6`+`7e51cbf`+`d49b4bb`) собран (нюанс: offline-build не прошёл — в `.yarn/cache` нет linux-бинарей esbuild/rollup, собрал с временным `VERDACCIO_TOKEN` ARG/ENV), запушен 1 попыткой (слои already-exists → бана нет), стек Portainer 16 передеплоен 0.3.22→0.3.23 (HTTP=200, env re-supply). Verify с хоста: Focus II → 200 + баннер «актуальны при приобретении запасных частей», регресс `/`+ремонтная → 200, Focus IV (exactPrices=0) → баннера нет + алерт «уточняйте у мастеров» (всё по письму). Контейнер Up, RestartCount=0, логи чистые. Откат: PUT на 0.3.22. Ранбук обновлён (прод-тег, build-нюансы, порт :9000 в Portainer API). Всё: `.tasks/stostayer-web-deploy-0-3-23.md` + `.wiki/concepts/stostayer-web-deploy-runbook.md`._
|
_Updated: 2026-08-13 — 🟢 **[stostayer-web-deploy-0-3-23] CLOSED.** Запрос их прогера (письмо в `.agents/inbox/2026-08-13T08-43-41Z-stostayer-new.md`): calculator-баннер про цены при покупке запчастей + фикс краша (snolla loadCity/loadSite) + стек-фикс легаси (vue/vuex/vue-router/mariadb явные deps, nmHoistingLimits). Образ `stostayer-web:0.3.23` (коммиты `e5f7bd6`+`7e51cbf`+`d49b4bb`) собран (нюанс: offline-build не прошёл — в `.yarn/cache` нет linux-бинарей esbuild/rollup, собрал с временным `VERDACCIO_TOKEN` ARG/ENV), запушен 1 попыткой (слои already-exists → бана нет), стек Portainer 16 передеплоен 0.3.22→0.3.23 (HTTP=200, env re-supply). Verify с хоста: Focus II → 200 + баннер «актуальны при приобретении запасных частей», регресс `/`+ремонтная → 200, Focus IV (exactPrices=0) → баннера нет + алерт «уточняйте у мастеров» (всё по письму). Контейнер Up, RestartCount=0, логи чистые. Откат: PUT на 0.3.22. Ранбук обновлён (прод-тег, build-нюансы, порт :9000 в Portainer API). Всё: `.tasks/stostayer-web-deploy-0-3-23.md` + `.wiki/concepts/stostayer-web-deploy-runbook.md`._
|
||||||
_Updated: 2026-08-10 — 🟡 **[kreknin-repair-md3-rebuild] ребилд идёт, бэкапы ВОЗВРАЩЕНЫ.** Утро: vitya на месте, кабели перетыкнуты (sdb WD-WX32D12L8HTE вернулся, SMART PASSED, все 3 HDD на 6 Gbps), md3 rebuild старт 07:57 (`mdadm --add /dev/md3 /dev/sdb3`), md0/md1 починены (системные разделы добавлены во все 4 диска — «зелёные» в DSM), win10 resolved (RuToken re-enum, кнопка «Игнорировать»). **~11:40 отключение электричества в деревне** → NAS лёг (роутер/WAN жив — на UPS). Возврат 16:20: md3 собрался деградированным `[_UU]`, **sdb3 сам не вернулся** (прогресс rebuild НЕ переживает power-loss — контрольной точки нет), повторён `mdadm --add /dev/md3 /dev/sdb3` → recovery с 0.0%, ETA ~4-5 дн (разгон 3→10-25МБ/с). md0/md1 все 4 диска `[UUUU]` (утр. ремонт пережил ребут), md2/VMM здоров. **Бэкапы возвращены 2026-08-10 18:00 по указанию vitya (ДО ребилда — ребилд фоновый):** cron раскомментирован (vds-kzntsv 05:00 + books-vds 06:00), ручные прогоны ПОДТВЕРЖДЕНЫ на kreknin (vds-kzntsv 2026-08-10 66G / books-vds 15G, latest→08-10, 7 снапшотов у обоих). Находка: books-vds не доезжал до kreknin с 08-05 (08-06..08-09 + 08-10 06:05 rsync падал — timed out/no route; другой триггер не найден); застрявший ES-снапшот `daily-2026-08-10` удалён. Осталось: дождаться ребилда md3 → `btrfs scrub /volume1` → monitor на ребилд активен. Всё: `.tasks/kreknin-repair-md3-rebuild.md` + `.wiki/entities/kreknin-synology.md`._
|
_Updated: 2026-08-10 — 🟡 **[kreknin-repair-md3-rebuild] ребилд идёт, бэкапы ВОЗВРАЩЕНЫ.** Утро: vitya на месте, кабели перетыкнуты (sdb WD-WX32D12L8HTE вернулся, SMART PASSED, все 3 HDD на 6 Gbps), md3 rebuild старт 07:57 (`mdadm --add /dev/md3 /dev/sdb3`), md0/md1 починены (системные разделы добавлены во все 4 диска — «зелёные» в DSM), win10 resolved (RuToken re-enum, кнопка «Игнорировать»). **~11:40 отключение электричества в деревне** → NAS лёг (роутер/WAN жив — на UPS). Возврат 16:20: md3 собрался деградированным `[_UU]`, **sdb3 сам не вернулся** (прогресс rebuild НЕ переживает power-loss — контрольной точки нет), повторён `mdadm --add /dev/md3 /dev/sdb3` → recovery с 0.0%, ETA ~4-5 дн (разгон 3→10-25МБ/с). md0/md1 все 4 диска `[UUUU]` (утр. ремонт пережил ребут), md2/VMM здоров. **Бэкапы возвращены 2026-08-10 18:00 по указанию vitya (ДО ребилда — ребилд фоновый):** cron раскомментирован (vds-kzntsv 05:00 + books-vds 06:00), ручные прогоны ПОДТВЕРЖДЕНЫ на kreknin (vds-kzntsv 2026-08-10 66G / books-vds 15G, latest→08-10, 7 снапшотов у обоих). Находка: books-vds не доезжал до kreknin с 08-05 (08-06..08-09 + 08-10 06:05 rsync падал — timed out/no route; другой триггер не найден); застрявший ES-снапшот `daily-2026-08-10` удалён. Осталось: дождаться ребилда md3 → `btrfs scrub /volume1` → monitor на ребилд активен. Всё: `.tasks/kreknin-repair-md3-rebuild.md` + `.wiki/entities/kreknin-synology.md`._
|
||||||
@@ -61,18 +60,6 @@ _Updated: 2026-05-26 — заведена `bookva-tenant-cutover-prep` ⚪ (7-st
|
|||||||
|
|
||||||
_Updated: 2026-05-25 (`iis-migration-to-ruvds` 🟢 closed Phase 1 per user decision — 9/24 hostnames live на RUVDS, source IIS оставлен running. `migrate-elasticsearch-to-books-vds` 🟢 closed ранее сегодня. 16 IIS hostnames + LE renewal pipeline + decommission — descoped в Closure note, не отдельные tracker tasks.)_
|
_Updated: 2026-05-25 (`iis-migration-to-ruvds` 🟢 closed Phase 1 per user decision — 9/24 hostnames live на RUVDS, source IIS оставлен running. `migrate-elasticsearch-to-books-vds` 🟢 closed ранее сегодня. 16 IIS hostnames + LE renewal pipeline + decommission — descoped в Closure note, не отдельные tracker tasks.)_
|
||||||
|
|
||||||
## ⚪ [snolla-mailer-per-recipient-send] — Mailer должен слать по одному письму на получателя (loop по FormRecipients), а не в один To. Холодный ящик e-16513832@yandex.ru → Яндекс 554 SPAM на 2+ получателях (старый был прогрет); 11 форм в БД с 2–3 админами падают.
|
|
||||||
|
|
||||||
**Status:** ready
|
|
||||||
**Where I stopped:** (not started) — спека: `.tasks/snolla-mailer-per-recipient-send.md`; подтверждено изоляционно (msmtp: 1 получатель→250, 2→554)
|
|
||||||
**Next action:** Письмо-запрос в victor/snolla inbox (mailer per-recipient loop + тест на форме с 2 админами) → после деплоя: вернуть vitya в FormRecipients пилорама-checkout (formId 629B7586-14D2-442C-8CE9-8CE118F29A23, admin E4CC416B-5D13-4757-8EFE-03CBEA15B18C) + контрольный заказ.
|
|
||||||
**Branch:** master
|
|
||||||
**Weight:** needs-claude
|
|
||||||
**Notify:** OpeItcLoc03/admin
|
|
||||||
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/admin / 2026-08-14T09:50:00.000Z -->
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🟢 [snolla-smtp-send-monitor-vds] — DONE 2026-08-14 — периодический мониторинг SMTP-отправки писем форм snolla-сайтов с VDS (ловит тихие сбои почты типа 12–14.08.2026), алерт через ntfy. Деплой: `/root/snolla-smtp-monitor/monitor.py` (python3 stdlib: smtp-auth тест + weekly real-send + parity Portainer env 7 стеков) + cron `0 8 * * *` + креды `/root/.snolla-smtp-monitor.env` (600). Негатив-тест пройден (сломанный пароль → 535 → ntfy HTTP 200 → exit 1). Parity ЗЕЛЁНЫЙ после роллаута 2026-08-14. Копия скрипта: `.admin/scripts/snolla-smtp-monitor/monitor.py`.
|
## 🟢 [snolla-smtp-send-monitor-vds] — DONE 2026-08-14 — периодический мониторинг SMTP-отправки писем форм snolla-сайтов с VDS (ловит тихие сбои почты типа 12–14.08.2026), алерт через ntfy. Деплой: `/root/snolla-smtp-monitor/monitor.py` (python3 stdlib: smtp-auth тест + weekly real-send + parity Portainer env 7 стеков) + cron `0 8 * * *` + креды `/root/.snolla-smtp-monitor.env` (600). Негатив-тест пройден (сломанный пароль → 535 → ntfy HTTP 200 → exit 1). Parity ЗЕЛЁНЫЙ после роллаута 2026-08-14. Копия скрипта: `.admin/scripts/snolla-smtp-monitor/monitor.py`.
|
||||||
|
|
||||||
**Status:** done
|
**Status:** done
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
[//]: # (created 2026-08-14 after SMTP incident follow-up: cold mailbox e-16513832@yandex.ru → Yandex 554 SPAM on multi-recipient mails; single-recipient OK)
|
|
||||||
|
|
||||||
# snolla-mailer-per-recipient-send
|
|
||||||
|
|
||||||
## Goal
|
|
||||||
|
|
||||||
Mailer (@snollajs/mailer / forms-api, `emailSender.js`) должен отправлять письмо формы **отдельным письмом на каждого получателя** (loop по FormRecipients), а не одним письмом с несколькими адресами в To.
|
|
||||||
|
|
||||||
## Почему
|
|
||||||
|
|
||||||
2026-08-14: после переезда почты форм на новый ящик `e-16513832@yandex.ru` (app-password) Яндекс режектит **554 5.7.1 SPAM** ЛЮБОЕ письмо с **2+ получателями** от этого (холодного) ящика; с 1 получателем — проходит (проверено изоляционными тестами через msmtp: 1 получатель → 250, 2 получателя → 554 стабильно). Старый ящик `noreply@snolla.com` был прогрет, поэтому мульти-получатели раньше проходили.
|
|
||||||
|
|
||||||
В БД **11 форм с 2–3 админами** в FormRecipients (vitya.kuznetsov@gmail.com почти везде) — их письма сейчас падают.
|
|
||||||
|
|
||||||
## Требуется (код, victor/snolla)
|
|
||||||
|
|
||||||
1. В mailer: вместо одного `sendMail({to: [a@x, b@y]})` — цикл по получателям, по одному письму на каждого (тот же шаблон/контент). Учесть: не дублировать одного и того же адресата; опционально Cc/Bcc оставить как есть.
|
|
||||||
2. Тесты: форма с 2 админами → 2 письма, оба уходят (каждое 1 получатель).
|
|
||||||
|
|
||||||
## После деплоя (admin, координация)
|
|
||||||
|
|
||||||
- Вернуть vitya.kuznetsov@gmail.com в FormRecipients пилорама-checkout (удалён аварийно 2026-08-14, заказная форма 629B7586-14D2-442C-8CE9-8CE118F29A23, admin E4CC416B-5D13-4757-8EFE-03CBEA15B18C) и решить по остальным multi-admin формам тиража.
|
|
||||||
- Деплой по тиражу: 8 стеков (pilonuxt 16 + env 17–23) — образы пересобрать/перекатить.
|
|
||||||
|
|
||||||
## Acceptance
|
|
||||||
|
|
||||||
- [ ] Форма с 2+ админами → по одному письму на каждого, все уходят (без 554).
|
|
||||||
- [ ] После деплоя vitya снова получает дубль заказов/контактов.
|
|
||||||
- [ ] Проверено контрольным заказом на pilorama98.
|
|
||||||
Reference in New Issue
Block a user