diff --git a/notes/claude/2026-06-27-221231-httpsgethomepagedevwidgetsservicesnextcloud-если-в.md b/notes/claude/2026-06-27-221231-httpsgethomepagedevwidgetsservicesnextcloud-если-в.md
new file mode 100644
index 0000000..21097f3
--- /dev/null
+++ b/notes/claude/2026-06-27-221231-httpsgethomepagedevwidgetsservicesnextcloud-если-в.md
@@ -0,0 +1,33 @@
+---
+date: 2026-06-27
+type: claude-session
+session_id: cf0fcbca-45e5-4c86-9af4-0126868e3b68
+started: 2026-06-26T20:32:39.557Z
+ended: 2026-06-27T19:12:31.306Z
+messages: 7
+tools: [AskUserQuestion, Bash, Edit, Read, TaskOutput, TaskStop, ToolSearch, Workflow, Write, mcp__ccd_session__spawn_task]
+tags: [claude, session]
+---
+
+# https://gethomepage.dev/widgets/services/nextcloud/ если все мои сервисы собрать
+
+## Запрос
+
+https://gethomepage.dev/widgets/services/nextcloud/ если все мои сервисы собрать как думаешь?
+
+## Итог (последний ответ Claude, до 500 симв.)
+
+Готово. `dash.dttb.ru` → 200, закоммичено.
+
+## Группа «OpenWrt роутеры» — все 10
+
+Веерный скан vault (6 читателей по регионам + сведение) собрал все OpenWrt-роутеры. Пингую каждый по NetBird с дашборда:
+
+**Онлайн (7):** Дом, Sergey, Lipki, Benelux, НИИКН-VM101, Бужарово Сев.лес, Знаменское-3
+**Down (3):** Olivier (Canal+), Переделки (vault помечал «возможно offline с 08.05»), Красногорск
+
+Каждая плитка — статус + клик на LuCI. Домашний мониторю по LAN `10.0.0.1` (его NetBird-адрес не отвечает).
+
+
+---
+*Автосохранено из session [`cf0fcbca`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/cf0fcbca-45e5-4c86-9af4-0126868e3b68.jsonl) — 7 сообщ., тулы: AskUserQuestion, Bash, Edit, Read, TaskOutput, TaskStop, ToolSearch, Workflow, Write, mcp__ccd_session__spawn_task*
diff --git a/notes/claude/2026-06-27-230518-httpsmaildttbrudomainadmin-можешь-найти-креды.md b/notes/claude/2026-06-27-230518-httpsmaildttbrudomainadmin-можешь-найти-креды.md
new file mode 100644
index 0000000..4b193a7
--- /dev/null
+++ b/notes/claude/2026-06-27-230518-httpsmaildttbrudomainadmin-можешь-найти-креды.md
@@ -0,0 +1,27 @@
+---
+date: 2026-06-27
+type: claude-session
+session_id: ac82ac49-7dd6-476e-9fd0-e10687c8867c
+started: 2026-06-27T19:43:29.595Z
+ended: 2026-06-27T20:05:18.062Z
+messages: 2
+tools: [Bash]
+tags: [claude, session]
+---
+
+# https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Запрос
+
+https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Итог (последний ответ Claude, до 500 симв.)
+
+Подтвердилось — вот корень:
+
+**`@zone[0] name=lan masq=1`** — на LAN-зоне роутера включён masquerade. Входящее письмо идёт `WAN:25 → DNAT → 10.0.0.107`, пакет уходит в LAN-зону, и из-за `masq=1` роутер подменяет source на свой `10.0.0.1`. Поэтому mailcow видит `10.0.0.1` вместо реального IP отправителя — отсюда RDNS_NONE + HFILTER_HOSTNAME_UNKNOWN на всём и R_SPF_FAIL для строгих.
+
+То есть это **не про `support@`** — бьёт по всем входящим сервера. `support@` просто новый: Bayes не выучил ham, и
+
+---
+*Автосохранено из session [`ac82ac49`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/ac82ac49-7dd6-476e-9fd0-e10687c8867c.jsonl) — 2 сообщ., тулы: Bash*
diff --git a/notes/claude/2026-06-27-230948-httpsmaildttbrudomainadmin-можешь-найти-креды.md b/notes/claude/2026-06-27-230948-httpsmaildttbrudomainadmin-можешь-найти-креды.md
new file mode 100644
index 0000000..0cd4af3
--- /dev/null
+++ b/notes/claude/2026-06-27-230948-httpsmaildttbrudomainadmin-можешь-найти-креды.md
@@ -0,0 +1,29 @@
+---
+date: 2026-06-27
+type: claude-session
+session_id: ac82ac49-7dd6-476e-9fd0-e10687c8867c
+started: 2026-06-27T19:43:29.595Z
+ended: 2026-06-27T20:09:48.676Z
+messages: 3
+tools: [Bash, Edit, Read]
+tags: [claude, session]
+---
+
+# https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Запрос
+
+https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Итог (последний ответ Claude, до 500 симв.)
+
+Готово. Записал корень и фикс в [mailcow-dttb.md](projects/dttb/mailcow-dttb.md) (auto-sync на code-server закоммитит).
+
+## Итог
+
+**Причина:** на домашнем роутере `10.0.0.1` LAN-зона была с `masq=1` — входящая почта `WAN:25 → 10.0.0.107` SNAT'илась в `10.0.0.1`, и сервер видел этот адрес как отправителя **всех** писем. Отсюда `RDNS_NONE + HFILTER_HOSTNAME_UNKNOWN` (+10.5) на каждом входящем. Новый `support@` тонул, старый ящик вытягивал обученный Bayes.
+
+**Сделано:** точечное правило `No-SNAT-to
+
+---
+*Автосохранено из session [`ac82ac49`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/ac82ac49-7dd6-476e-9fd0-e10687c8867c.jsonl) — 3 сообщ., тулы: Bash, Edit, Read*
diff --git a/notes/claude/2026-06-27-235510-httpsmaildttbrudomainadmin-можешь-найти-креды.md b/notes/claude/2026-06-27-235510-httpsmaildttbrudomainadmin-можешь-найти-креды.md
new file mode 100644
index 0000000..3f339bd
--- /dev/null
+++ b/notes/claude/2026-06-27-235510-httpsmaildttbrudomainadmin-можешь-найти-креды.md
@@ -0,0 +1,31 @@
+---
+date: 2026-06-27
+type: claude-session
+session_id: ac82ac49-7dd6-476e-9fd0-e10687c8867c
+started: 2026-06-27T19:43:29.595Z
+ended: 2026-06-27T20:55:10.007Z
+messages: 5
+tools: [Bash, Edit, Read, Write]
+tags: [claude, session]
+---
+
+# https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Запрос
+
+https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Итог (последний ответ Claude, до 500 симв.)
+
+Готово по обоим фронтам.
+
+## SSL (твоя задача)
+Сертификат на почтовых портах был просрочен с 2 июня — клиенты IMAP/SMTP на него и ругались. Заменил на свежий из NPM (до 1 авг), поставил авто-синхрон cron'ом, чтобы не повторилось. Все порты (25/465/587/993/995) отдают валидный cert. Web был в порядке.
+
+→ как соберёшься — кинь письмо с Яндекса на `support@dttb.ru`, проверю score (это с прошлой задачи про спам).
+
+## MEMORY.md (по требованию хука)
+Индекс памяти раздулся до ~28.8 КБ (близко к лимиту
+
+---
+*Автосохранено из session [`ac82ac49`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/ac82ac49-7dd6-476e-9fd0-e10687c8867c.jsonl) — 5 сообщ., тулы: Bash, Edit, Read, Write*
diff --git a/notes/claude/2026-06-28-002628-httpsmaildttbrudomainadmin-можешь-найти-креды.md b/notes/claude/2026-06-28-002628-httpsmaildttbrudomainadmin-можешь-найти-креды.md
new file mode 100644
index 0000000..4237855
--- /dev/null
+++ b/notes/claude/2026-06-28-002628-httpsmaildttbrudomainadmin-можешь-найти-креды.md
@@ -0,0 +1,29 @@
+---
+date: 2026-06-28
+type: claude-session
+session_id: ac82ac49-7dd6-476e-9fd0-e10687c8867c
+started: 2026-06-27T19:43:29.595Z
+ended: 2026-06-27T21:26:28.486Z
+messages: 5
+tools: [AskUserQuestion, Bash, Edit, Read, Write]
+tags: [claude, session]
+---
+
+# https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Запрос
+
+https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Итог (последний ответ Claude, до 500 симв.)
+
+Готово. mailcow обновлён и проверен.
+
+## Что сделано
+- **Снапшот** `pre_update_20260627` (откат: `qm rollback 107 pre_update_20260627`) — удали через недельку стабильной работы.
+- **Обновление `2026-01` → `2026-05c`** через `./update.sh -f`. Перед запуском откатил локальные правки конфигов (иначе merge-конфликт), после — проверил.
+- **SSL уцелел**: наш cert (до 1 авг) на всех портах, cron-синхрон жив.
+- **forward-zone unbound (8.8.8.8) убрал осознанно**: новый unbound резолвит рекурсивно, а forw
+
+---
+*Автосохранено из session [`ac82ac49`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/ac82ac49-7dd6-476e-9fd0-e10687c8867c.jsonl) — 5 сообщ., тулы: AskUserQuestion, Bash, Edit, Read, Write*
diff --git a/notes/claude/2026-06-28-004249-httpsmaildttbrudomainadmin-можешь-найти-креды.md b/notes/claude/2026-06-28-004249-httpsmaildttbrudomainadmin-можешь-найти-креды.md
new file mode 100644
index 0000000..3b37167
--- /dev/null
+++ b/notes/claude/2026-06-28-004249-httpsmaildttbrudomainadmin-можешь-найти-креды.md
@@ -0,0 +1,31 @@
+---
+date: 2026-06-28
+type: claude-session
+session_id: ac82ac49-7dd6-476e-9fd0-e10687c8867c
+started: 2026-06-27T19:43:29.595Z
+ended: 2026-06-27T21:42:49.450Z
+messages: 6
+tools: [AskUserQuestion, Bash, Edit, Read, Write]
+tags: [claude, session]
+---
+
+# https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Запрос
+
+https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Итог (последний ответ Claude, до 500 симв.)
+
+Готово — логотип `dttb` стоит.
+
+## Что сделал
+- Поставил монограмму в оба слота mailcow (`MAIN_LOGO` + `MAIN_LOGO_DARK` в Redis) — она на странице входа и в шапке интерфейса.
+- Взял **PNG**, а не SVG: в твоём SVG текст нарисован шрифтом `SG`, а когда mailcow грузит логотип как ``, кастомный шрифт недоступен → «dttb» отрисовался бы дефолтным шрифтом. В PNG начертание уже впечёно в растр — выглядит точно как задумано.
+- Ужал 2048→1024 (лимит mailcow 1920), вес 54 КБ.
+
+## Проверь
+Открой https:
+
+---
+*Автосохранено из session [`ac82ac49`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/ac82ac49-7dd6-476e-9fd0-e10687c8867c.jsonl) — 6 сообщ., тулы: AskUserQuestion, Bash, Edit, Read, Write*
diff --git a/notes/claude/2026-06-28-005559-httpsmaildttbrudomainadmin-можешь-найти-креды.md b/notes/claude/2026-06-28-005559-httpsmaildttbrudomainadmin-можешь-найти-креды.md
new file mode 100644
index 0000000..f73c106
--- /dev/null
+++ b/notes/claude/2026-06-28-005559-httpsmaildttbrudomainadmin-можешь-найти-креды.md
@@ -0,0 +1,30 @@
+---
+date: 2026-06-28
+type: claude-session
+session_id: ac82ac49-7dd6-476e-9fd0-e10687c8867c
+started: 2026-06-27T19:43:29.595Z
+ended: 2026-06-27T21:55:59.940Z
+messages: 7
+tools: [AskUserQuestion, Bash, Edit, Read, Write]
+tags: [claude, session]
+---
+
+# https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Запрос
+
+https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Итог (последний ответ Claude, до 500 симв.)
+
+Сделал, что можно без твоего участия. Итог по двум частям:
+
+## 1. BIMI (лого у отправителя в инбоксе)
+✅ Собрал валидный SVG (конверт, профиль **SVG Tiny PS** — без шрифта, поэтому годен; монограмма со шрифтом `SG` для BIMI не подходит)
+✅ Захостил публично: https://mail.dttb.ru/bimi/dttb.svg (проверено из интернета — 200, `image/svg+xml`)
+✅ DMARC у тебя `p=quarantine` — BIMI принимает
+
+**Осталась 1 DNS-запись** — её сам не добавлю (API Spaceweb требует сессию панели, токена нет). Добавь в `vps.sw
+
+---
+*Автосохранено из session [`ac82ac49`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/ac82ac49-7dd6-476e-9fd0-e10687c8867c.jsonl) — 7 сообщ., тулы: AskUserQuestion, Bash, Edit, Read, Write*
diff --git a/notes/claude/2026-06-28-010838-httpsmaildttbrudomainadmin-можешь-найти-креды.md b/notes/claude/2026-06-28-010838-httpsmaildttbrudomainadmin-можешь-найти-креды.md
new file mode 100644
index 0000000..d239344
--- /dev/null
+++ b/notes/claude/2026-06-28-010838-httpsmaildttbrudomainadmin-можешь-найти-креды.md
@@ -0,0 +1,27 @@
+---
+date: 2026-06-28
+type: claude-session
+session_id: ac82ac49-7dd6-476e-9fd0-e10687c8867c
+started: 2026-06-27T19:43:29.595Z
+ended: 2026-06-27T22:08:38.835Z
+messages: 9
+tools: [AskUserQuestion, Bash, Edit, Read, Write]
+tags: [claude, session]
+---
+
+# https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Запрос
+
+https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Итог (последний ответ Claude, до 500 симв.)
+
+Готово. Чиню честно: **это была моя ошибка** — при апдейте я убрал forward-zone из unbound, посчитав её устаревшей. На деле она load-bearing: рекурсивный DNS на твоём провайдере режется RKN, поэтому без forward postfix перестал резолвить домены отправителей и отбивал всё входящее (`450 Domain not found`). Несколько секунд после апдейта работало из кеша — это меня и обмануло.
+
+## Что сделано
+- Вернул `forward-zone → 8.8.8.8/1.1.1.1` в unbound + рестарт.
+- Проверил: unbound резолвит, postfix прини
+
+---
+*Автосохранено из session [`ac82ac49`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/ac82ac49-7dd6-476e-9fd0-e10687c8867c.jsonl) — 9 сообщ., тулы: AskUserQuestion, Bash, Edit, Read, Write*
diff --git a/notes/claude/2026-06-28-012719-httpsmaildttbrudomainadmin-можешь-найти-креды.md b/notes/claude/2026-06-28-012719-httpsmaildttbrudomainadmin-можешь-найти-креды.md
new file mode 100644
index 0000000..121b7d1
--- /dev/null
+++ b/notes/claude/2026-06-28-012719-httpsmaildttbrudomainadmin-можешь-найти-креды.md
@@ -0,0 +1,30 @@
+---
+date: 2026-06-28
+type: claude-session
+session_id: ac82ac49-7dd6-476e-9fd0-e10687c8867c
+started: 2026-06-27T19:43:29.595Z
+ended: 2026-06-27T22:27:19.545Z
+messages: 9
+tools: [AskUserQuestion, Bash, Edit, Read, Write]
+tags: [claude, session]
+---
+
+# https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Запрос
+
+https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Итог (последний ответ Claude, до 500 симв.)
+
+Готово — **Roundcube поставлен и работает.**
+
+## Как зайти
+**https://mail.dttb.ru/rc/** — логин полным адресом + пароль (напр. `support@dttb.ru` / `1qaz!QAZ`). Скин Elastic, заголовок «dttb Mail». Вход проверил — работает.
+
+## Что под капотом
+- Контейнер Roundcube рядом с mailcow, отдаётся **родным nginx на `/rc`** — без нового поддомена и без записи в Spaceweb DNS (wildcard `*.dttb.ru` у тебя нет, иначе пришлось бы тебя просить добавить запись).
+- Своя БД, IMAP/SMTP к mailcow внутри docker-сети
+
+---
+*Автосохранено из session [`ac82ac49`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/ac82ac49-7dd6-476e-9fd0-e10687c8867c.jsonl) — 9 сообщ., тулы: AskUserQuestion, Bash, Edit, Read, Write*
diff --git a/notes/claude/2026-06-28-013755-httpsmaildttbrudomainadmin-можешь-найти-креды.md b/notes/claude/2026-06-28-013755-httpsmaildttbrudomainadmin-можешь-найти-креды.md
new file mode 100644
index 0000000..55f91c3
--- /dev/null
+++ b/notes/claude/2026-06-28-013755-httpsmaildttbrudomainadmin-можешь-найти-креды.md
@@ -0,0 +1,33 @@
+---
+date: 2026-06-28
+type: claude-session
+session_id: ac82ac49-7dd6-476e-9fd0-e10687c8867c
+started: 2026-06-27T19:43:29.595Z
+ended: 2026-06-27T22:37:55.277Z
+messages: 10
+tools: [AskUserQuestion, Bash, Edit, Read, Write]
+tags: [claude, session]
+---
+
+# https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Запрос
+
+https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Итог (последний ответ Claude, до 500 симв.)
+
+Всё на стороне mailcow готово: `:995` (POP3S) и `:993` (IMAPS) открыты из интернета, cert валиден, у всех ящиков dttb доступ по imap/pop3 включён. Делать надо **в самом Яндексе** — он будет подключаться к `mail.dttb.ru` и забирать почту.
+
+## В Яндекс.Почте
+Настройки (⚙️) → **Все настройки** → **«Сбор почты с других ящиков»** → добавить ящик.
+
+Если попросит вручную указать сервер:
+
+| Параметр | Значение |
+|---|---|
+| Протокол | **POP3** (сборщик Яндекса работает по POP3) |
+| Сервер | `mail.dttb.r
+
+---
+*Автосохранено из session [`ac82ac49`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/ac82ac49-7dd6-476e-9fd0-e10687c8867c.jsonl) — 10 сообщ., тулы: AskUserQuestion, Bash, Edit, Read, Write*
diff --git a/notes/claude/2026-06-28-014038-httpsmaildttbrudomainadmin-можешь-найти-креды.md b/notes/claude/2026-06-28-014038-httpsmaildttbrudomainadmin-можешь-найти-креды.md
new file mode 100644
index 0000000..925efd7
--- /dev/null
+++ b/notes/claude/2026-06-28-014038-httpsmaildttbrudomainadmin-можешь-найти-креды.md
@@ -0,0 +1,35 @@
+---
+date: 2026-06-28
+type: claude-session
+session_id: ac82ac49-7dd6-476e-9fd0-e10687c8867c
+started: 2026-06-27T19:43:29.595Z
+ended: 2026-06-27T22:40:38.301Z
+messages: 11
+tools: [AskUserQuestion, Bash, Edit, Read, ToolSearch, WebSearch, Write]
+tags: [claude, session]
+---
+
+# https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Запрос
+
+https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Итог (последний ответ Claude, до 500 симв.)
+
+Проверил — я был неправ про «только POP3». Актуально: **сборщик Яндекса работает по IMAP и даже использует его по умолчанию.**
+
+## IMAP-сбор — параметры (на нашей стороне всё готово)
+| Параметр | Значение |
+|---|---|
+| Протокол | **IMAP** |
+| Сервер | `mail.dttb.ru` |
+| Порт | `993` |
+| Шифрование | **SSL вкл.** |
+| Логин | полный адрес, напр. `support@dttb.ru` |
+| Пароль | пароль ящика |
+
+В Яндексе: ⚙️ → Все настройки → «Сбор почты с других ящиков» → ввести адрес+пароль (сервер подхватится сам,
+
+---
+*Автосохранено из session [`ac82ac49`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/ac82ac49-7dd6-476e-9fd0-e10687c8867c.jsonl) — 11 сообщ., тулы: AskUserQuestion, Bash, Edit, Read, ToolSearch, WebSearch, Write*
diff --git a/notes/claude/2026-06-28-014229-httpsmaildttbrudomainadmin-можешь-найти-креды.md b/notes/claude/2026-06-28-014229-httpsmaildttbrudomainadmin-можешь-найти-креды.md
new file mode 100644
index 0000000..ef078e0
--- /dev/null
+++ b/notes/claude/2026-06-28-014229-httpsmaildttbrudomainadmin-можешь-найти-креды.md
@@ -0,0 +1,30 @@
+---
+date: 2026-06-28
+type: claude-session
+session_id: ac82ac49-7dd6-476e-9fd0-e10687c8867c
+started: 2026-06-27T19:43:29.595Z
+ended: 2026-06-27T22:42:29.835Z
+messages: 12
+tools: [AskUserQuestion, Bash, Edit, Read, ToolSearch, WebSearch, Write]
+tags: [claude, session]
+---
+
+# https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Запрос
+
+https://mail.dttb.ru/domainadmin/ можешь найти креды
+
+## Итог (последний ответ Claude, до 500 симв.)
+
+Сохранено в [mailcow-dttb.md](projects/dttb/mailcow-dttb.md) — раздел «Внешний сбор почты (Яндекс и др.)»: параметры IMAP/POP3, что Яндекс-сборщик по умолчанию IMAP, разница протоколов и обратное направление (Sync job с Яндекса).
+
+Заодно за эту сессию в той же заметке уже зафиксировано всё:
+- фикс входящего спама (SNAT на роутере)
+- SSL mail-портов + авто-синхрон cert из NPM
+- апдейт mailcow `2026-05c` + **урок про обязательный forward-zone unbound**
+- логотип UI, BIMI + подпись
+- Roundcube на `
+
+---
+*Автосохранено из session [`ac82ac49`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/ac82ac49-7dd6-476e-9fd0-e10687c8867c.jsonl) — 12 сообщ., тулы: AskUserQuestion, Bash, Edit, Read, ToolSearch, WebSearch, Write*
diff --git a/projects/dttb/mailcow-dttb.md b/projects/dttb/mailcow-dttb.md
index d82c1e7..cfaa50e 100644
--- a/projects/dttb/mailcow-dttb.md
+++ b/projects/dttb/mailcow-dttb.md
@@ -6,6 +6,9 @@ tags: [dttb, mail]
# Mailcow dttb.ru (VM 107, 10.0.0.107)
+> **Версия:** `2026-05c` (обновлено 2026-06-28 с `2026-01` через `./update.sh -f`; снапшот отката `qm snapshot 107` = `pre_update_20260627`, удалить после недели стабильной работы).
+> 🚨 **УРОК АПДЕЙТА:** при апдейте откатывал tracked-правки конфигов и НЕ вернул forward-zone в unbound.conf → **почта легла** (postfix не резолвил MX/домены отправителей → reject `450 Domain not found` на всё входящее). Рекурсивный unbound на этом провайдере НЕ работает (RKN режет доступ к корневым DNS), forward-zone — **load-bearing**. Восстановлено возвратом forward-zone (см. ниже). **На будущих апдейтах unbound.conf forward-zone НЕ удалять / вернуть сразу после.** postfix-overrides (main.cf) mailcow восстанавливает сам.
+
## Общая информация
- **Web UI:** https://mail.dttb.ru (через NPM proxy host #25, SSL cert #106)
- **Admin:** admin / 1qaz!QAZ
@@ -19,6 +22,8 @@ tags: [dttb, mail]
- **Ящики:**
- admin@dttb.ru (пароль: 1qaz!QAZ)
- noreply@dttb.ru (пароль: 1qaz!QAZ)
+ - support@dttb.ru (пароль: 1qaz!QAZ)
+ - (плюс codex1..8@umnybot.ru, assistant@umnybot.ru — контур Александра)
## Подключение
- **SMTP:** mail.dttb.ru:587 (STARTTLS) или mail.dttb.ru:465 (SMTPS)
@@ -31,8 +36,8 @@ tags: [dttb, mail]
- **MAILCOW_HOSTNAME:** mail.dttb.ru
- **SKIP_LETS_ENCRYPT:** y (SSL через NPM)
- **SKIP_UNBOUND_HEALTHCHECK:** y
-- **Unbound:** forward-zone к 8.8.8.8/1.1.1.1 в unbound.conf (обязательно для доставки!)
-- **SSL:** self-signed cert для SMTP/IMAP (mail.dttb.ru), NPM cert для HTTPS web
+- **Unbound:** ⚠️ **ОБЯЗАТЕЛЬНА forward-zone** к 8.8.8.8/1.1.1.1 в `data/conf/unbound/unbound.conf` (в самом конце файла). Рекурсивный резолвинг на этом провайдере НЕ работает (RKN режет корневые DNS) → без forward почта не доставляется (postfix reject `450 Domain not found`). Это НЕ band-aid, а необходимость. 2026-06-28 убрал по ошибке → положил почту, вернул. Минус 8.8.8.8: Spamhaus отшивает публичные резолверы, но postscreen_dnsbl_sites завязан на конкретные коды 127.0.0.x → ложных reject не даёт. После рестарта unbound даёт резолв через ~5-10 сек (не паниковать раньше). Проверка: `docker exec ...unbound... drill gmail.com @127.0.0.1` (ANSWER:>0).
+- **SSL:** web (:443) — cert NPM; mail-порты (25/465/587/993/995) — тот же LE-cert из NPM, синхронизируется cron'ом (см. ниже «SSL на mail-портах»)
- **Docker контейнеры:** 18 шт (postfix, dovecot, rspamd, nginx, mysql, redis и др.)
## OpenWrt проброс портов → 10.0.0.107
@@ -62,6 +67,65 @@ tags: [dttb, mail]
- ⚠️ **PTR отсутствует** — единственная дыра доставляемости. Strict-провайдеры (Gmail → спам, Mail.ru → reject) штрафуют письма с IP без reverse DNS.
- ⚠️ **IP = OOO Istranet** (`netname istranet`, RU), не Spaceweb. PTR ставит Istranet (как интернет-провайдер по этому WAN-IP), не регистратор DNS.
- 🔸 В DNS висит лишний `TXT @ "mailru-domain: 09KURdxlbSVmAm4O"` — остаток попытки привязать Mail.ru для домена; на Mailcow не влияет, можно убрать.
+
+## Брендинг писем — BIMI + подпись (2026-06-28)
+**Цель:** логотип dttb при отправке писем со всех ящиков.
+
+**BIMI** (лого-аватар у отправителя в инбоксе Apple Mail и др.; Gmail/Yahoo требуют платный VMC ~$1000/год — пока без него):
+- SVG (профиль **SVG Tiny PS**, конверт без текста — шрифт `SG` для BIMI не годится): `data/web/bimi/dttb.svg` на mailcow → публично `https://mail.dttb.ru/bimi/dttb.svg` (200, image/svg+xml, проверено снаружи). Исходник в `snippets/dttb-mail-branding/dttb-bimi.svg`.
+- DMARC уже `p=quarantine` — BIMI-eligible.
+- **ОСТАЛОСЬ (DNS, у Олега/в Spaceweb-панели vps.sweb.ru):** TXT `default._bimi.dttb.ru` = `v=BIMI1; l=https://mail.dttb.ru/bimi/dttb.svg;`. API sweb требует сессию панели (токена в vault нет) — автоматом не добавить.
+
+**Подпись с логотипом** (`snippets/dttb-mail-branding/signature.html`, лого-PNG `https://mail.dttb.ru/bimi/dttb-logo.png`):
+- Готовый HTML-сниппет под вставку в SOGo (Preferences→Mail) и в клиенты (Thunderbird/iPhone).
+- ⚠️ Серверного футера «на всех клиентов» НЕ ставил: вставка тела после DKIM-подписи Rspamd ломает DKIM. Корректный путь — footer-milter ДО Rspamd (отдельный проект, не делал).
+
+## Внешний сбор почты (Яндекс и др.) — 2026-06-28
+Чтобы внешний сервис (напр. Яндекс) **забирал** почту из ящика dttb.ru к себе. Настраивается **на стороне Яндекса** (он подключается к нам), на mailcow ничего не нужно — `:993`/`:995` открыты из интернета, cert валиден, imap/pop3 у всех ящиков dttb включены (`attributes.imap_access/pop3_access=1`).
+
+Параметры подключения для любого сборщика:
+| | IMAP | POP3 |
+|---|---|---|
+| Сервер | `mail.dttb.ru` | `mail.dttb.ru` |
+| Порт | `993` | `995` |
+| Шифрование | SSL | SSL |
+| Логин | полный адрес (`support@dttb.ru`) | то же |
+
+**Яндекс:** ⚙️ → Все настройки → «Сбор почты с других ящиков» → адрес+пароль (сервер подхватится). **Яндекс-сборщик по умолчанию IMAP** (не POP3, как было раньше). IMAP = зеркалит всю структуру папок + статусы, но нельзя выбрать целевую папку. POP3 = только Входящие, зато можно сложить в конкретную папку/метку. Первый сбор за пару минут, далее от неск. раз/час до раза в неск. дней (решает Яндекс).
+Справка: https://yandex.ru/support/mail/web/preferences/collector.html
+
+**Обратное направление** (mailcow забирает с Яндекса в ящик dttb): mailcow UI → ящик → **Sync jobs**, IMAP `imap.yandex.ru:993`, для Яндекса нужен **пароль приложения** (не основной).
+
+## Roundcube — второй вебмейл (2026-06-28)
+Поставлен рядом с SOGo, **на `https://mail.dttb.ru/rc/`** (родной nginx mailcow, без нового поддомена/DNS/NPM — wildcard *.dttb.ru НЕТ). Скин Elastic, заголовок «dttb Mail».
+- Контейнер `roundcube-mailcow` (`roundcube/roundcubemail:latest-fpm-alpine`) через `docker-compose.override.yml`.
+- БД `roundcube` в mysql-mailcow (юзер `roundcube` / `df8de490bea7641fd34904cc95b29428`), схема создаётся образом сама (`initdb.sh --update`).
+- IMAP `ssl://dovecot:993`, SMTP `tls://postfix:587` (внутр. алиасы сети); cert CN=mail.dttb.ru ≠ имя контейнера → в `data/conf/roundcube/extra.php` выключена проверка cert (`imap/smtp_conn_options verify_peer=false`) — трафик внутри docker-бриджа.
+- Файлы вебрута: **bind** `./data/web/rc` → `/var/www/html` (НЕ named-том: у nginx mailcow rootfs read-only, том в /web/rc не примонтировать). nginx видит их через существующий `/web`. Новый Roundcube 1.6 — вебрут в `public_html/`, поэтому в nginx alias = `/web/rc/public_html/`, SCRIPT_FILENAME = `/var/www/html/public_html/$rcfile`.
+- nginx-локация: `data/conf/nginx/site.roundcube.custom` (подключается через `include site.*.custom` в sites-default). `ROUNDCUBEMAIL_REQUEST_PATH=/rc/`.
+- Вход проверен (admin@dttb.ru → 302 _task=mail). Плагины: archive, zipdownload, managesieve.
+- ⚠️ На апдейтах mailcow override и data/web/rc untracked — переживают; при больших обновлениях Roundcube — `docker compose pull roundcube-mailcow && up -d` (схема обновится сама).
+
+## Логотип UI (2026-06-28)
+Кастомный логотип `dttb` (монограмма) на странице входа/в шапке. Хранится в **Redis** ключами `MAIN_LOGO` + `MAIN_LOGO_DARK` как `data:image/png;base64,...` (как делает UI → Customize). Поставлен **PNG** (не SVG: в SVG текст шрифтом `SG`, который в `
` не доступен → ставится дефолтный). Источник: `~/Downloads/export/dttb-01-monogram.png` (ужат 2048→1024, лимит mailcow 1920). Сброс: UI → Customize → Reset, или `redis-cli DEL MAIN_LOGO MAIN_LOGO_DARK`.
+
+## SSL на mail-портах (фикс 2026-06-27)
+`SKIP_LETS_ENCRYPT=y` → ACME-контейнер mailcow ничего не делает. Cert для mail-портов владеет **NPM** (`npm-106`, ECDSA LE, авто-продление). При установке (Mar 7) его положили в `data/assets/ssl/` **вручную** и забыли про продление → **cert протух 2 июня 2026**, клиенты IMAP/SMTP ругались на сертификат.
+**Решение:** авто-синхрон cert из NPM в mailcow.
+- Скрипт: `/root/sync-mailcow-cert.sh` на **Proxmox** `10.0.0.250` (копия в `snippets/sync-mailcow-cert.sh`).
+- Берёт `pct exec 103 -- cat /data/compose/2/letsencrypt/live/npm-106/{fullchain,privkey}.pem`, сравнивает fingerprint с `10.0.0.107:/opt/mailcow-dockerized/data/assets/ssl/cert.pem`, при отличии — бэкап + замена + reload postfix/dovecot/nginx.
+- SSH Proxmox→mailcow по ключу `/root/.ssh/mailcow_sync`.
+- Cron: `/etc/cron.d/mailcow-cert-sync` — ежедневно 04:30, лог `/var/log/mailcow-cert-sync.log`.
+- Ручной прогон: `/root/sync-mailcow-cert.sh`.
+- Cert: ECDSA P-384, LE E-series; пару проверять по pubkey (`openssl rsa` на нём врёт — даёт пустой modulus).
+
+## ⚠️ КОРНЕВОЙ ФИКС входящего спама (2026-06-27)
+Жалоба: письма на `support@dttb.ru` (новый ящик) падают в спам, на старые ящики — нет.
+**Корень:** на домашнем OpenWrt (`10.0.0.1`) у LAN-зоны было `masq=1`. Входящее `WAN:25 → DNAT → 10.0.0.107` уходило в LAN-зону и **SNAT'илось в `10.0.0.1`** → postfix/rspamd видели source = `10.0.0.1` для **ВСЕХ** внешних писем.
+Следствие на каждом входящем: `RDNS_NONE=2.0` + `HFILTER_HOSTNAME_UNKNOWN=8.5` (+10.5), а у строгих отправителей ещё `R_SPF_FAIL=8.0` (SPF против 10.0.0.1) → reject (так резались «Welcome to NetBird»). Бьёт по всему серверу; старый ящик спасал только обученный Bayes (ham −3..−5), новый `support@` тонул.
+**Фикс (UCI, не сырой nft — грабли fw4):** на `10.0.0.1` добавлено `config nat 'No-SNAT-to-Mailcow'` (src=lan, proto=tcp, dest_ip=10.0.0.107, target=ACCEPT) + `fw4 reload`. Стоит в srcnat до masquerade.
+**Проверено:** тест с внешнего `89.111.140.86` → rspamd увидел реальный `89.111.140.86` (не `10.0.0.1`). Для отправителей с нормальным PTR/MX/DKIM (Яндекс/Gmail) +10.5 больше не срабатывает.
+Не трогал глобальный `lan masq=1` (на нём может висеть VPN/podkop-маршрутизация) — фикс точечный и обратимый (`uci delete firewall.@nat[0]`).
- 🔸 **SSH-доступ к VM не работает ни одним ключом** (id_rsa «claude-code-matrix-project», id_ed25519, ключ Proxmox). VM клонирована с НИИКН VM 106 → несёт чужой authorized_keys. Управление возможно через web-UI (admin/1qaz!QAZ); для шелла — добавить ключ через Proxmox console.
## Вариант «почтовый шлюз через VPS» (оценка 2026-06-18)
diff --git a/snippets/dttb-mail-branding/dttb-bimi.svg b/snippets/dttb-mail-branding/dttb-bimi.svg
new file mode 100644
index 0000000..3dcf48e
--- /dev/null
+++ b/snippets/dttb-mail-branding/dttb-bimi.svg
@@ -0,0 +1,8 @@
+
diff --git a/snippets/dttb-mail-branding/dttb-sig-logo.png b/snippets/dttb-mail-branding/dttb-sig-logo.png
new file mode 100644
index 0000000..e1efae0
Binary files /dev/null and b/snippets/dttb-mail-branding/dttb-sig-logo.png differ
diff --git a/snippets/dttb-mail-branding/signature.html b/snippets/dttb-mail-branding/signature.html
new file mode 100644
index 0000000..b8c828a
--- /dev/null
+++ b/snippets/dttb-mail-branding/signature.html
@@ -0,0 +1,13 @@
+
+
+ |
+
+ Олег Батлаев
+ dttb.ru
+
+ |
+