mirror of
https://github.com/AlekseyLobanov/AlekseyLobanov.github.io.git
synced 2026-01-11 12:42:01 +03:00
14 lines
8.2 KiB
HTML
14 lines
8.2 KiB
HTML
<!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>Как я делаю бэкапы почты</h1></a> </header> <section class=post-content> <blockquote> <p><span class=dquo>“</span>Люди делятся на две категории: кто еще не делает бэкапы, и кто их уже делает” (с)</p> </blockquote> <p>С бэкапами файлов всё, в целом, довольно понятно — есть множество решений разной сложности, как открытые, так и коммерческие. Если взять что-нибудь более специфическое, даже обычную почту, то открытые решения найти уже сложнее.</p> <p>Мне кажется, что хорошее решение точно должно удовлетворять следующим требованиям:</p> <ol> <li>Дружественность file-based системам синхронизации: Dropbox, Яндекс.Диск и другие.</li> <li>Простота потенциального переноса данных на другое решение бэкапов. Не хочется сталкиваться с vendor lock-in в случае проблем.</li> <li>Бэкапы должны быть зашифрованы.</li> <li>Естественная поддержка нескольких почтовых ящиков.</li> <li>Хочется легко извлекать результаты простых запросов, например, “все письма с таким автором”, без сложных процедур импорта.</li> </ol> <p>До этого у меня на домашнем сервере был настроен бэкап по <a href=https://github.com/ralbear/IMAPbackup><span class=caps>IMAP</span></a> по каждому из аккаунтов. Хотелось получить какой-то более простой интерфейс к поиску, чем grep и не хранить лишнее.</p> <p>В итоге я пришёл к самописному решению, которое удовлетворяло всем требованиям, оставаясь компактным при этом. Схема работы такая:</p> <ul> <li>Есть два места для сохранения результатов: небольшая sqlite база с метаданными и некоторое файловое хранилище (далее просто <em>хранилище</em>), которое может быть S3 корзиной, локальной директорией или чем-нибудь ещё. Хранилище используется только на запись, поэтому поверх него можно добавить <span class=caps>GPG</span> шифрование.</li> <li>Сначала используется <a href=https://pypi.org/project/mail-parser/ >mail-parser</a> для извлечения простых метаданных из данных письма.</li> <li>По этим метаданным добавляем запись в sqlite базу с адресами участников, темой письма и временем. Этого достаточно для большинства простых запросов.</li> <li>Извлекаем вложения, метаданные по ним сохраняем в sqlite, а сами файлы — в хранилище.</li> <li>Сохраняем полные данные письма, кроме уже сохранённых вложений, в хранилище.</li> </ul> <p>Проще всего поддерживать сохранение объектов в локальную директорию, поэтому сейчас поддерживается только оно. Слой шифрования достаточно естественно добавляется ещё одним решением, gocryptfs <a href=https://nuetzlich.net/gocryptfs/reverse_mode_crypto/ >reverse mode</a>. Мой полный бэкап почты остаётся достаточно компактным, чтобы можно было не разделять метаданные и объекты. В таком случае процесс бэкапа целиком выглядит так:</p> <ol> <li>Получить mbox по всем аккаунтам</li> <li>Обработать mbox и сохранить новые объекты, добавить новые метаданные.</li> <li>Добавить слой шифрования с помощью reverse mode в gocryptfs.</li> <li>Сохранить на бэкап хранилища.</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> |