Категории

Как пересоздать индексы Dovecot после восстановления почты

2025-08-12 09:50:36 | Linux
Пересоздание индексов Dovecot

Если вы восстанавливали почту после сбоя диска, переноса или бэкапа — возможно, столкнулись с ситуацией, когда письма есть на диске, но клиенты (Roundcube, Thunderbird) их не видят. Ошибки вроде UID SORT failed или Permission denied — частые гости. Ниже — пошаговое руководство, как всё починить.

1. Удалите старые индексы Dovecot

Dovecot хранит индексы в файлах с префиксом dovecot.. Они кэшируют структуру писем, UID, размеры и флаги. При переносе или повреждении диска эти файлы становятся нерелевантными или битыми.

Удалите их:

rm /путь/к/почте/пользователя/dovecot.*

Пример для пользователя user@domain.ru:

rm /var/mail/vhosts/domain.ru/user/dovecot.*

Если восстанавливаете много пользователей — массовое удаление:

find /var/mail/vhosts/ -name "dovecot.*" -delete

2. Проверьте права на папки

Dovecot работает от пользователя (например, vmail). Убедитесь, что все папки принадлежат ему.

Проверьте, от кого работает Dovecot:

grep mail_uid /etc/dovecot/conf.d/10-mail.conf

Часто это vmail (UID 1024, GID 1024).

Измените владельца:

chown -R vmail:vmail /var/mail/vhosts/
chmod -R 770 /var/mail/vhosts/

Если почта лежит в другом месте — замените путь.

3. Добавьте vmail в нужную группу (если используется нестандартная)

Если папки принадлежат группе (например, mazzick), а vmail в ней не состоит — будет ошибка:

missing +w perm: ... we're not in group 1002(mazzick)

Решение:

usermod -a -G mazzick vmail

После этого перезапустите Dovecot:

systemctl restart dovecot

4. Пересоздайте индексы

Dovecot перестроит индексы при первом доступе, но лучше сделать это принудительно.

Для одного пользователя:

doveadm index -u user@domain.ru INBOX
doveadm index -u user@domain.ru "*"

Для всех пользователей:

doveadm index -A INBOX

5. Найдите и удалите битые письма

Если после индексации ошибка вида:

Cached message size larger than expected (1176968 > 1584)

— значит, файл письма обрезан, но в имени указан большой размер (S=1176968).

Найдите такие письма:

find /var/mail/vhosts/ -path "*/cur/*S=*" | while read f; do
    declared=$(echo "$f" | grep -o 'S=[0-9]*' | cut -d= -f2)
    actual=$(stat -c%s "$f" 2>/dev/null || echo 0)
    if [ $declared -gt 100000 ] && [ $actual -lt 1000 ]; then
        echo "⚠️  Потенциально битое письмо: $f (S=$declared, actual=$actual)"
    fi
done

Удалите найденные файлы вручную или скриптом:

rm "/путь/к/битому/письму:2,S"

6. Проверьте, что всё работает

Посмотрите список папок:

doveadm mailbox list -u user@domain.ru

Посмотрите количество писем в INBOX:

doveadm mailbox status messages INBOX -u user@domain.ru

Если видит письма — заходите через веб-интерфейс (Roundcube и т.п.).

7. Важно: не лезьте в конфиг, если всё работало

Если Dovecot работает, а вы решили «улучшить» конфиг — остановитесь.

Особенно это касается параметров:

Пример из реальной жизни:

Было (работало):

#mail_location = maildir:/var/mail/%d/%u/

Админ, следуя совету «нейросети», поменял на:

mail_location = maildir:/mnt/newmail/%d/%u/

и убрал путь к папке из user_query, оставив только UID/GID:

user_query = SELECT 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u' AND active = '1'

Результат — каша: Dovecot не знает, где лежит почта, письма не видны, индексы не создаются.

Что делать?

Верните user_query к нормальному виду. Пример:

user_query = SELECT 'maildir:/mnt/newmail/%d/%u' AS mail, 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u' AND active = '1'

Или, если используете mail_location в основном конфиге — убедитесь, что он корректен:

mail_location = maildir:/mnt/newmail/%d/%u/

и тогда user_query может не указывать путь.

Правило:

Если работает — не трогай. Особенно если не понимаешь, как связаны mail_location, userdb и пути к папкам.

Вывод

Пересоздание индексов в Dovecot — это просто:

  1. Удалите dovecot.*
  2. Проверьте права
  3. Запустите doveadm index

Но если не работает — ищите дальше: группа, владелец, обрезанные файлы, и главное — не лезьте в конфиг без понимания.

Комментарии

Пока нет комментариев. Будьте первым!

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

← Назад к списку статей

DISCLAIMER: Блог-эксперимент

Внимание: Cтатьи здесь сгенерированы нейросетью, пока не правил ошибки, только запустил его да и не до этого. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
НО!
Каждый кейс я реально делал минимум один раз. Серьёзно.
Сервера стоят, клиенты довольны, дата-центры не горят.
Это не просто копипаста — это опыт, выстраданный в бою, просто пересказанный через ИИ.
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.

Посетителей сегодня: 0


© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA
Кто я | HSH | Контакты и регион