sudo apt update
sudo apt upgrade -y
sudo apt install -y nginx dnsutils mariadb-server mariadb-client

замени vedrator.ru на свой домен

  1. sudo hostnamectl set-hostname mail.vedrator.ru
    sudo nano /etc/hosts
    Найди строку с 127.0.1.1. Если её нет — добавь:
    127.0.1.1 mail.vedrator.ru mail
    Проверь:
    hostname
    hostname -f
    Должно вывести:
    mail.vedrator.ru
    mail.vedrator.ru
  2. получаем IPv4 сервера
    curl -4 ifconfig.me
    В панели DNS добавь:
    A     mail     IP_ТВОЕГО_СЕРВЕРА
    MX    @        mail.vedrator.ru
    Если панель просит TTL — ставь стандартный, например:
    3600
    проверим
    dig +short A mail.vedrator.ru
    должно вернуть IP сервера
    dig +short MX vedrator.ru
    Должно быть примерно: 10 mail.vedrator.ru.
    dig +short -x IP_ТВОЕГО_СЕРВЕРА
    Должно быть: mail.vedrator.ru.
    если нет, то это меняется уже не в DNS (НЕ НУЖНО ДОБАВЛЯТЬ ЗАПИСЬ!), а в панели самого VPS сервера
    ищи что то вроде "PTR" или "Обратная PTR запись для IP адреса"
  3. MariaDB
    Первичная защита MariaDB
    sudo mariadb-secure-installation
    Enter current password for root: просто Enter
    
    Switch to unix_socket authentication: Y
    Change the root password: N
    Remove anonymous users: Y
    Disallow root login remotely: Y
    Remove test database and access to it: Y
    Reload privilege tables now: Y
    Создаем базу для почты
    sudo mariadb
    CREATE DATABASE mailserver CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    CREATE USER 'mailuser'@'localhost' IDENTIFIED BY 'СЛОЖНЫЙ_ПАРОЛЬ_ТУТ';
    GRANT SELECT ON mailserver.* TO 'mailuser'@'localhost';
    FLUSH PRIVILEGES;
    USE mailserver;
    
    CREATE TABLE virtual_domains (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(255) NOT NULL UNIQUE,
        active TINYINT(1) NOT NULL DEFAULT 1
    );
    
    CREATE TABLE virtual_users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        domain_id INT NOT NULL,
        email VARCHAR(255) NOT NULL UNIQUE,
        password VARCHAR(255) NOT NULL,
        active TINYINT(1) NOT NULL DEFAULT 1,
        FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
    );
    
    CREATE TABLE virtual_aliases (
        id INT AUTO_INCREMENT PRIMARY KEY,
        domain_id INT NOT NULL,
        source VARCHAR(255) NOT NULL,
        destination VARCHAR(255) NOT NULL,
        active TINYINT(1) NOT NULL DEFAULT 1,
        FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
    );
    Пока добавим домен vedrator.ru:
    INSERT INTO virtual_domains (name) VALUES ('vedrator.ru');
    EXIT;
    Проверка
    sudo mariadb mailserver -e "SELECT * FROM virtual_domains;"
    Вернет
    +----+-------------+--------+
    | id | name        | active |
    +----+-------------+--------+
    |  1 | vedrator.ru |      1 |
    +----+-------------+--------+
  4. ставим Postfix + Dovecot и настраиваем Dovecot для виртуальных ящиков через MariaDB


    Пока цель этого шага: чтобы Dovecot умел авторизовать ящик из базы.
    sudo apt install -y postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql dovecot-sieve dovecot-managesieved ssl-cert
    Во время установки Postfix выбери (может не появиться, не страшно):
    General type of mail configuration: Internet Site
    System mail name: mail.vedrator.ru
  5. пользователь для хранения почты
    sudo groupadd -g 5000 vmail
    sudo useradd -g vmail -u 5000 vmail -d /var/vmail -m
    sudo chown -R vmail:vmail /var/vmail
    sudo chmod -R 770 /var/vmail
    Проверь:
    id vmail
    ls -ld /var/vmail
    Должно быть примерно:
    uid=5000(vmail) gid=5000(vmail) groups=5000(vmail)
    drwxrwx--- ... vmail vmail /var/vmail
  6. Настрой Dovecot
    sudo nano /etc/dovecot/conf.d/10-mail.conf
    Полностью замени содержимое на:
    mail_location = maildir:/var/vmail/%d/%n
    
    namespace inbox {
        inbox = yes
    }
    
    mail_privileged_group = mail
    
    first_valid_uid = 5000
    last_valid_uid = 5000
    Открой:
    sudo nano /etc/dovecot/conf.d/10-auth.conf
    Полностью замени содержимое на:
    disable_plaintext_auth = yes
    
    auth_mechanisms = plain login
    
    !include auth-sql.conf.ext
    Открой:
    sudo nano /etc/dovecot/conf.d/auth-sql.conf.ext
    Полностью замени содержимое на:
    passdb {
        driver = sql
        args = /etc/dovecot/dovecot-sql.conf.ext
    }
    
    userdb {
        driver = static
        args = uid=vmail gid=vmail home=/var/vmail/%d/%n
    }
    Открой:
    sudo nano /etc/dovecot/dovecot-sql.conf.ext
    Полностью замени содержимое на:
    driver = mysql
    
    connect = host=localhost dbname=mailserver user=mailuser password=ПАРОЛЬ_MAILUSER
    
    default_pass_scheme = SHA512-CRYPT
    
    password_query = SELECT email as user, password FROM virtual_users WHERE email='%u' AND active=1;
    Права на файл:
    sudo chown root:dovecot /etc/dovecot/dovecot-sql.conf.ext
    sudo chmod 640 /etc/dovecot/dovecot-sql.conf.ext
  7. Настрой master-сокеты Dovecot
    sudo nano /etc/dovecot/conf.d/10-master.conf
    Полностью замени содержимое на:
    service imap-login {
        inet_listener imap {
            port = 143
        }
    
        inet_listener imaps {
            port = 993
            ssl = yes
        }
    }
    
    service lmtp {
        unix_listener /var/spool/postfix/private/dovecot-lmtp {
            mode = 0600
            user = postfix
            group = postfix
        }
    }
    
    service auth {
        unix_listener /var/spool/postfix/private/auth {
            mode = 0660
            user = postfix
            group = postfix
        }
    
        unix_listener auth-userdb {
            mode = 0600
            user = vmail
            group = vmail
        }
    
        user = dovecot
    }
    
    service auth-worker {
        user = vmail
    }
  8. Временно включи SSL на стандартном snakeoil-сертификате
    Позже заменим на нормальный сертификат для mail.vedrator.ru.
    sudo nano /etc/dovecot/conf.d/10-ssl.conf
    Полностью замени содержимое на:
    ssl = required
    
    ssl_cert = </etc/ssl/certs/ssl-cert-snakeoil.pem
    ssl_key = </etc/ssl/private/ssl-cert-snakeoil.key
  9. Проверка Dovecot-конфига
    sudo dovecot -n
    Если ошибок нет, перезапусти:
    sudo systemctl restart dovecot
            sudo systemctl status dovecot
    Должно быть: active (running)
  10. Создай первый почтовый ящик в базе
    Сгенерируй хеш пароля:
    doveadm pw -s SHA512-CRYPT
    Введи пароль для ящика, например для:
    postmaster@vedrator.ru
    Команда выдаст строку вида:
    {SHA512-CRYPT}$6$....
    Скопируй её полностью.
    Зайди в MariaDB:
    sudo mariadb
    use mailserver;
    Вставь ящик. Вместо ХЕШ_ПАРОЛЯ_ОТ_DOVEADM вставь полученный хеш:
    INSERT INTO virtual_users (domain_id, email, password)
    SELECT id, 'postmaster@vedrator.ru', 'ХЕШ_ПАРОЛЯ_ОТ_DOVEADM'
    FROM virtual_domains
    WHERE name = 'vedrator.ru';
    Проверь:
    SELECT id, email, active FROM virtual_users;
    exit;
    Проверка авторизации
    sudo doveadm auth test postmaster@vedrator.ru 'ПАРОЛЬ_ОТ_ЯЩИКА'
    Если всё хорошо, должно быть примерно:
    passdb: postmaster@vedrator.ru auth succeeded
    extra fields:
        user=postmaster@vedrator.ru
    На этом шаге нам важно получить успешный результат, если его нет, то перазгрузи и проверь снова:
    sudo reboot
  11. Создаем MySQL-карты для Postfix

    следующий шаг — настроить Postfix, чтобы он принимал письма для vedrator.ru и передавал их в Dovecot
    sudo nano /etc/postfix/mysql-virtual-mailbox-domains.cf
    Вставь:
    user = mailuser
    password = ПАРОЛЬ_MAILUSER
    hosts = 127.0.0.1
    dbname = mailserver
    query = SELECT 1 FROM virtual_domains WHERE name='%s' AND active=1
    Создай файл ящиков:
    sudo nano /etc/postfix/mysql-virtual-mailbox-maps.cf
    Вставь:
    user = mailuser
    password = ПАРОЛЬ_MAILUSER
    hosts = 127.0.0.1
    dbname = mailserver
    query = SELECT 1 FROM virtual_users WHERE email='%s' AND active=1
    Создай файл алиасов:
    sudo nano /etc/postfix/mysql-virtual-alias-maps.cf
    user = mailuser
    password = ПАРОЛЬ_MAILUSER
    hosts = 127.0.0.1
    dbname = mailserver
    query = SELECT destination FROM virtual_aliases WHERE source='%s' AND active=1
    Права на файлы
    sudo chown root:postfix /etc/postfix/mysql-virtual-*.cf
    sudo chmod 640 /etc/postfix/mysql-virtual-*.cf
    Проверь:
    ls -l /etc/postfix/mysql-virtual-*.cf
    Должно быть примерно:
    -rw-r----- 1 root postfix ...
    Проверяем, что Postfix видит данные в MariaDB
    sudo postmap -q vedrator.ru mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
    Должно вернуть:
    1
    Проверка ящика:
    sudo postmap -q postmaster@vedrator.ru mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
    Должно вернуть:
    1
  12. Настраиваем основной конфиг Postfix
    sudo postconf -e "myhostname = mail.vedrator.ru"
    sudo postconf -e "myorigin = /etc/mailname"
    sudo postconf -e "mydestination = localhost"
    sudo postconf -e "relay_domains ="
    sudo postconf -e "inet_interfaces = all"
    sudo postconf -e "inet_protocols = ipv4"
    Теперь виртуальные домены и ящики:
    sudo postconf -e "virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf"
    sudo postconf -e "virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf"
    sudo postconf -e "virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf"
    sudo postconf -e "virtual_transport = lmtp:unix:private/dovecot-lmtp"
    Настройка авторизации через Dovecot:
    sudo postconf -e "smtpd_sasl_type = dovecot"
    sudo postconf -e "smtpd_sasl_path = private/auth"
    sudo postconf -e "smtpd_sasl_auth_enable = yes"
    sudo postconf -e "smtpd_sasl_security_options = noanonymous"
    sudo postconf -e "smtpd_sasl_tls_security_options = noanonymous"
    Базовые ограничения, чтобы сервер не стал открытым relay:
    sudo postconf -e "smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination"
    sudo postconf -e "smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination"
    Временно SSL на стандартном сертификате:
    sudo postconf -e "smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem"
    sudo postconf -e "smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key"
    sudo postconf -e "smtpd_tls_security_level = may"
    sudo postconf -e "smtp_tls_security_level = may"
    Запиши имя сервера в /etc/mailname:
    echo "mail.vedrator.ru" | sudo tee /etc/mailname
    Включаем SMTP-порт 587 для WordPress и почтовых клиентов
    sudo postconf -M submission/inet="submission inet n - y - - smtpd"
    sudo postconf -P submission/inet/syslog_name=postfix/submission
    sudo postconf -P submission/inet/smtpd_tls_security_level=encrypt
    sudo postconf -P submission/inet/smtpd_sasl_auth_enable=yes
    sudo postconf -P submission/inet/smtpd_recipient_restrictions=permit_sasl_authenticated,reject
    Также включим 465:
    sudo postconf -M smtps/inet="smtps inet n - y - - smtpd"
    sudo postconf -P smtps/inet/syslog_name=postfix/smtps
    sudo postconf -P smtps/inet/smtpd_tls_wrappermode=yes
    sudo postconf -P smtps/inet/smtpd_sasl_auth_enable=yes
    sudo postconf -P smtps/inet/smtpd_recipient_restrictions=permit_sasl_authenticated,reject
    Перезапускаем Postfix
    sudo postfix check
    sudo systemctl restart postfix
    sudo systemctl status postfix
    Проверяем, что порты слушаются
    sudo ss -tulpn | grep -E ':25|:465|:587|:993'
    Должны быть видны порты:
    25
    465
    587
    993
  13. Тестовая доставка письма в локальный ящик

    Установи тестовый инструмент:
    sudo apt install -y swaks
    Отправь тестовое письмо локально на созданный ящик:
    swaks --to postmaster@vedrator.ru --from test@example.local --server 127.0.0.1
    Если все хорошо, в конце будет что-то вроде:
    250 2.0.0 Ok: queued as ...
    Потом проверь, появилось ли письмо в ящике:
    sudo find /var/vmail/vedrator.ru/postmaster/new -type f
    Должен появиться файл письма внутри:
    /var/vmail/vedrator.ru/postmaster/new/...
    Если тест не пройдет, сразу смотри лог:
    sudo tail -100 /var/log/mail.log
  14. проверить SMTP-авторизацию на 587 порту
    swaks \
    --server 127.0.0.1 \
    --port 587 \
    --tls \
    --auth LOGIN \
    --auth-user postmaster@vedrator.ru \
    --auth-password 'ПАРОЛЬ_ОТ_ЯЩИКА' \
    --from postmaster@vedrator.ru \
    --to postmaster@vedrator.ru
    Если всё хорошо, в конце будет:
    250 2.0.0 Ok: queued as ...
  15. Создай папку под webmail
    sudo mkdir -p /var/www/mail.vedrator.ru/public
    Создай тестовую страницу:
    echo "mail.vedrator.ru works" | sudo tee /var/www/mail.vedrator.ru/public/index.html
    Права:
    sudo chown -R www-data:www-data /var/www/mail.vedrator.ru
    Создай Nginx-конфиг для mail.vedrator.ru
    sudo nano /etc/nginx/sites-available/mail.vedrator.ru
    server {
        listen 80;
        listen [::]:80;
    
        server_name mail.vedrator.ru;
    
        root /var/www/mail.vedrator.ru/public;
        index index.html;
    
        location / {
            try_files $uri $uri/ =404;
        }
    }
    sudo ln -s /etc/nginx/sites-available/mail.vedrator.ru /etc/nginx/sites-enabled/
    sudo systemctl reload nginx
    Проверь:
    curl http://mail.vedrator.ru
  16. SSL

    Certbot
    sudo apt install -y certbot python3-certbot-nginx
    sudo certbot --nginx -d mail.vedrator.ru
    В процессе:
    email — можешь указать свой
    terms — agree
    redirect HTTP to HTTPS — выбирай redirect
    Подключи сертификат к Dovecot
    sudo nano /etc/dovecot/conf.d/10-ssl.conf
    ssl = required
    
    ssl_cert = </etc/letsencrypt/live/mail.vedrator.ru/fullchain.pem
    ssl_key = </etc/letsencrypt/live/mail.vedrator.ru/privkey.pem
    Проверь и перезапусти:
    sudo dovecot -n
    sudo systemctl restart dovecot
    Подключи сертификат к Postfix
    sudo postconf -e "smtpd_tls_cert_file = /etc/letsencrypt/live/mail.vedrator.ru/fullchain.pem"
    sudo postconf -e "smtpd_tls_key_file = /etc/letsencrypt/live/mail.vedrator.ru/privkey.pem"
    sudo postconf -e "smtpd_tls_security_level = may"
    sudo postconf -e "smtp_tls_security_level = may"
    Перезапусти Postfix:
    sudo postfix check
    sudo systemctl restart postfix
    Проверка IMAPS:
    openssl s_client -connect mail.vedrator.ru:993 -servername mail.vedrator.ru
    В выводе должно быть что-то вроде:
    Verify return code: 0 (ok)
    Выйти можно так:
    Ctrl + C
    Проверка SMTP 587:
    swaks \
    --server mail.vedrator.ru \
    --port 587 \
    --tls \
    --auth LOGIN \
    --auth-user postmaster@vedrator.ru \
    --auth-password 'ПАРОЛЬ_ОТ_ЯЩИКА' \
    --from postmaster@vedrator.ru \
    --to postmaster@vedrator.ru
    Если всё хорошо, в конце будет:
    250 2.0.0 Ok: queued as ...