Диагностика проблемы
- Проверка состояния сервисов:
- Code: Select all
sudo systemctl status postfix dovecot uwsgi nginx
- Анализ логов:
- Code: Select all
sudo tail -f /var/log/uwsgi/app/modoboa_instance.log
sudo tail -f /var/log/mail.log
- Проверка доступности интерфейса:
- Code: Select all
curl -I https://mail.example.com
Шаг 1: Анализ существующей структуры БД
- Code: Select all
-- Просмотр существующих пользователей
SELECT username, is_active FROM core_user ORDER BY date_joined LIMIT 10;
-- Структура таблиц
SELECT
u.username as email,
u.is_active,
m.address as mailbox_name,
d.name as domain
FROM core_user u
JOIN admin_mailbox m ON u.id = m.user_id
JOIN admin_domain d ON m.domain_id = d.id
LIMIT 5;
Шаг 2: Создание пользователя через Django shell
- Code: Select all
cd /путь/к/modoboa/instance
sudo -u modoboa /путь/к/venv/bin/python manage.py shell
- Code: Select all
from modoboa.core.models import User
from modoboa.admin.models import Domain, Mailbox
# Получаем домен (заменить на ваш)
domain = Domain.objects.get(name='example.com')
# Создаём пользователя
new_user = User.objects.create_user(
username='newuser@example.com',
password='StrongPassword123', # Временный пароль
email='newuser@example.com',
first_name='Имя',
last_name='Фамилия',
is_active=True,
is_superuser=False,
language='ru',
master_user=False,
is_local=True
)
# Создаём почтовый ящик
mailbox = Mailbox.objects.create(
address='newuser', # Часть до @
domain=domain,
user=new_user,
use_domain_quota=True,
quota=0 # Без ограничений
)
print(f"Создан пользователь: {new_user.username}")
print(f"Создан почтовый ящик: {mailbox.full_address}")
Шаг 3: Коррекция формата пароля для Dovecot
Проблема: Django сохраняет пароль в формате pbkdf2_sha256, а Dovecot требует {SHA512-CRYPT}.
- Code: Select all
# Генерация правильного хеша
sudo doveadm pw -s SHA512-CRYPT -r 70000 -p "StrongPassword123"
# Пример вывода: {SHA512-CRYPT}$6$rounds=70000$salt$hash
# Обновление пароля в базе
sudo -u postgres psql ваша_база -c "
UPDATE core_user
SET password = '{SHA512-CRYPT}\$6\$rounds=70000\$salt\$hash'
WHERE username = 'newuser@example.com';
"
Важно: Экранировать символы $ в SQL запросе.
Шаг 4: Автоматизированный скрипт создания
- Code: Select all
#!/bin/bash
# Скрипт create_mailboxes.sh
DOMAIN="example.com"
DB_NAME="modoboa"
# Массив пользователей в формате "логин:пароль"
declare -A USERS=(
["user1"]="Password1!"
["user2"]="Password2!"
["user3"]="Password3!"
)
for USERNAME in "${!USERS[@]}"; do
PASSWORD="${USERS[$USERNAME]}"
EMAIL="${USERNAME}@${DOMAIN}"
echo "Создание: $EMAIL"
# 1. Создание через Django
sudo -u modoboa /путь/к/venv/bin/python /путь/к/manage.py shell << EOF
from modoboa.core.models import User
from modoboa.admin.models import Domain, Mailbox
try:
domain = Domain.objects.get(name='$DOMAIN')
user = User.objects.create_user(
username='$EMAIL',
password='$PASSWORD',
email='$EMAIL',
is_active=True,
is_local=True
)
Mailbox.objects.create(
address='$USERNAME',
domain=domain,
user=user,
use_domain_quota=True,
quota=0
)
print('Успешно: $EMAIL')
except Exception as e:
print('Ошибка: ' + str(e))
EOF
# 2. Генерация хеша для Dovecot
HASH=$(sudo doveadm pw -s SHA512-CRYPT -r 70000 -p "$PASSWORD" | sed 's/\$/\\\$/g')
# 3. Обновление в базе
sudo -u postgres psql $DB_NAME -c \
"UPDATE core_user SET password = '$HASH' WHERE username = '$EMAIL';"
echo "Пароль обновлён для: $EMAIL"
done
Шаг 5: Проверка создания
- Code: Select all
-- Проверка созданных ящиков
SELECT
u.username as email,
u.is_active,
m.address as mailbox_name,
d.name as domain,
CASE
WHEN u.password LIKE '{SHA512-CRYPT}%' THEN 'OK'
ELSE 'Требуется конвертация'
END as password_status
FROM core_user u
JOIN admin_mailbox m ON u.id = m.user_id
JOIN admin_domain d ON m.domain_id = d.id
WHERE u.username LIKE '%@example.com'
ORDER BY u.date_joined DESC
LIMIT 10;
Шаг 6: Тестирование аутентификации
- Code: Select all
# Тест IMAP аутентификации
echo -e "a1 LOGIN user@example.com Password123\na2 LOGOUT" | \
timeout 3 openssl s_client -connect localhost:993 -quiet 2>/dev/null
# Тест через doveadm
sudo doveadm auth test user@example.com Password123
# Проверка логов
sudo tail -f /var/log/mail.log | grep -i "user@example.com"

