Как я делаю бэкапы почты
“Люди делятся на две категории: кто еще не делает бэкапы, и кто их уже делает” (с)
С бэкапами файлов всё, в целом, довольно понятно — есть множество решений разной сложности, как открытые, так и коммерческие. Если взять что-нибудь более специфическое, даже обычную почту, то открытые решения найти уже сложнее.
Мне кажется, что хорошее решение точно должно удовлетворять следующим требованиям:
- Дружественность file-based системам синхронизации: Dropbox, Яндекс.Диск и другие.
- Простота потенциального переноса данных на другое решение бэкапов. Не хочется сталкиваться с vendor lock-in в случае проблем.
- Бэкапы должны быть зашифрованы.
- Естественная поддержка нескольких почтовых ящиков.
- Хочется легко извлекать результаты простых запросов, например, “все письма с таким автором”, без сложных процедур импорта.
До этого у меня на домашнем сервере был настроен бэкап по IMAP по каждому из аккаунтов. Хотелось получить какой-то более простой интерфейс к поиску, чем grep и не хранить лишнее.
В итоге я пришёл к самописному решению, которое удовлетворяло всем требованиям, оставаясь компактным при этом. Схема работы такая:
- Есть два места для сохранения результатов: небольшая sqlite база с метаданными и некоторое файловое хранилище (далее просто хранилище), которое может быть S3 корзиной, локальной директорией или чем-нибудь ещё. Хранилище используется только на запись, поэтому поверх него можно добавить GPG шифрование.
- Сначала используется mail-parser для извлечения простых метаданных из данных письма.
- По этим метаданным добавляем запись в sqlite базу с адресами участников, темой письма и временем. Этого достаточно для большинства простых запросов.
- Извлекаем вложения, метаданные по ним сохраняем в sqlite, а сами файлы — в хранилище.
- Сохраняем полные данные письма, кроме уже сохранённых вложений, в хранилище.
Проще всего поддерживать сохранение объектов в локальную директорию, поэтому сейчас поддерживается только оно. Слой шифрования достаточно естественно добавляется ещё одним решением, gocryptfs reverse mode. Мой полный бэкап почты остаётся достаточно компактным, чтобы можно было не разделять метаданные и объекты. В таком случае процесс бэкапа целиком выглядит так:
- Получить mbox по всем аккаунтам
- Обработать mbox и сохранить новые объекты, добавить новые метаданные.
- Добавить слой шифрования с помощью reverse mode в gocryptfs.
- Сохранить на бэкап хранилища.
Актуальная версия моего решения вместе с подробной информацией по использованию лежит на GitHub.