Эксплуатация Carbonio CE без платного бэкапа: наш регламент резервных копий, обновлений и защиты почтового сервера

Эксплуатация Carbonio CE: трёхслойная схема бэкапа, обновления и защита почтового сервера по регламенту ITfresh

Чего нет в Community Edition и что это значит на практике

Меня зовут Евгений Семёнов, я технический директор ITfresh. Мы сопровождаем собственные почтовые системы — 21 домен и больше двухсот ящиков на своём железе в дата-центре МТС — и почтовые серверы клиентов в рамках IT-аутсорсинга компаний до 50 рабочих мест в Москве. В обзоре Carbonio CE и статье про установку я обещал самый честный разговор серии — про эксплуатацию. Держу слово, потому что главный минус Community Edition вылезает не в день установки, а в день первой аварии.

Минус этот называется модуль Backup — он есть только в платном Carbonio Pro. Вместе с ним в Pro уехали три вещи, которые в 2026 году хочется считать гигиеническим минимумом:

  • Realtime-бэкап — каждая операция с ящиком пишется в журнал резервирования почти мгновенно, окно потери данных измеряется секундами;
  • восстановление одного письма — «бухгалтер удалил акт сверки в четверг» решается парой кликов в консоли, без раскатывания всего сервера;
  • HSM — перенос старой почты на дешёвые медленные диски, что для ящиков-архивов по 30–50 ГБ экономит заметные деньги.

Плюс в Pro остаётся кластеризация — но для наших типовых 20–50 рабочих мест она и не нужна, одиночный сервер с нормальным резервированием переживает всё, кроме пожара в стойке. А вот бэкап нужен всем и всегда. Хорошая новость: для этого масштаба задача полностью решается штатными средствами Linux и утилитами самого Carbonio. Плохая новость, выстраданная на чужих авариях: схему резервирования надо проектировать до первого инцидента, а не после. Восстанавливать почтовый сервер, у которого «бэкапом» был снапшот полугодовой давности, — занятие на выходные и седые волосы.

Ниже — наш рабочий регламент целиком: трёхслойная схема бэкапа, учения по восстановлению, порядок обновлений, защита периметра, антиспам и мониторинг. Всё проверено на живых серверах, включая наш собственный почтовый парк.

Трёхслойная схема бэкапа ITfresh

Один способ резервирования — это не резервирование, а лотерея. Мы строим три независимых слоя, каждый закрывает свой класс аварий и имеет свою скорость восстановления.

Слой 1. Снапшоты и бэкапы всей виртуальной машины

Carbonio у нас всегда живёт в виртуалке, и первый слой — ночной бэкап всей VM средствами гипервизора: vzdump в Proxmox или задание резервного копирования на VMware. Это страховка от катастрофы: умер диск, развалилась файловая система, обновление превратило сервер в тыкву — откатываемся целиком.

Важный нюанс, который пропускают в девяти инструкциях из десяти: mailboxd — это Java-процесс с горячими Lucene-индексами, рядом крутятся MariaDB и OpenLDAP. Снапшот «на живую» с ненулевой вероятностью даст копию, где база и индексы неконсистентны. Поэтому либо в гостевой системе работает агент с fsfreeze (qemu-guest-agent в Proxmox, VMware Tools с quiesce), либо — параноидальный вариант для самого ценного сервера — короткая остановка сервисов на время создания снапшота: снапшот делается секунды, дельта копируется уже на работающем сервере. Три минуты недоступности почты в 03:00 никто не заметит, а консистентная копия дорогого стоит.

Слой 2. rsync хранилища плюс дампы баз — ядро схемы

Второй слой — пофайловый: он быстрее восстанавливается частями и не зависит от гипервизора. Каждую ночь скрипт забирает четыре вещи:

  • хранилище писем /opt/zextras/store — инкрементальный rsync с жёсткими ссылками, поэтому семь «полных» суточных копий занимают чуть больше одной;
  • дамп MariaDB — метаданные ящиков, папки, теги, флаги прочтения;
  • дамп LDAP через slapcat — учётные записи, домены, классы обслуживания, пароли;
  • выгрузку конфигурацииzmprov gacf и настройки сервера, чтобы после аварии не вспоминать, какие лимиты и политики были выставлены.
# /opt/scripts/carbonio-backup.sh — слой 2: файлы + дампы (запуск из cron в 02:30)
#!/bin/bash
set -euo pipefail
TS=$(date +%F)
DST="/backup/carbonio/daily/$TS"
mkdir -p "$DST"

# 1. Хранилище писем: инкрементально, hardlink-ротация
rsync -aH --delete --link-dest=/backup/carbonio/daily/latest/store \
  /opt/zextras/store/ "$DST/store/"

# 2. Метаданные ящиков: MariaDB (пароль берём из localconfig)
PW=$(su - zextras -c 'zmlocalconfig -s -m nokey mysql_root_password')
su - zextras -c "mysqldump -u root -p$PW --single-transaction --all-databases" \
  | gzip > "$DST/mariadb.sql.gz"

# 3. Каталог LDAP: учётки, домены, COS
/opt/zextras/common/sbin/slapcat -F /opt/zextras/data/ldap/config -b "" \
  | gzip > "$DST/ldap.ldif.gz"

# 4. Конфигурация: глобальная и серверная
su - zextras -c 'zmprov gacf' > "$DST/globalconfig.txt"
su - zextras -c "zmprov gs $(hostname -f)" > "$DST/serverconfig.txt"

ln -sfn "$DST" /backup/carbonio/daily/latest

# Ротация 7/4/6: 7 суточных; по воскресеньям копия в weekly (храним 4),
# первого числа — в monthly (храним 6)
find /backup/carbonio/daily/ -maxdepth 1 -type d -mtime +7 -exec rm -rf {} +
[ "$(date +%u)" = 7 ] && cp -al "$DST" "/backup/carbonio/weekly/$TS"
[ "$(date +%d)" = 01 ] && cp -al "$DST" "/backup/carbonio/monthly/$TS"
find /backup/carbonio/weekly/  -maxdepth 1 -type d -mtime +28  -exec rm -rf {} +
find /backup/carbonio/monthly/ -maxdepth 1 -type d -mtime +190 -exec rm -rf {} +

Ротация 7/4/6 — семь суточных, четыре недельных, шесть месячных копий — закрывает и «вчера сломалось», и «в марте удалили папку, заметили в июле». Точные пути к slapcat и сокетам проверьте на своей инсталляции: Carbonio живёт в /opt/zextras, но между релизами детали меняются, эталон — документация docs.zextras.com.

Слой 3. Пообъектные выгрузки критичных ящиков

Третий слой — для ящиков, потеря которых означает разговор не с сисадмином, а с юристом: директор, бухгалтерия, договорной отдел. Раз в сутки выгружаем каждый такой ящик целиком в архив через REST-экспорт:

su - zextras -c 'zmmailbox -z -m buh@client.ru \
  getRestURL "//?fmt=tgz"' > /backup/mailboxes/buh-$(date +%F).tgz

Внутри tgz — все письма ящика в формате, который открывается любым архиватором и заливается обратно тем же zmmailbox postRestURL. Это наш ответ на отсутствие «восстановления одного письма» из Pro: не так элегантно, но работает.

Правило 3-2-1 и внешнее хранилище

Все три слоя обязаны соблюдать правило 3-2-1: три копии данных, два разных носителя, одна копия вне площадки. Мы держим выделенное FTP/SFTP-хранилище на отдельном сервере в другом дата-центре, куда слой 2 доезжает сразу после локального прогона. Урок из практики: когда-то у нас бэкапы полгода складывались на тот же RAID, что и продакшен, — при деградации массива «резервная копия» деградировала вместе с ним. С тех пор внешняя площадка — пункт без обсуждений, а хранилище бэкапов смонтировано так, что с почтового сервера его нельзя перезаписать задним числом: доехавшие копии защищены и от шифровальщика.

Трёхслойная схема бэкапа Carbonio CE: снапшоты VM, rsync с дампами баз, выгрузки ящиков и правило 3-2-1
Три слоя резервирования: VM-снапшоты ночью, файлы и дампы с ротацией 7/4/6, пообъектные tgz критичных ящиков — и всё уезжает на внешнюю площадку

Учения по восстановлению: бэкап, который не проверяли, — это гипотеза

Резервная копия становится бэкапом только после того, как из неё что-то восстановили. Поэтому в наш договор сопровождения вписаны restore-учения раз в квартал: берём один из трёх сценариев и проходим его руками на тестовой машине, с секундомером и протоколом.

Сценарий 1: «удалили письмо». Самый частый случай. Разворачиваем tgz нужного ящика из слоя 3, находим письмо по дате и теме, заливаем его в подпапку восстановленного через postRestURL или просто пересылаем пользователю. Реальное время — 15–30 минут, из них половина уходит на уточнение у пользователя, что именно он удалил.

Сценарий 2: «умерла база или индекс». MariaDB не стартует после сбоя питания или рассыпался поисковый индекс. Порядок: остановить сервисы, восстановить дамп MariaDB из слоя 2, при необходимости LDAP из ldif (slapadd), затем переиндексация проблемных ящиков — zmprov rim ящик start. Реальное время — 1–2 часа на сервер с полусотней ящиков, дольше всего молотит переиндексация больших архивов.

Сценарий 3: «сгорел сервер». Гипервизор жив — разворачиваем ночную копию VM из слоя 1 и накатываем поверх дельту писем за день свежим rsync из слоя 2: письма, пришедшие после снапшота, лежат в store внешнего хранилища. Гипервизор мёртв — поднимаем VM на резервной площадке. Реальное время — 2–4 часа до рабочей почты, и до 6–8, если пришлось перевозить площадку и ждать обновления DNS.

Совет: записывайте тайминги каждого учения в протокол. Через год у вас будет честный RTO по каждому сценарию — и железный аргумент в разговоре с руководством о том, зачем нужен резервный гипервизор. «Восстановимся часа за три, мы замеряли в мае» звучит совсем не так, как «ну, наверное, быстро».

Обновления Carbonio без поломки прода

Zextras выпускает несколько релизов в год с нумерацией «год.месяц»: 25.9, 25.12, 26.3, на момент написания актуален 26.6.0. Релизы приносят не только заплатки, но и ломающие изменения — свежий пример из прошлой статьи: переход управления сервисами на systemd, после которого привычный zmcontrol исчез, и все старые скрипты мониторинга и рестарта молча перестали работать. Поэтому «обновляйтесь сразу» и «обновляйтесь автоматически» — оба совета вредные. Наш порядок такой:

  1. Снапшот VM непосредственно перед обновлением — это точка отката, независимая от ночного бэкапа.
  2. Читаем release notes на docs.zextras.com для целевой версии. Ищем слова про смену схемы БД, миграции конфигурации, снятые с поддержки компоненты. Если релиз перескакивает через версию — проверяем, поддерживается ли прямой апгрейд или надо идти по цепочке.
  3. Обновляем в окно — вечер пятницы или раннее утро: apt update && apt upgrade по carbonio-пакетам, затем перезапуск сервисов и pending-setup, если релиз его требует.
  4. Смоук-тест — пять минут проверок, прежде чем написать «готово»:
# Смоук-тест после обновления (~5 минут)
systemctl list-units 'carbonio-*' --state=failed   # должно быть пусто
su - zextras -c 'zmprov gas'                       # LDAP отвечает, сервер на месте
postqueue -p | tail -n1                            # очередь не копится
curl -sk -o /dev/null -w '%{http_code}\n' https://mail.client.ru/   # 200
openssl s_client -connect mail.client.ru:993 -brief 

И принципиальный момент: на carbonio-репозитории мы не включаем unattended-upgrades. Автообновления ОС — да, безопасность ядра и системных библиотек того стоит. Но автоматический прилёт нового релиза почтовой системы в три часа ночи без снапшота, без чтения release notes и без смоук-теста — это не эксплуатация, а рулетка. Один «тихий» мажорный апгрейд, встреченный утром неработающей почтой у всей компании, окупает годы ручной дисциплины.

Безопасность периметра: брутфорс, TLS и лишние порты

Почтовый сервер — самый публичный сервис компании: 25-й порт обязан быть открыт всему интернету, веб-клиент — как минимум всем сотрудникам. Значит, брутфорс начнётся в первые же сутки после появления сервера в DNS — по нашим логам, до нескольких тысяч попыток подбора в день на ничем не примечательный сервер.

fail2ban: баним по логам mailboxd и postfix

Точек входа для подбора пароля три: веб-клиент, IMAP и SMTP-аутентификация. Неудачные попытки первых двух mailboxd пишет в свои журналы в /opt/zextras/log/ (audit-лог), SASL-ошибки SMTP — postfix в /var/log/mail.log. На оба журнала вешаем fail2ban:

# /etc/fail2ban/filter.d/carbonio-auth.conf
[Definition]
failregex = ;oip=<HOST>;.*authentication failed
            ;oip=<HOST>;.*invalid password

# /etc/fail2ban/jail.d/carbonio.local
[carbonio-auth]
enabled  = true
filter   = carbonio-auth
logpath  = /opt/zextras/log/audit.log
maxretry = 5
findtime = 600
bantime  = 3600
action   = iptables-allports[name=carbonio]

[postfix-sasl]
enabled  = true
logpath  = /var/log/mail.log
maxretry = 4
bantime  = 7200

Регулярку сверьте с реальным форматом своего audit-лога (он меняется между версиями): ключевой признак — поле oip, оригинальный IP клиента, потому что за прокси в логе иначе окажется адрес самого сервера. После включения обязательно проверьте fail2ban-regex на живом журнале — фильтр, который ничего не матчит, создаёт опасную иллюзию защиты.

TLS от Let's Encrypt и грабля с занятым 80-м портом

Сертификаты — только Let's Encrypt с автопродлением, самоподписанным в 2026 году места нет: чужие почтовые серверы начинают отказываться от TLS-сессий, а пользователи привыкают жать «принять риск». Классическая грабля: certbot в режиме standalone хочет поднять собственный веб-сервер на 80-м порту, а порт занят nginx-прокси самого Carbonio — продление молча падает, и через 90 дней почта встаёт с истёкшим сертификатом. Решение: либо webroot/nginx-аутентификатор certbot через работающий веб-сервер, либо DNS-01 валидация, если API вашей DNS-зоны это позволяет. После продления сертификат надо скормить Carbonio его штатной утилитой деплоя сертификатов и перезапустить прокси и MTA — просто подменить файлы недостаточно. И отдельной метрикой мониторим срок действия — об этом ниже.

Закрываем админ-консоль и всё лишнее

Админ-консоль Carbonio живёт на порту 6071 — и снаружи её быть не должно вообще. Только VPN или белый список IP на фаерволе. Та же логика для SSH и любых служебных портов: наружу смотрят исключительно 25, 443, 465/587, 993 — и всё.

Почему мы настолько категоричны, объясняет история родственной Zimbra, у которой Carbonio унаследовал архитектуру: CVE-2024-45519 — удалённое выполнение кода через сервис postjournal, CVE-2023-37580 — XSS в веб-клиенте, активно эксплуатировавшийся до выхода патча. Оба раза массово ломали именно те серверы, где админские и служебные интерфейсы торчали в интернет, а обновления откладывались месяцами. К нам дважды приходили компании после взлома почтовика — восстановление доверия к домену занимает дольше, чем восстановление сервера.

Важно: закрытые порты не отменяют обновлений, а обновления — закрытых портов. RCE-уязвимость в открытой всему миру админке превращает вопрос «взломают ли» в вопрос «когда» — обычно счёт идёт на дни после публикации эксплойта.

Антиспам и репутация отправителя

У почтового сервера две спам-задачи: не пропускать чужой мусор внутрь и не выглядеть мусором самому. Вторая для бизнеса больнее — «нас не получает контрагент» эскалируется до директора за час.

Входящий поток. Штатной связки amavis + SpamAssassin в Carbonio хватает, если её дотюнить: поднять вес DNS-блэклистов, включить байесовский классификатор и приучить пользователей кидать пропущенный спам в «Спам», а не удалять — на этих отметках классификатор учится. С RBL по опыту аккуратнее: агрессивные списки дают ложные срабатывания по российским хостерам, чьи подсети попадают в блэклисты целиком за соседей. Мы держим консервативный набор зон и используем их в основном для скоринга, а не для жёсткого reject на сессии. Хорошо разгружает фильтры postscreen перед postfix — он отсекает ботов ещё до SMTP-диалога по поведению: значительная часть спам-соединений отваливается, не дойдя до amavis.

Исходящая репутация. Здесь работает арифметика, которую мы проверили на собственных доменах: корректные PTR и DKIM закрывают порядка 80% проблем доставки в Mail.ru — самый капризный из крупных российских приёмников. Остальные 20% — это:

  • SPF и DMARC с включённым сбором отчётов (rua=): раз в неделю просматриваем агрегаты — именно из них однажды узнали, что подрядчик рассылает письма «от имени» домена клиента со своего сервера;
  • мониторинг блэклистов: автоматическая проверка IP по основным RBL-зонам раз в сутки, алерт при попадании;
  • постмастер-кабинеты Mail.ru и Яндекса — там видно репутацию домена и жалобы получателей раньше, чем начнутся звонки;
  • прогрев нового IP: свежий адрес не должен в первый же день отправить тысячу писем. Наращиваем объём постепенно, неделями, начиная с внутренней переписки и самых лояльных адресатов — иначе автоматика приёмников запишет всплеск в спам-рассылку, и выбираться из-под фильтров придётся месяц.

Мониторинг: 12 метрик с каждого Carbonio

Почта — сервис, деградацию которого пользователи замечают раньше админа, если админ не смотрит на метрики. С каждого Carbonio мы снимаем двенадцать показателей; алерты уходят в Telegram-канал дежурного:

#МетрикаПорог тревогиО чём говорит
1Очередь postfix (postqueue -p)>50 писем дольше 15 минутПроблемы доставки, спам-инцидент, блокировка IP
2Heap mailboxd (JVM)>85% занятостиСкорая деградация веб-клиента и IMAP, впереди OutOfMemory
3Место в /opt/zextras/store<15% свободноПолный store останавливает приём почты
4Место в разделе бэкапов<20% свободноРотация скоро начнёт падать
5systemd-юниты (systemctl list-units 'carbonio-*' --state=failed)любой failedУпавший компонент стека
6Срок TLS-сертификата<14 днейСломалось автопродление Let's Encrypt
7Задержка IMAP-логина (синтетика)>3 секундДеградация mailboxd или дисков раньше жалоб
8SMTP-баннер на 25 порту>5 секунд или нет ответаПроблемы MTA или сетевого пути
9Размер базы LDAPрост к лимиту mdbПереполнение молча валит аутентификацию
10IP в RBL-блэклистахпоявление в любомРепутационный инцидент, чинить немедленно
11Свежесть бэкапа (mtime latest)старше 26 часовНочной скрипт упал — узнать сегодня, а не при аварии
12Load average / CPU>числа ядер дольше 10 минутПереиндексация, спам-шторм или брутфорс

Отдельная деталь — ночные пороги. В 03:00 идут бэкап и обслуживание: load и дисковая очередь легально высокие, и если пороги одни на все сутки, дежурный либо просыпается зря, либо — хуже — приучается игнорировать алерты. Ночью пороги по CPU и I/O у нас ослаблены, а вот метрики 1, 5, 10 и 11 будят в любое время: растущая очередь в четыре утра — это уже инцидент, а не обслуживание.

Дашборд мониторинга почтового сервера Carbonio: очередь postfix, heap mailboxd, диск, сертификат и другие метрики
Дюжина метрик на одном экране: большинство в зелёной зоне, пара датчиков в жёлтой — повод разобраться до того, как позвонят пользователи

Регламент сопровождения и честные трудозатраты

Всё описанное выше складывается в таблицу, которая висит в нашей вики по каждому обслуживаемому серверу. Автоматика делает рутину, человек — проверяет и принимает решения:

ПериодичностьРаботыВремя
ЕжедневноАвтобэкап слоёв 1–3, синк на внешнее хранилище; дежурный просматривает алерты и очередь postfix5–10 мин
ЕженедельноОбновления ОС (кроме carbonio-репозитория); просмотр банов fail2ban и всплесков брутфорса; DMARC-агрегаты; выборочная проверка, что VM-бэкап и внешние копии реально доехали30–45 мин
ЕжемесячноКонтрольное восстановление одного письма из tgz; ревизия ящиков и алиасов (уволенные, забытые пересылки); ручная проверка блэклистов и постмастер-кабинетов; чистка старых снапшотов~1 час
ЕжеквартальноRestore-учения по одному из трёх сценариев с протоколом; обновление релиза Carbonio по регламенту (снапшот → release notes → апгрейд → смоук-тест); ревизия белых списков IP и VPN-доступов; пересмотр порогов мониторинга2–4 часа

Итого на сервер с 30–50 ящиками при уже выстроенной схеме — порядка 5–7 часов в месяц в спокойный период и 8–10 в месяц с релизным апгрейдом или инцидентом. Плюс разовые вложения: собрать и обкатать всю обвязку с нуля — два-три рабочих дня.

Теперь арифметика без лукавства. Если в штате есть админ, которому эти часы есть куда вписать, — Community Edition с самодельным резервированием честно экономит деньги, и эта статья — готовая шпаргалка. Если админа нет и заниматься почтой будет «кто-нибудь потом» — считайте иначе: 6–10 часов квалифицированной работы в месяц по рыночной ставке плюс цена простоя почты на время аварии без отработанных сценариев. На этих цифрах абонентское сопровождение у подрядчика, который ведёт десяток таких серверов и уже наступил на все грабли, обычно выходит дешевле одиночного героизма — именно так мы и обслуживаем почту клиентов наряду с iRedMail и mailcow. А если вы ещё только переезжаете на Carbonio — начните с соседней статьи серии про миграцию с Zimbra: там схема переезда без потери писем, к которой этот регламент пристёгивается со дня запуска.

Сопровождение почтового сервера

Возьмём ваш Carbonio или mailcow под ключ: трёхслойные бэкапы с учениями, мониторинг с алертами, обновления без сюрпризов и защита от брутфорса. Свои серверы в дата-центре МТС, 15+ лет практики.

✈️ Telegram @ITfresh_Boss 📞 +7 903 729-62-41
#Carbonio CE #бэкап почтового сервера #fail2ban #Let's Encrypt #мониторинг почты #обновления Carbonio #регламент ITfresh
Комментарии 0

Оставить комментарий

загрузка...

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.