Создание почтовых ящиков в Modoboa при неработающем веб-интерфейсе

Board index Администрирование Операционные системы

Description: Операционные системы и среды

#1by mexan » 08.02.2026, 00:38

Веб-интерфейс Modoboa недоступен (CSRF ошибки, 504 Gateway Timeout), но почтовые сервисы (SMTP/IMAP) функционируют. Требуется создать новые почтовые ящики без доступа к административной панели.

Диагностика проблемы
  1. Проверка состояния сервисов:
    Code: Select all
    sudo systemctl status postfix dovecot uwsgi nginx
  2. Анализ логов:
    Code: Select all
    sudo tail -f /var/log/uwsgi/app/modoboa_instance.log
    sudo tail -f /var/log/mail.log
  3. Проверка доступности интерфейса:
    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"
Image
mexan
Администратор
Reputation: 0
Posts: 174
Topics: 133

Return to Операционные системы