Некоторое время назад прочитал в очередной раз о случаях прекращения предоставления доступа к почте по почтовым протоколам. Потеря почты -- это уже слишком! -- подумал я. (Доступ только по web для меня -- синоним её отсутствия). В общем, так я и созрел для своего почтового сервера!
# Попытка 1 -- vps
В качестве домашнего сервера для пет-проектов и личной странички у меня используется rpi4 с 4Гб. Система установлена на SD карточке. Запись на карточку минимизирована (логи пишутся в память и т.д.) Поэтому я сразу решил, что для классического почтового стека этого будет маловато и собирался для пробы сделать почтовый сервер на каком-нибудь vps.
Почитал где-то, что на 4vps.su хорошие условия для почты (ptr-запись, фильтрация, цены). Взял у них vps-ку. И сразу (ожидаемо) столкнулся с фильтрацией портов smtp. Я сделал заявку на их открытие и начал ждать.
Пока заявка висела, я ради разминки поднял matrix сервер. Причём не synapse, а tuwunel -- реализацию на Rust. Я всегда плохо относился к Rust как к явлению, но честно говоря -- начал менять своё мнение. В том числе и потому, что с утилитарной точки зрения, с этим софтом так же удобно, как и с софтом написанном на Go. Ты можешь скачать статический бинарник, ты можешь его собрать сам (в том числе, в режиме кросс-компиляции). Закинуть на сервер и ... всё! При этом, по ресурсам это будет легче, чем бесконечные слои на питоне (да ещё, как правило, внутри докера запущенные). В общем, если вы ненавидите Rust, то извините за потерю доверия! :) Так или иначе, введение в строй tuwunel оказалось довольно простой и приятной задачей. Одновременно с этим в качестве обратного прокси первый раз воспользовался caddy. И тоже оказался доволен. Потом добавил ещё поддержку видеозвонков через livekit. Всё это без контейнеров, руками. Список сервисов, которые в итоге понадобилось поднять:
- caddy (обратный прокси);
- livekit (поддержка видеозвонков);
- lk-jwt-service (для генерации jwt токенов для авторизации в livekit);
- tuwunel (matrix сервер).
Пока я этим занимался, заявка так и висела без ответа. Между тем я обнаружил, что мой домашний провайдер не блокирует 25 порт! (У меня статический адрес). Кроме того, мне пришло в голову, что нет такой уж большой разницы -- заплатить условному яндексу за возможность работать по imap или делать свой vps. И тут, наконец, меня окончательно прорвало! Никаких компромиссов! Только self-hosted!
# Попытка 2 -- rpi4
Я люблю работать на старом железе (кроме ssh и почты мне почти ничего не нужно), поэтому уже второй раз заказываю Thinkpad T480. Старый пришлось отдать дочке. Я вытащил из старого ноута M2 носитель и думал, что просто вставлю его в новый T480, когда он придёт. Но в новом ноуте, как оказалось, стоит Sata SSD без нужного переходника под M2. В итоге, у меня оказался лишний M2 на 512Гб. Для переноса данных я также купил переходник-контроллер с M2 на USB. И вот, теперь оказалось, что этот M2 можно воткнуть в малинку!
Мне было лень переставлять систему на M2, поэтому я просто примонтировал его как дополнительное хранилище. Можно делать из этого сервер!
Сразу же повторил настройку matrix. Подключил к matrix домашних и тут заметил очевидный бонус! Весь трафик остаётся внутри моей квартиры, когда участники чата находятся дома! Вроде бы очевидно. Но... Я об этом окрыляющем факте до этого как-то не задумывался. Например, пересылая файлы членам семьи я понимаю, что эти данные прямо сейчас никуда не уходят. И оседают на моём же сервере, прямо здесь -- на полке. И что даже если отключат интернет, этот чат будет работать хотя бы в пределах моей квартиры, предоставляя функцию -- скинуть что-то члену семьи (или сделать запись в "избранном" для себя). Это очень вдохновляет!
Но всё-таки, основной задачей было поднятие почтового сервера. Порты smtp мой провайдер не рубил. Однако, нужно было задать ptr запись. Эту проблему я решил оставить на потом.
Первоначально в качестве почтового стека я собирался поднять что то "классическое". Даже поглядывал в сторону готовых контейнеров типа mailcow. Но мне было жаль ресурсов малинки. И я снова решил попробовать с софтом на Rust. Поставил stalwart. Это "комбайн" всё в одном. Без лишних предисловий -- легко настраивается, запускается и работает!
До сих пор в качестве dns-хостинга я пользовался yandex (они предоставляли это бесплатно при условии, что ты в качестве mx записи указываешь yandex). По понятным причинам, пришлось отказаться от этой схемы. Заплатил своему регистратору доменных имён (active.domains). stalwart в админке пишет какие записи в DNS нужно добавить. В том числе и DKIM.
Ради интереса попробовал (пока без ptr записи) послать письма. Понятно, что принимать можно всё. А вот на отправке, некоторые серверы помечают письмо как спам. Я сейчас уже не помню, но кто-то из "гигантов": mail.ru или yandex.ru. То-есть, в целом, без ptr записи даже как буд-то можно жить. Но разве это жизнь? :)
# ptr запись
Что делать с ptr записью было непонятно. Никакой админки у провайдера нет. Позвонил в суппорт и начался ад. Девочки не понимали, что я от них хочу. Пытались отправить ко мне мастера. Пытались объяснить мне, что нельзя настраивать DNS самому и т.д. и т.п. Постоянно кому-то звонили и переспрашивали. В конце-концов так это всё надоело, что пришлось просто твёрдо (надеюсь, не грубо) сказать: у вас нет компетенции обсуждать этот вопрос, я прошу связать меня со следующей линией поддержки.
Через минут 30-40 удалось выйти на связь с технарём. Ну и он понял меня с полуслова, дал e-mail. Я написал ему какая запись мне нужна и ... на следующий день у меня была ptr-запись. Почта стала ходить везде! Да, я намеренно не пишу название провайдера. Это выглядит наивно, но я боюсь :) Я понял, что всё очень зыбко. Так не должно быть, но так есть. Сегодня свой почтовый сервер не норма, а привилегия! И перекрыть её очень легко.
Всё заработало! Я закрыл уже не нужный (но до сих пор открытый!) тикет в 4vps.su. Запустил на vps сервере Armagetron Advanced (так как сервер был оплачен на месяц). Добавил в почтовые клиенты свой домашний сервер и начал им пользоваться в личной переписке. Ничего не предвещало беды.
# Проблемы с M2
Через сутки отвалился M2-диск. Так повторялось несколько раз. Проблема. Я до сих пор не знаю что именно её решило. Я сделал две вещи. Переткнул кабель в USB3 (до этого, по ошибке, M2 контроллер висел на USB2). И прописал строчку к параметрам ядра: usb-storage.quirks=0bda:9210:u usbcore.autosuspend=-1. На всякий случай, мой контроллер: 0bda:9210 Realtek Semiconductor Corp. RTL9210 M.2 NVME Adapter. После этого, отвалы прекратились (последний аптайм 39 дней).
Пугали температурой при такой конфигурации (малинка без кулера, но с радиатором). С ней всё
отлично. В простое 48C. Под нагрузкой не превышает 60C.
# Другие сервисы
Конечно, я быстро вошёл во вкус и стал добавлять сервисы. Например -- сетевой диск (по webdav) на основе dufs. Кстати, по webdav можно синхронизовать Obsidian (я не пользуюсь, но проверял - работает). Периодически что-то добавляю, убираю. А ещё в конфиге caddy начало появляться что-то вроде:
@aibots {
header_regexp User-Agent (?i)(SemrushBot|AWS|Amazon|GPTBot|ChatGPT|ClaudeBot|anthropic-ai|Google-Extended|CCBot|FacebookBot|Omgilibot|meta-externalagent)
}
abort @aibots
Возможность иметь физический доступ к своему серверу "здесь и сейчас", полностью его контролировать -- меняет очень многое. Конечно, я рассматриваю случай, когда в качестве сервера достаточно безвентиляторного одноплатника. Но как оказалось, для моей задачи этого хватило!
# Что дальше?
К сожалению, полностью расслабиться не получится. Впереди меня ждет верификация .ru домена через Госуслуги. Я абсолютно нормально к этому отношусь, готов пройти её. Но как обычно, я опасаюсь что что-то будет недоработано, что-то пойдёт не так, как это всегда происходит. Я ещё помню как приходилось отлаживать электронный дневник школьника, подменяя ответы от сервера через свой прокси, воюя с техподдержкой в попытках выйти на технарей. Я до сих пор не понимаю, как удалось решить проблему с допуском моего сына к МЭШ. А ведь технически - проблема была тривиальна! Но не было способа пробиться через бюрократический аппарат поддержки. А сейчас всё только усугубилось. В общем, пока в моём понимании .ru домены под угрозой.
Вторая потенциальная проблема -- сертификаты. Меня умиляет, что когда обсуждают новость о том, что GlobalSign отзывает сертификаты, обсуждаются проблемы браузеров (что _вообще_ не проблема), но никто (НИКТО!) не вспоминает о почте. В общем, не исключено, что в будущем почта будет ходить только в зоне .ru. Хотя даже чтобы придти и к этому сценарию (хоть что-то работает!) -- нужно поработать.
Кто-то скажет: зачем тебе сегодня почта? Это наверное единственный федеративный и не проприетарный протокол, который используют (так или иначе) все. Конечно, корпорации и дальше его будут пытаться уничтожить и оптимизма на этот счёт я не испытываю.
Не смотря на эти угрозы, я по прежнему очень рад что у меня получилось. Ощущаю себя как капитан собственной яхты, который вышел на ней в первый раз в океан. Впрочем, яхты у меня нет. ;)
P.S. Я собирался прикрепить сюда конфиги, однако на их "очистку" требуется время, которого у меня пока нет. Но мне кажется, ничего принципиально сложного в настройке нет и готовые конфиги наоборот, могут сослужить плохую службу. Так что пусть здесь будет просто картинка.
rpi4.png