Пост

Marchi. Архиватор электронной почты на собственном сервере

Self-hosted сервис архивации почты с шифрованием, s3 репликацией и восстановлением.

Когда речь идёт о бэкапах, как правило, мы говорим о файлах, бд или системах целиком, но из виду упускается электронная почта, работа с которой, порой, полностью перекладывается на сторону провайдера.

Для закрытия этого важного упущения на GitHub появился проект Marchi - self-hosted сервис архивации электронной почты. Подключает IMAP-аккаунты, в фоне забирает письма по настраиваемым правилам, складывает локально (SQLite + Maildir), даёт полнотекстовый поиск, умеет реплицировать архив в S3 с шифрованием и восстанавливать письма обратно в ящик. Один бинарник на Go, без внешних зависимостей, Web UI на русском и английском.

⚠️ Сразу отмечаем, что проект довольно сырой - на момент публикации версия 0.1.2.

Установка

Среди поддерживаемых систем только Linux (amd64/arm64), запуск - через Docker или systemd. Самый быстрый путь:

1
2
3
git clone https://github.com/yurydemin/marchi.git
cd marchi
docker compose up

Сервис поднимается на https://localhost:8443 с самоподписанным TLS-сертификатом, на который, конечно, поругается браузер - принимаем и идём дальше. Данные живут в именованном volume marchi-data и переживают перезапуски.

Первый запуск

Вместо пары логин/пароль администратора - экран разблокировки с полем Master Key (минимум 12 символов), который нужно задать при первом входе.

marchi-1-screenshot-1

Это не учётка, а ключ, из которого формируется ключ шифрования, которым будут зашифрованы пароли IMAP-аккаунтов, OAuth2-токены и S3-ключи. Забыли пароль - данные не восстановить никак, это не «сброс через email», поэтому в обязательном порядке запоминаем.

Особенность: после каждого рестарта контейнера сервис стартует заблокированным и ждёт ручной разблокировки. Пока заблокирован - синхронизация не идёт. Чтобы не вбивать ключ при каждой перезагрузке, предусмотрена переменная MARCHI_MASTER_KEY в .env.

Подключение почтового аккаунта

Раздел Аккаунты → «Добавить аккаунт»: email, IMAP-сервер, порт (993/SSL по умолчанию), логин, пароль. Для Gmail/Outlook с двухфакторкой - пароль приложения, либо OAuth2.

marchi-1-screenshot-2

В строке добавленного аккаунта есть кнопка “Проверить” - сервис подключается и показывает либо число найденных папок, либо текст ошибки сервера как есть.

marchi-1-screenshot-3

Дашборд и синхронизация

Дашборд (или Панель) - сводка по архиву (всего писем, активных аккаунтов, занято места локально и в s3) и таблица аккаунтов.

marchi-1-screenshot-4

Автосинхронизация идёт по cron-расписанию (по умолчанию раз в 6 часов), рядом с аккаунтом есть кнопка «Синхронизировать» для ручного запуска. Синхронизация инкрементальная (по UID).

Правила архивации

Раздел Правила. Если правил нет - архивируется всё подряд. Если есть - проверяются сверху вниз, побеждает первое совпавшее.

❗️ Действия на выбор: архивировать, пропустить, архивировать и удалить с сервера, архивировать и отметить прочитанным. Последние два - это уже жизненный цикл почты, но стоит быть аккуратным, особенно с “архивировать и удалить”, на боевом почтовом адресе проверять бы не стал без предварительной проверки.

marchi-1-screenshot-5

Поиск по архиву

Раздел Архив: слева дерево «аккаунт → папки», сверху поиск — полнотекстовый индекс по теме, телу, отправителю и вложениям, с фильтрами по дате/аккаунту/папке и сортировкой по релевантности или дате. Клики по письму открывает его просмотр - заголовок, тело, подчищенный HTML, вложения.

marchi-1-screenshot-6

Восстановление

Отмечаем письма чекбоксами (или берём все результаты поиска), выбираем целевой аккаунт и папку, жмём «Восстановить выбранное». Технически это IMAP APPEND в целевую папку с автоматическим фолбэком на SMTP, если сервер команду не поддерживает.

marchi-1-screenshot-7

Настройки

Раздел Настройки: смена Master Key, подключение S3 (эндпоинт, регион, бакет, ключи; path-style для MinIO и self-hosted; read-only «Проверить подключение»), OAuth2-приложения, retention по умолчанию и пересборка поискового индекса.

marchi-1-screenshot-8

Retention представляет из себя трёхуровневый жизненный цикл письма: локально → перенос в S3 → окончательное удаление, с порогами в днях глобально и на уровне аккаунта.

S3-репликация шифрует каждый объект на клиенте (AES-256-GCM) до загрузки - провайдер хранилища видит только шифротекст. Локально потестировать можно без облака: docker compose --profile s3 up поднимает MinIO, консоль на http://localhost:9001.

Выводы

Инструмент уже в первых своих версиях предоставил полный цикл работы с письмами - архивация, поиск, репликация, retention, восстановление, экспорт, а также CLI интерфейс и Prometheus метрики.

Держим в голове, что проект совсем недавно появился, много нюансов еще не было учтено и протестировано, а потому рекомендовать как единственное решение в арсенале для бэкапа почты еще слишком рано, но поставить, поэкспериментировать и следить за развитием определённо стоит.

🌐 Ссылка на репозиторий проекта

Больше полезной информации в Telegram-канале