Dovecot часто выглядит простым: поставил пакет, открыл порт 993, подключил почтовый клиент — и вроде бы всё. Но в реальной эксплуатации на VDS проблемы почти всегда упираются не в сам IMAP, а в детали: неверный mail_location, разные представления о домашнем каталоге пользователя, права на Maildir, неполная TLS-цепочка, неработающая quota или загадочные строки auth failed в логах.
В этой инструкции разберём рабочую базу для Dovecot IMAP на VDS. Будем смотреть на сервер глазами администратора: где лежит почта, как Dovecot понимает пользователей, какие порты слушает, как проверить TLS, как включить квоты и что делать, если почтовый клиент упорно пишет, что пароль неверный.
Материал предполагает, что SMTP-часть уже есть или будет настроена отдельно: например, Postfix доставляет письма в Maildir, а Dovecot отдаёт их пользователям по IMAP и, при необходимости, предоставляет SASL-аутентификацию для отправки через submission.
Как Dovecot вписывается в почтовый сервер
Dovecot — это IMAP/POP3-сервер и набор сервисов вокруг почтовых ящиков. В типичной схеме на VDS он принимает подключения почтовых клиентов по IMAP, читает письма из локального хранилища, проверяет логины и пароли, применяет quota, отдаёт информацию о ящике веб-почте и может выступать backend-аутентификатором для Postfix.
Важно разделять роли. Postfix отвечает за SMTP: принимает входящую почту, отправляет исходящую, кладёт письма в ящик или передаёт их через LMTP. Dovecot отвечает за доступ пользователя к уже доставленным письмам. Если письмо не появляется в ящике, причина может быть в доставке Postfix, в LMTP, в правах на каталог или в mail_location. Если письмо есть на диске, но клиент его не видит, чаще виноваты Dovecot, индексные файлы, namespace или путь к хранилищу.
В статье используем Maildir как основной формат. Это практичный выбор для небольших и средних серверов: каждое письмо хранится отдельным файлом, резервное копирование и восстановление проще, повреждение одного файла не ломает весь ящик. Для очень больших инсталляций может быть полезен mdbox, но у него своя логика обслуживания; если вы рассматриваете такой формат, полезно отдельно изучить миграцию Dovecot на mdbox.
Установка Dovecot и базовая проверка сервисов
Названия пакетов немного отличаются между семействами дистрибутивов, но общий набор похож: сам Dovecot, IMAP-компонент, LMTP при необходимости, Sieve и модули для MySQL, PostgreSQL или LDAP, если пользователи хранятся не в системных аккаунтах.
Debian и Ubuntu
sudo apt update
sudo apt install dovecot-core dovecot-imapd dovecot-lmtpd dovecot-sieve dovecot-managesieved
sudo systemctl enable --now dovecot
sudo systemctl status dovecot --no-pagerAlmaLinux, Rocky Linux, CentOS Stream, Oracle Linux и Fedora
sudo dnf install dovecot dovecot-pigeonhole
sudo systemctl enable --now dovecot
sudo systemctl status dovecot --no-pagerПосле установки проверьте, какие порты слушает сервер. Для IMAP обычно используются 143 для IMAP с STARTTLS и 993 для IMAPS. В продакшене удобно оставлять оба: 993 для обычных клиентов, 143 для клиентов и сервисов, которые явно используют STARTTLS. А вот незашифрованную аутентификацию на 143 без TLS нужно запретить.
sudo ss -ltnp | grep dovecotЕсли Dovecot не слушает ожидаемые порты, смотрите файл 10-master.conf и включённые протоколы. На Debian/Ubuntu конфиги обычно лежат в /etc/dovecot/conf.d/, на RHEL-based системах также чаще используется /etc/dovecot/conf.d/. Главный файл — /etc/dovecot/dovecot.conf.

Главная настройка: mail_location
Параметр mail_location говорит Dovecot, где искать почтовое хранилище пользователя и в каком формате оно находится. Если он задан неверно, Dovecot может успешно аутентифицировать пользователя, но показывать пустой ящик. Или, наоборот, Postfix доставляет письма в одно место, а IMAP читает другое.
Для Maildir есть два распространённых подхода: системные пользователи с каталогом ~/Maildir и виртуальные пользователи в едином дереве, например /var/vmail/example.com/user/Maildir. Первый вариант проще для маленьких серверов и служебных ящиков. Второй лучше для хостинга почтовых доменов, потому что не требует создавать Linux-пользователя под каждый email.
Вариант 1: системные пользователи и Maildir в домашнем каталоге
Если у пользователя есть системный аккаунт, а почта хранится в его домашнем каталоге, настройка выглядит так:
mail_location = maildir:~/MaildirПроверьте, что каталог существует и принадлежит пользователю. Dovecot может создать некоторые служебные файлы сам, но лучше не полагаться на случай, особенно если доставку выполняет Postfix.
sudo mkdir -p /home/alice/Maildir/cur /home/alice/Maildir/new /home/alice/Maildir/tmp
sudo chown -R alice:alice /home/alice/Maildir
sudo chmod -R u+rwX,go-rwx /home/alice/MaildirДля Postfix при такой схеме обычно задают доставку в Maildir через home_mailbox:
home_mailbox = Maildir/Обратите внимание на завершающий слеш у Maildir/ в Postfix: он указывает именно на формат Maildir, а не на mbox-файл.
Вариант 2: виртуальные ящики в /var/vmail
Для нескольких доменов и большого числа ящиков удобнее завести отдельного системного пользователя, например vmail, а реальные почтовые аккаунты хранить в базе, passwd-файле или LDAP. Тогда все ящики физически принадлежат одному Unix-пользователю, а Dovecot различает их по логину.
sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 vmail -d /var/vmail -m -s /usr/sbin/nologin
sudo mkdir -p /var/vmail/example.com/alice/Maildir/cur /var/vmail/example.com/alice/Maildir/new /var/vmail/example.com/alice/Maildir/tmp
sudo chown -R vmail:vmail /var/vmail
sudo chmod -R u+rwX,go-rwx /var/vmailДля виртуальных пользователей типичный mail_location такой:
mail_location = maildir:/var/vmail/%d/%n/MaildirЗдесь %d — доменная часть логина, а %n — локальная часть до символа @. Для пользователя alice@example.com путь получится /var/vmail/example.com/alice/Maildir. Если пользователи входят без домена, такая схема сломается: %d будет пустым. Поэтому для виртуального почтового хостинга лучше требовать полный email в качестве логина.
В конфигурации userdb при виртуальной схеме Dovecot должен возвращать правильные uid, gid и домашний каталог. Даже если mail_location задан глобально, корректный home полезен для sieve-скриптов, индексов и диагностики.
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}Как проверить, какой путь видит Dovecot
Не гадайте по конфигам — спрашивайте Dovecot. Команда doveadm user показывает, какие поля возвращает userdb, а doveadm auth test проверяет аутентификацию без почтового клиента.
sudo doveadm user alice@example.com
sudo doveadm auth test alice@example.com 'secret-password'Если пользователь найден, но путь к home неожиданно пустой или указывает не туда, проблема не в IMAP-клиенте. Исправляйте userdb, SQL-запрос, passwd-файл или шаблон mail_location.
TLS для IMAP: что включить и как проверить
Для IMAP на публичном сервере TLS обязателен. Пароли не должны уходить по сети в открытом виде, а клиенты должны видеть корректный сертификат на имя, к которому подключаются: например, mail.example.com. В Dovecot за это отвечают параметры ssl, ssl_cert, ssl_key, минимальная версия протокола и режим разрешения plaintext-аутентификации. Если нужен коммерческий сертификат с понятной цепочкой доверия, посмотрите SSL-сертификаты.
Базовый фрагмент для современных систем:
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
disable_plaintext_auth = yes
auth_mechanisms = plain loginВ строках ssl_cert и ssl_key символ перед путём — это синтаксис Dovecot: он читает содержимое файла. В кодовом блоке он показан как безопасный текст, поэтому угловая скобка экранирована.
Проверьте, что пользователь dovecot или процесс Dovecot может прочитать сертификат и ключ. Частая ошибка: сертификат обновился, Postfix уже его видит, а Dovecot не может прочитать privkey.pem из-за прав. Не стоит бездумно открывать приватный ключ на чтение всем; лучше настроить корректную группу доступа.
sudo doveconf -n | grep -E 'ssl|auth_mechanisms|disable_plaintext_auth'
sudo systemctl restart dovecotПроверка IMAPS на 993
openssl s_client -connect mail.example.com:993 -servername mail.example.com -showcertsВ выводе важно увидеть корректную цепочку сертификатов, совпадение имени и отсутствие ошибок верификации. Если клиент жалуется на недоверенный сертификат, почти всегда причина в том, что указан не fullchain.pem, а только серверный сертификат, либо подключение идёт к имени, которого нет в SAN сертификата.
Проверка STARTTLS на 143
openssl s_client -connect mail.example.com:143 -servername mail.example.com -starttls imapSTARTTLS полезен для совместимости, но не должен превращаться в возможность отправить пароль без шифрования. За это отвечает disable_plaintext_auth = yes. При ssl = required Dovecot потребует TLS для аутентификации, что обычно и нужно на публичном VDS.
Порты, firewall и сервисы Dovecot
Минимально для IMAP нужны TCP-порты 993 и, если используете STARTTLS, 143. Если Dovecot предоставляет LMTP для Postfix через локальный сокет, наружу LMTP открывать не нужно. POP3 в новых установках часто не требуется: если пользователи работают с почтой с нескольких устройств, IMAP удобнее и безопаснее в сопровождении.
Для UFW:
sudo ufw allow 993/tcp
sudo ufw allow 143/tcp
sudo ufw status verboseДля firewalld:
sudo firewall-cmd --permanent --add-service=imaps
sudo firewall-cmd --permanent --add-service=imap
sudo firewall-cmd --reload
sudo firewall-cmd --list-servicesЕсли используете nftables напрямую, не добавляйте правила наугад. Сначала посмотрите текущую таблицу и цепочки, чтобы не нарушить политику firewall.
sudo nft list rulesetDovecot quota: квоты без сюрпризов
dovecot quota нужна, чтобы один ящик не занял весь диск VDS. Это особенно важно на сервере с несколькими доменами или веб-почтой: пользователь может загрузить огромные вложения, включить синхронизацию всех папок или оставить мусор в Trash на годы.
Dovecot умеет разные backend-квоты. Для Maildir часто используют count: Dovecot считает размер сообщений и хранит служебные данные в индексе. Это удобнее, чем полагаться только на файловую систему, потому что квота привязана к почтовому ящику и понятна IMAP-клиенту.
Минимальный пример для глобальной квоты 2 ГБ:
mail_plugins = $mail_plugins quota
protocol imap {
mail_plugins = $mail_plugins imap_quota
}
plugin {
quota = count:User quota
quota_rule = *:storage=2G
quota_rule2 = Trash:storage=+200M
}Правило quota_rule задаёт общий лимит, а quota_rule2 добавляет отдельное послабление для Trash. Это не всегда нужно, но помогает пользователю удалять письма, когда ящик уже почти заполнен. Без такой логики клиент иногда не может переместить письмо в корзину, потому что само перемещение временно требует дополнительного места.
Проверить квоту можно так:
sudo doveadm quota get -u alice@example.com
sudo doveadm quota recalc -u alice@example.comdoveadm quota recalc полезна после ручного восстановления писем из резервной копии, миграции через rsync или исправления повреждённых индексов. Но не превращайте её в постоянный cron на каждую минуту: на больших ящиках пересчёт создаёт лишнюю нагрузку на диск. Если нужна более тонкая политика предупреждений и очистки, пригодится инструкция по quota warnings в Dovecot.
Индексы и производительность quota
Dovecot активно использует индексные файлы. Обычно они лежат рядом с Maildir, но при большом количестве пользователей можно вынести индексы на быстрый диск или отдельный путь. На небольшом VDS это редко требуется, но важно понимать: если вы удаляете индексы для диагностики, Dovecot их пересоздаст, а первая синхронизация клиента может быть медленнее.
Для стандартной схемы Maildir лучше сначала добиться корректной работы без сложных оптимизаций: правильный mail_location, права, TLS, аутентификация, quota. И только потом думать о переносе индексов и тонкой настройке кэша.

Auth failed: как разбирать ошибки входа
Сообщение auth failed само по себе почти ничего не говорит. Оно может означать неверный пароль, неправильный формат логина, отсутствие пользователя в userdb, сбой SQL-запроса, недоступный LDAP, несовместимую схему хеша пароля, запрет plaintext-аутентификации без TLS или бан на уровне fail2ban.
Начинайте с логов. На системах с systemd удобно смотреть журнал:
sudo journalctl -u dovecot -n 200 --no-pager
sudo journalctl -u dovecot -fВ Debian/Ubuntu также могут быть полезны файлы /var/log/mail.log и /var/log/auth.log. В RHEL-based системах чаще смотрят /var/log/maillog.
sudo tail -n 200 /var/log/mail.log
sudo tail -n 200 /var/log/maillogБезопасное включение подробного auth-лога
На время диагностики можно включить более подробные сообщения. Не оставляйте максимальную отладку навсегда: в логах может оказаться слишком много чувствительной информации о логинах, IP-адресах и механизмах аутентификации.
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = noПосле изменения проверьте конфигурацию и перезапустите сервис:
sudo doveconf -n
sudo systemctl restart dovecotКогда проблема решена, верните auth_debug = no. Для постоянной эксплуатации обычно достаточно auth_verbose = yes или даже стандартного уровня логирования, если у вас есть fail2ban и централизованный сбор событий.
Проверка пароля без почтового клиента
Почтовые клиенты иногда кэшируют старые пароли, подставляют логин без домена или пробуют устаревший механизм. Поэтому проверяйте вход через doveadm:
sudo doveadm auth test alice@example.com 'secret-password'Если команда успешна, а клиент не входит, проблема может быть в TLS, имени сервера, порте, формате логина или настройках клиента. Если команда падает, копайте passdb/userdb.
Типовые причины auth failed
Логин без домена. Виртуальная схема ждёт
alice@example.com, а клиент отправляетalice. Исправьте инструкцию для пользователей или настройте домен по умолчанию аккуратно, если у вас один домен.Пароль в неподдерживаемом формате. Dovecot должен понимать хеш. Проверяйте
doveadm pwи схему в passwd-файле или базе.Разные источники пользователей. passdb находит пользователя, а userdb не возвращает
home,uidилиgid. В итоге вход может пройти частично, но ящик не откроется.Неверные права на Maildir. Dovecot аутентифицировал пользователя, но не может открыть каталог. В логах будут ошибки доступа, а не только auth failed.
Подключение без TLS. При
disable_plaintext_auth = yesDovecot не даст отправить пароль открытым текстом. Это правильно; исправлять нужно клиент или порт.Fail2ban или firewall. После серии ошибок IP может быть заблокирован. Тогда клиент будет видеть таймауты или сбросы, а не явный отказ пароля.
Права на Maildir: скучная, но критичная часть
Почтовое хранилище должно быть доступно тому Unix-пользователю, от имени которого Dovecot читает письма. Для системных пользователей это обычно сам пользователь. Для виртуальных ящиков — vmail. Смешивать эти подходы без чёткой причины не стоит.
Проверка для виртуального ящика:
sudo namei -l /var/vmail/example.com/alice/Maildir
sudo find /var/vmail/example.com/alice/Maildir -maxdepth 2 -type d -ls
sudo find /var/vmail/example.com/alice/Maildir -maxdepth 2 -type f -ls | headnamei -l хорош тем, что показывает права на каждый компонент пути. Иногда сам Maildir принадлежит vmail, но родительский каталог /var/vmail/example.com закрыт так, что процесс до него не дойдёт.
Для исправления прав в виртуальной схеме:
sudo chown -R vmail:vmail /var/vmail/example.com/alice
sudo find /var/vmail/example.com/alice -type d -exec chmod 700 {} +
sudo find /var/vmail/example.com/alice -type f -exec chmod 600 {} +Если не нужно разделять права для файлов и каталогов, часто проще и безопаснее использовать один рекурсивный вариант:
sudo chmod -R u+rwX,go-rwx /var/vmail/example.com/aliceМинимальный рабочий конфиг для IMAP на Maildir
Ниже пример не для слепого копирования, а как ориентир. Он показывает взаимосвязь основных параметров: протоколы, Maildir, TLS, аутентификация и quota. Пути к сертификатам, пользователям и домену замените на свои.
protocols = imap lmtp
listen = *
mail_location = maildir:/var/vmail/%d/%n/Maildir
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
disable_plaintext_auth = yes
auth_mechanisms = plain login
mail_plugins = $mail_plugins quota
protocol imap {
mail_plugins = $mail_plugins imap_quota
}
plugin {
quota = count:User quota
quota_rule = *:storage=2G
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}Для реального сервера passdb почти всегда будет отдельным: passwd-file, SQL, LDAP или интеграция с панелью управления. Главное, чтобы passdb отвечал за проверку пароля, а userdb возвращал данные, с которыми Dovecot сможет открыть ящик.
Диагностика: короткий чек-лист перед тем, как винить клиента
Если IMAP не работает, полезно пройтись по слоям снизу вверх. Это быстрее, чем менять сразу пять настроек и потом не понимать, какая из них помогла.
Проверить, что Dovecot запущен:
systemctl status dovecot.Проверить порты:
ss -ltnp, затем firewall.Проверить TLS через
openssl s_clientна 993 и 143 STARTTLS.Проверить итоговый конфиг:
doveconf -n.Проверить пользователя:
doveadm user.Проверить пароль:
doveadm auth test.Проверить путь
mail_locationи права черезnamei -l.Проверить quota:
doveadm quota get.Посмотреть свежие логи Dovecot и, если доставка не работает, логи Postfix.
При изменениях используйте doveconf -n: он показывает не весь огромный конфиг с комментариями, а только активные значения. Это особенно удобно после правок в нескольких файлах conf.d, когда один параметр может переопределяться позже.
Что важно для эксплуатации на VDS
Почта чувствительна к диску, времени, DNS и репутации IP, но Dovecot IMAP в первую очередь требует аккуратного хранения данных. Следите за свободным местом и inode, потому что Maildir создаёт много файлов. Если место закончилось, Dovecot начнёт писать ошибки индексов, клиенты увидят странные сбои синхронизации, а доставка новых писем может остановиться.
df -h
df -i
sudo du -sh /var/vmail/* 2>/dev/nullЛоги тоже должны ротироваться. На сервере с активной почтой включённый auth_debug способен быстро раздуть журнал. Для постоянного мониторинга лучше собирать ключевые метрики: занятое место, количество ошибок входа, срок действия TLS-сертификата, доступность порта 993 и размер очереди SMTP-сервера.
Ещё одна практичная привычка — тестировать восстановление. Maildir удобно бэкапить, но восстановленный каталог должен иметь правильные владельца, права и индексы. После восстановления конкретного ящика выполните пересчёт quota и проверьте вход через doveadm, а не только через веб-почту.
Итоги
Надёжный dovecot imap на VDS — это не один магический параметр, а согласованная цепочка. Postfix или другой MTA доставляет письма в тот же Maildir, который указан в mail_location. Dovecot получает из userdb корректные uid, gid и home. TLS включён обязательно, сертификат соответствует имени сервера, plaintext-аутентификация без шифрования запрещена. dovecot quota защищает диск от переполнения, а логи помогают быстро отличить неверный пароль от ошибки прав или пути.
Если что-то сломалось, не начинайте с переустановки. Сначала проверьте doveconf -n, doveadm user, doveadm auth test, TLS через openssl s_client и права на Maildir. Такой порядок экономит время и обычно приводит к причине быстрее, чем перебор настроек в почтовом клиенте.


