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