Files
likemath.ru/posts/kak-ia-delaiu-bekapy-pochty/index.html
2020-11-04 00:23:14 +03:00

14 lines
8.2 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]--><!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]--><!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]--><!--[if gt IE 8]><!--><html class=no-js> <!--<![endif]--> <head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><title>Как я делаю бэкапы почты</title><meta name=description content><meta name=viewport content="width=device-width"><link rel=stylesheet href=../../theme/css/normalize.css><link href="https://fonts.googleapis.com/css?family=Forum|Oswald|PT+Sans|Philosopher|Ubuntu+Mono" rel=stylesheet><link rel=stylesheet href=../../theme/css/font-awesome.min.css><link rel=stylesheet href=../../theme/css/main.css><link rel=stylesheet href=../../theme/css/blog.css><link rel=stylesheet href=../../theme/css/github.css><link href=https://likemath.ru/feeds/all.atom.xml type=application/atom+xml rel=alternate title="Блог 529 Atom Feed"><link href=https://likemath.ru/feeds/all.rss.xml type=application/rss+xml rel=alternate title="Блог 529 RSS Feed"><script src=../../theme/js/vendor/modernizr-2.6.2.min.js></script></head> <body> <!--[if lt IE 7]>
<p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p>
<![endif]--> <div id=wrapper> <header id=sidebar class=side-shadow> <hgroup id=site-header> <a id=site-title href=../..><h2><i class=icon-pencil></i> Блог 529</h2></a> <p id=site-desc> Project Euler и остальное </p> </hgroup> <nav> <ul id=nav-links> <li><a href=../../ >Главная</a></li> <li><a href=../../pages/projects.html>Мои проекты</a></li> <li><a href=../../pages/about.html>Об авторе</a></li> <li><a href=../../feeds/feed.atom.xml>Atom feed</a></li> </ul> </nav> <footer id=site-info> <p> Powered by Pelican. </p> </footer></header> <div id=post-container> <ol id=post-list> <li> <article class=post-entry> <header class=entry-header> <time class=post-time datetime=2020-11-01T13:35:00+03:00 pubdate> Вс 01 ноября 2020 </time> <a href=../../posts/kak-ia-delaiu-bekapy-pochty/ rel=bookmark><h1>Как я делаю бэкапы&nbsp;почты</h1></a> </header> <section class=post-content> <blockquote> <p><span class=dquo>&#8220;</span>Люди делятся на две категории: кто еще не делает бэкапы, и кто их уже делает&#8221;&nbsp;(с)</p> </blockquote> <p>С бэкапами файлов всё, в целом, довольно понятно &#8212; есть множество решений разной сложности, как открытые, так и коммерческие. Если взять что-нибудь более специфическое, даже обычную почту, то открытые решения найти уже&nbsp;сложнее.</p> <p>Мне кажется, что хорошее решение точно должно удовлетворять следующим&nbsp;требованиям:</p> <ol> <li>Дружественность file-based системам синхронизации: Dropbox, Яндекс.Диск и&nbsp;другие.</li> <li>Простота потенциального переноса данных на другое решение бэкапов. Не хочется сталкиваться с vendor lock-in в случае&nbsp;проблем.</li> <li>Бэкапы должны быть&nbsp;зашифрованы.</li> <li>Естественная поддержка нескольких почтовых&nbsp;ящиков.</li> <li>Хочется легко извлекать результаты простых запросов, например, &#8220;все письма с таким автором&#8221;, без сложных процедур&nbsp;импорта.</li> </ol> <p>До этого у меня на домашнем сервере был настроен бэкап по <a href=https://github.com/ralbear/IMAPbackup><span class=caps>IMAP</span></a> по каждому из аккаунтов. Хотелось получить какой-то более простой интерфейс к поиску, чем grep и не хранить&nbsp;лишнее.</p> <p>В итоге я пришёл к самописному решению, которое удовлетворяло всем требованиям, оставаясь компактным при этом. Схема работы&nbsp;такая:</p> <ul> <li>Есть два места для сохранения результатов: небольшая sqlite база с метаданными и некоторое файловое хранилище (далее просто <em>хранилище</em>), которое может быть S3 корзиной, локальной директорией или чем-нибудь ещё. Хранилище используется только на запись, поэтому поверх него можно добавить <span class=caps>GPG</span>&nbsp;шифрование.</li> <li>Сначала используется <a href=https://pypi.org/project/mail-parser/ >mail-parser</a> для извлечения простых метаданных из данных&nbsp;письма.</li> <li>По этим метаданным добавляем запись в sqlite базу с адресами участников, темой письма и временем. Этого достаточно для большинства простых&nbsp;запросов.</li> <li>Извлекаем вложения, метаданные по ним сохраняем в sqlite, а сами файлы &#8212; в&nbsp;хранилище.</li> <li>Сохраняем полные данные письма, кроме уже сохранённых вложений, в&nbsp;хранилище.</li> </ul> <p>Проще всего поддерживать сохранение объектов в локальную директорию, поэтому сейчас поддерживается только оно. Слой шифрования достаточно естественно добавляется ещё одним решением, gocryptfs <a href=https://nuetzlich.net/gocryptfs/reverse_mode_crypto/ >reverse mode</a>. Мой полный бэкап почты остаётся достаточно компактным, чтобы можно было не разделять метаданные и объекты. В таком случае процесс бэкапа целиком выглядит&nbsp;так:</p> <ol> <li>Получить mbox по всем&nbsp;аккаунтам</li> <li>Обработать mbox и сохранить новые объекты, добавить новые&nbsp;метаданные.</li> <li>Добавить слой шифрования с помощью reverse mode в&nbsp;gocryptfs.</li> <li>Сохранить на бэкап&nbsp;хранилища.</li> </ol> <p>Актуальная версия моего решения вместе с подробной информацией по использованию лежит на <a href=https://github.com/AlekseyLobanov/mbox-db>GitHub</a>.</p> </section> <hr> <aside class=post-meta> <p>Категория: <a href=../../category/proekty.html>Проекты</a></p> <p>Теги: <a href=../../tag/python.html>Python</a>, <a href=../../tag/bekapy.html>бэкапы</a>, <a href=../../tag/proekt.html>проект</a>, </p> </aside> <hr> </article> </li> </ol> </div> </div> <script type=text/javascript>
var _paq = _paq || [];
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://piwik.likemath.ru/";
_paq.push(['setTrackerUrl', u+'piwik.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
})();
</script> <script src=../../theme/js/main.js></script> </body> </html>