Вопрос или проблема
Как я могу настроить dovecot для сжатия/архивирования старых писем (скажем, старше 6 месяцев), чтобы пользователи все еще могли их читать и тем самым сэкономить драгоценное место на сервере?
Настройка сжатия писем — это процесс из двух этапов:
- Нам нужно настроить dovecot для чтения сжатых писем
- Нам нужно настроить cronjob для сжатия писем
Настройка Dovecot
Создайте файл конфигурации для dovecot, чтобы включить плагин zlib
Файлы конфигурации Dovecot обычно находятся в /etc/dovecot/conf.d/
Вы можете создать файл с именем 35-zlib.conf
в этом каталоге с таким содержимым
# Включить Zlib для imap
protocol imap {
mail_plugins = $mail_plugins zlib
}
# Включить Zlib для pop3
protocol pop3 {
mail_plugins = $mail_plugins zlib
}
# Увеличить разрешенную память для imap, так как чтение сжатых файлов стоит дороже
service imap {
vsz_limit = 1024МБ
}
Убедитесь, что ваша конфигурация правильная, с помощью doveconf -n
, затем перезапустите dovecot, используя service dovecot restart
Ежедневный cronjob
Следующим шагом нужно запустить скрипт каждый день, чтобы сжимать письма, возраст которых превышает 6 месяцев
Надеюсь, это можно сделать с помощью [verbose] команды find
В /etc/cron.daily/
создайте файл, давайте назовем его archive-email
Запишите этот скрипт в него
#!/bin/bash
find /var/qmail/mailnames -mtime +182 -type f -regex ".*\.$HOSTNAME,.*S=.*,[a-yA-Y]*" ! -name "*\.gz*" -print0 |
while read -rd $'\0' FULLPATH
do
echo "${FULLPATH}"
if file -b "${FULLPATH}" | grep -q compressed; then
mv "${FULLPATH}" "${FULLPATH}Z" # Уже сжато
else
BASENAME=$(basename "${FULLPATH}")
cp -a "${FULLPATH}" "/tmp/${BASENAME}" # Перемещение во временную папку
gzip -f "/tmp/${BASENAME}" # Сжатие
if [[ -f ${FULLPATH} ]]; then # Убедитесь, что исходный файл не был удален во время сжатия
mv "/tmp/${BASENAME}.gz" "${FULLPATH}Z" && rm "${FULLPATH}"
else
rm "/tmp/${BASENAME}.gz"
continue
fi
fi
echo "${FULLPATH}" >> /var/log/archived-emails.log
done
Не забудьте выполнить chmod +x
на созданном файле, чтобы сделать его исполняемым
/var/qmail/mailnames
обычно является корневой папкой, в которой хранятся письма, но это может зависеть от вашей конфигурацииМодификатор
-mtime +182
позволяет нам находить только файлы, созданные более 182
дней назад (по сути, 6 месяцев), измените его соответствующим образомС модификатором
-type f -regex ".*\.$HOSTNAME,.*S=.*,[a-yA-Y]*"
мы хотим найти только файлы писем, которые не имеют флага Z, которые обычно называются в таком формате
1505740244.M351559P24632.my.domain.com,S=38204,W=40910:2,S
Дополнительную информацию о формате maildir можно найти здесьВ конце концов, мы копируем письма для сжатия в каталог
\tmp
, чтобы избежать конфликтов во время сжатия, мы выполняем команду gzip на файле и перемещаем их снова, если файл все еще существует в своем исходном местоположении, добавляя флаг Z в их имя, чтобы указать, что они сжаты, чтобы мы не сжимали их снова, и в конце удаляем исходный файлЭтот процесс был реализован в соответствии с рекомендациями dovecot wiki, но утилита
maildirlock
имеет ошибку с версии 2, которая никогда не была исправлена, поэтому я не использую ее; однако вряд ли это вызовет проблемыМы также записываем все успешно архивированные файлы в
/var/log/archived-emails.log
Вы можете сначала запустить команду в своем терминале без exec, чтобы убедиться, что вы находите правильные файлы
find /var/qmail/mailnames -mtime +182 -type f -regex ".*\.$HOSTNAME,.*S=.*,[a-yA-Y]*" ! -name "*\.gz*"
Ответ или решение
Сжатие старых писем с помощью Dovecot
Чтобы эффективно использовать пространство на сервере, вы можете настроить Dovecot для автоматического сжатия старых писем, например, тех, которые старше шести месяцев. Это позволит не только сэкономить место на сервере, но и сохранить доступность старых писем для пользователей. Рассмотрим, как это можно сделать, следуя двум основным этапам: конфигурации Dovecot и созданию задачи cron для сжатия писем.
1. Конфигурация Dovecot
Для начала необходимо настроить Dovecot для поддержки чтения сжатых писем. Вам нужно будет установить плагин zlib в конфигурацию вашего Dovecot.
Шаги по настройке:
-
Скорее всего, файлы конфигурации Dovecot находятся в директории
/etc/dovecot/conf.d/
. Создайте новый конфигурационный файл, например,35-zlib.conf
, и добавьте в него следующий код:# Включить Zlib для IMAP protocol imap { mail_plugins = $mail_plugins zlib } # Включить Zlib для POP3 protocol pop3 { mail_plugins = $mail_plugins zlib } # Увеличить лимит памяти для IMAP, так как чтение сжатых файлов требует большего объема памяти service imap { vsz_limit = 1024MB }
-
После внесения изменений проверьте корректность конфигурации с помощью команды:
doveconf -n
-
При отсутствии ошибок перезапустите службу Dovecot, чтобы изменения вступили в силу:
service dovecot restart
2. Настройка задачи cron для сжатия писем
Следующим шагом будет создание задачи cron, которая будет запускать скрипт для сжатия всех писем старше шести месяцев ежедневно.
Шаги по созданию задачи cron:
-
В директории
/etc/cron.daily/
создайте файл, назовите его, например,archive-email
, и добавьте в него следующий скрипт:#!/bin/bash find /var/qmail/mailnames -mtime +182 -type f -regex ".*\.$HOSTNAME,.*S=.*,[a-yA-Y]*" ! -name "*\.gz*" -print0 | while read -rd $'\0' FULLPATH do echo "${FULLPATH}" if file -b "${FULLPATH}" | grep -q compressed; then mv "${FULLPATH}" "${FULLPATH}Z" # Уже сжато else BASENAME=$(basename "${FULLPATH}") cp -a "${FULLPATH}" "/tmp/${BASENAME}" # Копируем во временную директорию gzip -f "/tmp/${BASENAME}" # Сжимаем if [[ -f ${FULLPATH} ]]; then # Проверяем, что оригинальный файл не был удален во время сжатия mv "/tmp/${BASENAME}.gz" "${FULLPATH}Z" && rm "${FULLPATH}" else rm "/tmp/${BASENAME}.gz" continue fi fi echo "${FULLPATH}" >> /var/log/archived-emails.log done
-
Не забудьте сделать скрипт исполняемым, используя команду:
chmod +x /etc/cron.daily/archive-email
Примечания:
- Путь
/var/qmail/mailnames
является типичным местом хранения писем, но вы можете изменить его в зависимости от вашей конфигурации. - Модификатор
-mtime +182
позволяет находить файлы, созданные более 182 дней назад (это соответствует примерно 6 месяцам). Вы можете изменять этот параметр по необходимости. - Шаблон с использованием
-type f -regex ".*\.$HOSTNAME,.*S=.*,[a-yA-Y]*"
позволяет находить только те файлы, которые не были сжаты, и имеет специфическую структуру именования. - Вместо того чтобы сжимать письма сразу, скрипт временно копирует их в
/tmp
, что позволяет избежать конфликтов, и только после успешного сжатия перемещает их обратно с добавлением флагаZ
, чтобы указать на сжатие.
Заключение
Следуя приведенным выше инструкциям, вы сможете настроить Dovecot для автоматического сжатия старых писем, что позволит значительно экономить пространство на сервере. Этот процесс, помимо экономии ресурсов, обеспечивает доступность всех писем для пользователей, даже если они были сжаты, что является важной задачей для любой почтовой системы.