Инструкция по исправлению ошибки в Dovecot-Mailcow

Описание проблемы

Ошибка Filename keeps changing for UID=XXXXX возникает, когда Dovecot не может получить доступ к файлу почты из-за повреждения файла или неправильных прав доступа.

Диагностика

1. Проверка логов Dovecot

# Просмотр логов с ошибками
docker logs mailcowdockerized-dovecot-mailcow-1 --tail 100 | grep "Filename keeps changing"

# Поиск конкретного пользователя
docker logs mailcowdockerized-dovecot-mailcow-1 --tail 1000 | grep "problem_user@domain.com"

2. Определение проблемного файла

Из логов извлеките:

  • Имя пользователя (например: alert@tx0.ru)
  • UID письма (например: 18925)
  • Имя файла (например: 1754978545.M300847P78132.d644d3099be8,S=4285,W=4379:2,)

Пошаговое исправление

Шаг 1: Создание резервной копии

# Создание резервной копии dovecot-uidlist
docker exec mailcowdockerized-dovecot-mailcow-1 cp /var/vmail/domain.com/user/Maildir/dovecot-uidlist /var/vmail/domain.com/user/Maildir/dovecot-uidlist.backup.$(date +%Y%m%d_%H%M%S)

Шаг 2: Проверка существования файла

# Проверка файла в директории cur
docker exec mailcowdockerized-dovecot-mailcow-1 ls -la "/var/vmail/domain.com/user/Maildir/cur/PROBLEM_FILE_NAME"

# Поиск файла по UID
docker exec mailcowdockerized-dovecot-mailcow-1 grep "UID_NUMBER" /var/vmail/domain.com/user/Maildir/dovecot-uidlist

Шаг 3: Удаление проблемной записи из индекса

# Удаление записи из dovecot-uidlist
docker exec mailcowdockerized-dovecot-mailcow-1 sed -i '/PROBLEM_FILE_NAME/d' /var/vmail/domain.com/user/Maildir/dovecot-uidlist

# Проверка удаления
docker exec mailcowdockerized-dovecot-mailcow-1 grep "PROBLEM_FILE_NAME" /var/vmail/domain.com/user/Maildir/dovecot-uidlist

Шаг 4: Удаление поврежденного файла

# Принудительное удаление файла
docker exec mailcowdockerized-dovecot-mailcow-1 rm -f "/var/vmail/domain.com/user/Maildir/cur/PROBLEM_FILE_NAME"

# Проверка удаления
docker exec mailcowdockerized-dovecot-mailcow-1 ls -la "/var/vmail/domain.com/user/Maildir/cur/PROBLEM_FILE_NAME"

Шаг 5: Перезапуск Dovecot

# Перезапуск контейнера
docker restart mailcowdockerized-dovecot-mailcow-1

# Ожидание запуска
sleep 15

Шаг 6: Проверка исправления

# Проверка логов на отсутствие ошибок
docker logs mailcowdockerized-dovecot-mailcow-1 --tail 50 | grep "Filename keeps changing"

# Проверка подключения пользователя
docker logs mailcowdockerized-dovecot-mailcow-1 --tail 100 | grep "problem_user@domain.com"

Профилактика

1. Мониторинг

# Скрипт для мониторинга ошибок
#!/bin/bash
ERRORS=$(docker logs mailcowdockerized-dovecot-mailcow-1 --tail 1000 | grep -c "Filename keeps changing")
if [ $ERRORS -gt 0 ]; then
    echo "Обнаружены ошибки Dovecot: $ERRORS"
    # Отправка уведомления
fi

2. Регулярные проверки

# Проверка прав доступа
docker exec mailcowdockerized-dovecot-mailcow-1 find /var/vmail -type f -not -user vmail -o -not -group vmail

# Проверка поврежденных файлов
docker exec mailcowdockerized-dovecot-mailcow-1 find /var/vmail -name "*,S=*,W=*" -exec test -f {} \; -print

3. Автоматические резервные копии

# Ежедневная резервная копия dovecot-uidlist
0 2 * * * docker exec mailcowdockerized-dovecot-mailcow-1 find /var/vmail -name "dovecot-uidlist" -exec cp {} {}.backup.$(date +\%Y\%m\%d) \;