Dovecot — один из самых распространённых IMAP-серверов в Linux: он нетребователен к ресурсам, умеет Maildir и mdbox, поддерживает TLS, квоты, Sieve и раздельные базы пользователей. В этой статье соберём рабочую конфигурацию для небольшого домена: шифрование, проверка подлинности, ручная проверка IMAP и диагностика типичных ошибок. Отправку почты оставим Postfix: Dovecot отвечает за хранение и доступ к ящикам, а принимать письма умеет через LMTP.
Установка и порты
В Debian, Ubuntu и Linux Mint пакеты разделены по протоколам: dovecot-imapd даёт IMAP, dovecot-lmtpd — приём почты от MTA, dovecot-pop3d нужен только для устаревшего POP3.
sudo apt install dovecot-imapd dovecot-lmtpd
dovecot --version
sudo systemctl status dovecot
sudo ss -lntp | grep -E ':(143|993|24)\b'
Порт 143 — IMAP со STARTTLS, 993 — IMAP поверх TLS, 24 — LMTP для локальной доставки. Наружу достаточно открыть 993; порт 24 не должен быть доступен из интернета.
Раскладка ящиков и права
Самое простое хранилище — Maildir: каждое письмо лежит отдельным файлом в каталоге пользователя. Такая схема хорошо переживает сбои и легко резервируется, хотя на миллионах мелких файлов может уступать mdbox. Основные параметры задаются в 10-mail.conf.
# /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir
mail_privileged_group = mail
namespace inbox {
inbox = yes
separator = /
}
Каталог ~/Maildir Dovecot создаст сам, если у пользователя есть права на домашний каталог. Группа mail нужна для доставки писем и работы служебных процессов; пользователь не должен быть владельцем чужих ящиков. Если почта на отдельном разделе, путь указывают абсолютным, например maildir:/var/mail/%u/Maildir, но права тогда выставляют вручную.
TLS и сертификат
Без шифрования пароль уходит открытым текстом, поэтому ssl = required — обязательная настройка, а не пожелание. Сертификат Let’s Encrypt должен быть выписан на адрес, который клиенты указывают в настройках, обычно mail.example.com.
sudo certbot certonly --webroot -w /var/www/html -d mail.example.com
# /etc/dovecot/conf.d/10-ssl.conf
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
ssl_min_protocol = TLSv1.2
Символ < означает «прочитать файл», а не ссылку. После обновления сертификата конфигурацию нужно перечитать, иначе Dovecot продолжит отдавать старый; надёжнее повесить reload на hook Certbot.
sudo tee /etc/letsencrypt/renewal-hooks/deploy/dovecot-reload.sh >/dev/null <<'EOF'
#!/bin/sh
systemctl reload dovecot
EOF
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/dovecot-reload.sh
sudo certbot renew --dry-run
Проверьте цепочку извне: openssl s_client должен показать полный путь до корневого сертификата без ошибок проверки. Несовпадение имени означает, что сертификат выписан на другой домен.
Аутентификация
Для небольшого сервера хватит системных пользователей, но пароли в /etc/passwd хранить неудобно. Лучше отдельный файл с хешами и passdb. Механизмы plain и login допустимы только вместе с TLS, иначе disable_plaintext_auth = yes просто откажет клиенту.
sudo doveadm pw -s SHA512-CRYPT
# /etc/dovecot/users
# alice:{SHA512-CRYPT}$6$...:5000:5000::/home/alice::
sudo doveadm auth test alice
sudo doveadm mailbox list -u alice
Команда auth test проверяет всю цепочку: файл, пароль, механизм. Если она проходит, а клиент не подключается, проблема в сети или TLS. Для нескольких ящиков удобнее SQL или LDAP, но роли те же: passdb проверяет пароль, userdb сообщает каталог и uid.
Проверка IMAP вручную
Прежде чем искать ошибку в клиенте, поговорите с сервером напрямую: openssl устанавливает TLS-соединение, дальше вводятся команды протокола. Каждая начинается с метки, ответ содержит OK, NO или BAD.
openssl s_client -connect mail.example.com:993 \
-servername mail.example.com -crlf -quiet
a1 LOGIN alice 'пароль'
a2 LIST "" "*"
a3 SELECT INBOX
a4 LOGOUT
Ответ LIST показывает разделитель и список папок, SELECT — количество писем и флаги. Если LOGIN возвращает NO, смотрите журнал: Dovecot пишет причину, но не сам пароль. Если соединение рвётся после приветствия, виноват сертификат или имя в -servername.
Квоты и LMTP
Квота защищает диск от забытого ящика: Dovecot считает её по размеру Maildir. Для приёма почты от Postfix через LMTP нужен сокет в приватном каталоге MTA и включённый протокол lmtp.
# /etc/dovecot/conf.d/20-lmtp.conf
protocols = imap lmtp
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
plugin {
quota = maildir:User quota
quota_rule = *:storage=5G
}
Проверьте, что Postfix видит сокет, а квота видна в doveadm quota get -u alice. Превышение должно возвращать ошибку 552, а не молча терять письма.
Диагностика
Действующая конфигурация видна в одном месте: doveconf -n печатает только изменённые параметры, полный дамп даёт doveconf -a. Так проще понять, что применилось после всех include.
sudo doveconf -n
sudo doveadm log errors
sudo doveadm who
sudo doveadm kick alice
sudo journalctl -u dovecot -n 50 --no-pager
Для сложного случая включают mail_debug и auth_debug, перезагружают сервис и смотрят журнал, а после разбора отладку выключают: она содержит адреса корреспондентов. Команда doveadm reload перечитывает конфигурацию без разрыва соединений.
Ветка 2.4 и совместимость
В дистрибутивах 2025–2026 годов всё чаще встречается ветка 2.4: часть настроек переименована, и конфигурация из старых руководств может не примениться. После обновления сравните doveconf -n с резервной копией и прочитайте предупреждения при старте; journalctl покажет первую неизвестную директиву.
Практический чек-лист
- ssl = required и валидный сертификат на имя, которое указано в клиенте.
- Наружу открыт только 993, порт 24 доступен лишь локально.
- Пароли хранятся в passdb с сильным хешем, plaintext-аутентификация запрещена без TLS.
- Квота настроена и проверена командой doveadm quota get.
- Hook Certbot перезагружает Dovecot после продления.
- Резервная копия Maildir снимается при остановленной доставке или через снапшот.
Итог
Рабочий IMAP-сервер на Dovecot собирается из нескольких понятных частей: раскладка Maildir, строгий TLS, отдельная база пользователей и LMTP для доставки. Каждый слой проверяется своей командой, поэтому сбой локализуется за пару минут, а не перебором настроек клиента. Начните с тестового домена, прогоните ручное подключение через openssl и только потом переносите схему на боевой сервер.