Compare commits
2 Commits
01036fe2d9
...
ddb904ca21
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ddb904ca21 | ||
|
|
58fd3fa17a |
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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 грузит логотип как `<img>`, кастомный шрифт недоступен → «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*
|
||||
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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`, который в `<img>` не доступен → ставится дефолтный). Источник: `~/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)
|
||||
|
||||
8
snippets/dttb-mail-branding/dttb-bimi.svg
Normal file
8
snippets/dttb-mail-branding/dttb-bimi.svg
Normal file
@@ -0,0 +1,8 @@
|
||||
<svg version="1.2" baseProfile="tiny-ps" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024">
|
||||
<title>dttb</title>
|
||||
<rect width="1024" height="1024" fill="#2A6FDB"/>
|
||||
<g transform="translate(232 222) scale(4.827586)" fill="none" stroke="#ffffff" stroke-width="7" stroke-linecap="round" stroke-linejoin="round">
|
||||
<rect x="6" y="20" width="104" height="76" rx="14"/>
|
||||
<path d="M10 28 L58 64 L106 28"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 414 B |
BIN
snippets/dttb-mail-branding/dttb-sig-logo.png
Normal file
BIN
snippets/dttb-mail-branding/dttb-sig-logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.8 KiB |
13
snippets/dttb-mail-branding/signature.html
Normal file
13
snippets/dttb-mail-branding/signature.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<table style="border-collapse:collapse;font-family:Arial,Helvetica,sans-serif;color:#161616;font-size:13px">
|
||||
<tr>
|
||||
<td style="padding-right:14px;vertical-align:middle">
|
||||
<img src="https://mail.dttb.ru/bimi/dttb-logo.png" width="56" height="56" alt="dttb"
|
||||
style="display:block;border-radius:12px;border:0">
|
||||
</td>
|
||||
<td style="vertical-align:middle;border-left:3px solid #2A6FDB;padding-left:14px">
|
||||
<div style="font-weight:700;font-size:15px;line-height:1.2">Олег Батлаев</div>
|
||||
<div style="color:#555;line-height:1.4">dttb.ru</div>
|
||||
<div style="line-height:1.4"><a href="mailto:support@dttb.ru" style="color:#2A6FDB;text-decoration:none">support@dttb.ru</a></div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
50
snippets/sync-mailcow-cert.sh
Normal file
50
snippets/sync-mailcow-cert.sh
Normal file
@@ -0,0 +1,50 @@
|
||||
#!/bin/bash
|
||||
# sync-mailcow-cert.sh
|
||||
# Копирует LE-сертификат mail.dttb.ru из NPM (LXC 103) в mailcow (VM 107)
|
||||
# и перезагружает почтовые сервисы ТОЛЬКО при изменении сертификата.
|
||||
# Причина: mailcow с SKIP_LETS_ENCRYPT=y не продлевает cert сам; cert владеет NPM.
|
||||
# История: cert на mail-портах протух 2026-06-02, чинили вручную 2026-06-27.
|
||||
set -euo pipefail
|
||||
|
||||
NPM_CTID=103
|
||||
NPM_DIR="/data/compose/2/letsencrypt/live/npm-106"
|
||||
MC_HOST="root@10.0.0.107"
|
||||
MC_KEY="/root/.ssh/mailcow_sync"
|
||||
MC_SSL="/opt/mailcow-dockerized/data/assets/ssl"
|
||||
SSHMC="ssh -i $MC_KEY -o StrictHostKeyChecking=no -o ConnectTimeout=10 $MC_HOST"
|
||||
|
||||
TMP=$(mktemp -d); trap 'rm -rf "$TMP"' EXIT
|
||||
|
||||
pct exec "$NPM_CTID" -- cat "$NPM_DIR/fullchain.pem" > "$TMP/cert.pem"
|
||||
pct exec "$NPM_CTID" -- cat "$NPM_DIR/privkey.pem" > "$TMP/key.pem"
|
||||
|
||||
# sanity-проверки
|
||||
openssl x509 -in "$TMP/cert.pem" -noout >/dev/null 2>&1 || { echo "$(date '+%F %T') ERR: битый cert из NPM"; exit 1; }
|
||||
[ -s "$TMP/key.pem" ] || { echo "$(date '+%F %T') ERR: пустой key из NPM"; exit 1; }
|
||||
CPUB=$(openssl x509 -in "$TMP/cert.pem" -noout -pubkey | openssl md5)
|
||||
KPUB=$(openssl pkey -in "$TMP/key.pem" -pubout 2>/dev/null | openssl md5)
|
||||
[ "$CPUB" = "$KPUB" ] || { echo "$(date '+%F %T') ERR: cert и key не пара"; exit 1; }
|
||||
|
||||
NEW=$(openssl x509 -in "$TMP/cert.pem" -noout -fingerprint -sha256)
|
||||
CUR=$($SSHMC "openssl x509 -in $MC_SSL/cert.pem -noout -fingerprint -sha256" 2>/dev/null || echo none)
|
||||
if [ "$NEW" = "$CUR" ]; then
|
||||
echo "$(date '+%F %T') cert не изменился — пропуск"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "$(date '+%F %T') обнаружен новый cert — деплой"
|
||||
scp -i "$MC_KEY" -o StrictHostKeyChecking=no "$TMP/cert.pem" "$TMP/key.pem" "$MC_HOST:/tmp/"
|
||||
$SSHMC "
|
||||
set -e
|
||||
cd /opt/mailcow-dockerized
|
||||
TS=\$(date +%Y%m%d-%H%M%S)
|
||||
cp $MC_SSL/cert.pem $MC_SSL/cert.pem.bak-\$TS
|
||||
cp $MC_SSL/key.pem $MC_SSL/key.pem.bak-\$TS
|
||||
mv /tmp/cert.pem $MC_SSL/cert.pem
|
||||
mv /tmp/key.pem $MC_SSL/key.pem
|
||||
chmod 644 $MC_SSL/cert.pem; chmod 600 $MC_SSL/key.pem
|
||||
docker compose exec -T postfix-mailcow postfix reload >/dev/null 2>&1 || docker compose restart postfix-mailcow
|
||||
docker compose exec -T dovecot-mailcow dovecot reload >/dev/null 2>&1 || docker compose restart dovecot-mailcow
|
||||
docker compose exec -T nginx-mailcow nginx -s reload >/dev/null 2>&1 || true
|
||||
"
|
||||
echo "$(date '+%F %T') задеплоен: $NEW"
|
||||
Reference in New Issue
Block a user