# Прописываем полное имя почтового сервера:
sudo hostnamectl set-hostname mx1.admin112.ru
# Добавим синхронизацию времени. Можно и пропустить этот пункт, но wget нам понадобится далее
sudo apt install -y chrony wget
sudo timedatectl set-timezone Europe/Moscow
sudo systemctl enable chrony
# Заранее подготовим FireWall на базе iptables
sudo touch /etc/iptables.rules
sudo chmod 640 /etc/iptables.rules
sudo nano /etc/network/if-post-down.d/iptables
#!/bin/sh
touch /etc/iptables.rules
chmod 640 /etc/iptables.rules
iptables-save > /etc/iptables.rules
exit 0

sudo chmod +x /etc/network/if-post-down.d/iptables
sudo nano /etc/network/if-pre-up.d/iptables
#!/bin/sh
iptables-restore < /etc/iptables.rules
exit 0

sudo chmod +x /etc/network/if-pre-up.d/iptables
# Пропишем правила для почтового сервера:
sudo iptables -I INPUT 1 -p tcp --match multiport --dports 25,110,143,465,587,993,995 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --match multiport --dports 80,443 -j ACCEPT
sudo iptables-save | sudo tee /etc/iptables.rules > /dev/null
# Для вебморды и прочего будем использовать nginx
sudo apt install -y nginx memcached
sudo systemctl enable nginx
sudo apt install -y php php-fpm
# Внимание на версию php !!! Она может быть другой !!! Далее по тексту так же внимание на версию !!!
# Для проверки - sudo ls /run/php/php*
sudo apt install php7.3-sqlite3
sudo nano /etc/nginx/sites-enabled/default
 # Правим:
 server {
        listen 80 default_server;
        listen [::]:80 default_server;
        ...
 # !!! Прописываем первым index.php !!!
        index index.php ...
        ...

 # !!! Добавляем location !!!

        location ~ \.php$ {
            set $root_path /var/www/html;
            # !!! Особое внимание на версию php !!! Проверить - sudo ls /run/php/php*
            fastcgi_pass unix:/run/php/php7.3-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
            include fastcgi_params;
            fastcgi_param DOCUMENT_ROOT $root_path;
        }
 }

# !!! Особое внимание на версию php !!! Проверить - sudo ls /run/php/php*
sudo systemctl enable php7.3-fpm
sudo systemctl restart nginx

# Проверка наличия MariaDB - sudo apt policy mariadb-server | grep astra-ce
sudo apt install -y mariadb-server
sudo systemctl enable mariadb
# Проверка запуска - sudo systemctl status mariadb | grep active
sudo mysql_secure_installation
 <Enter>
 Y
 <passwordmariadb>
 <passwordmariadb>
 Y
 Y
 Y
 Y

# Обычный вход для root только при необходимости!:
# sudo mysql -u root
# UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE User = 'root';
# FLUSH PRIVILEGES;
# QUIT;

sudo apt install -y php-mysql php-mbstring php-imap
# !!! Особое внимание на версию php !!! Проверить - sudo ls /run/php/php*
sudo systemctl restart php7.3-fpm
wget https://sourceforge.net/projects/postfixadmin/files/latest/download -O postfixadmin.tar.gz
sudo mkdir /var/www/html/postfixadmin
sudo tar -C /var/www/html/postfixadmin -xvf postfixadmin.tar.gz --strip-components 1
sudo mkdir /var/www/html/postfixadmin/templates_c
sudo chown -R www-data:www-data /var/www/html/postfixadmin
sudo mysql -u root
 CREATE DATABASE ИмяБазыДанныхПостфиксАдмин DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
 GRANT ALL ON ИмяБазыДанныхПостфиксАдмин.* TO 'ПользовательБазыДанныхПостфиксАдмин'@'localhost' IDENTIFIED BY 'ПарольБазыДанныхПостфиксАдмин';
 \q

sudo nano /var/www/html/postfixadmin/config.local.php
 <?php

  $CONF['configured'] = true;
  $CONF['default_language'] = 'ru';
  $CONF['database_type'] = 'mysqli';
  $CONF['database_host'] = 'localhost';
  $CONF['database_user'] = 'ПользовательБазыДанныхПостфиксАдмин';
  $CONF['database_name'] = 'ИмяБазыДанныхПостфиксАдмин';
  $CONF['database_password'] = 'ПарольБазыДанныхПостфиксАдмин';
  $CONF['emailcheck_resolve_domain']='NO';

 ?>

# В браузере вбиваем - http://<IP-адрес сервера>/postfixadmin/public/setup.php
# Задаем дважды пароль установки и генерируем хэш, кликнув по Generate setup_password hash
# После копируем хэш, который появится (setup_password)
sudo nano /var/www/html/postfixadmin/config.local.php
 $CONF['setup_password'] = 'ХэшПароляУстановки';

# В браузере жмем F5 и в нижней части страницы должна быть форма добавления суперпользователя — вводим данные где Setup password — пароль, который мы ввели на предыдущей странице; Админ — учетная запись для входа в панель управления PostfixAdmin; Пароль — новый пароль для создаваемой учетной записи
# Появится надпись - Администратор суперадминтакойто@домен.ru успешно добавлен!
# Переходим в браузере на страницу и проверяем вход - http://<IP-адрес сервера>/postfixadmin/public/login.php

# Если не получается осздать суперпользователя, то:
# sudo bash /var/www/html/postfixadmin/scripts/postfixadmin-cli admin add superuser@admin112.ru --password ПарольСуперПользователя --password2 ПарольСуперПользователя --superadmin 1 --active 1

sudo apt install -y postfix postfix-mysql
# В процессе установки должно появиться окно «Postfix Configuration» — оставляем Internet Site - "2", далее будет запрос основного домена, вводим его - admin112.ru
sudo groupadd -g 1024 vmail
sudo useradd -d /home/mail -g 1024 -u 1024 vmail -m
sudo chown -R vmail:vmail /home/mail
sudo nano /etc/postfix/main.cf
 # Изменяем:
 mydestination = localhost.$mydomain, localhost, localhost.localdomain
 ...
 inet_protocols = ipv4
 ...
 smtpd_tls_cert_file = /etc/ssl/mail/public.pem
 smtpd_tls_key_file = /etc/ssl/mail/private.key
 # Проверить запись - myhostname = nameserver.mydomain.ru
 # Добавляем:
 virtual_mailbox_base = /home/mail
 virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
 virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
 virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
 virtual_minimum_uid = 1024
 virtual_uid_maps = static:1024
 virtual_gid_maps = static:1024
 virtual_transport = dovecot
 dovecot_destination_recipient_limit = 1

 smtpd_sasl_auth_enable = yes
 smtpd_sasl_exceptions_networks = $mynetworks
 smtpd_sasl_security_options = noanonymous
 broken_sasl_auth_clients = yes
 smtpd_sasl_type = dovecot
 smtpd_sasl_path = private/auth

 smtp_use_tls = yes
 smtpd_use_tls = yes
 smtpd_tls_auth_only = yes
 smtpd_helo_required = yes

sudo nano /etc/postfix/mysql_virtual_alias_maps.cf
 user = ПользовательБазыДанныхПостфиксАдмин
 password = ПарольБазыДанныхПостфиксАдмин
 hosts = localhost
 dbname = ИмяБазыДанныхПостфиксАдмин
 query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

sudo nano /etc/postfix/mysql_virtual_domains_maps.cf
 user = ПользовательБазыДанныхПостфиксАдмин
 password = ПарольБазыДанныхПостфиксАдмин
 hosts = localhost
 dbname = ИмяБазыДанныхПостфиксАдмин
 query = SELECT domain FROM domain WHERE domain='%u'

sudo nano /etc/postfix/mysql_virtual_mailbox_maps.cf
 user = ПользовательБазыДанныхПостфиксАдмин
 password = ПарольБазыДанныхПостфиксАдмин
 hosts = localhost
 dbname = ИмяБазыДанныхПостфиксАдмин
 query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'

sudo nano /etc/postfix/master.cf
 # Добавляем в конце:
submission   inet  n  -  n  -  -  smtpd
  -o smtpd_tls_security_level=may
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=/var/spool/postfix/private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname

smtps   inet  n  -  n  -  -  smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

dovecot   unix  -  n  n  -  -  pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

 # !!! необходимо убедиться, что в содержимом файла нет других раскомментированных опций для submission, smtps и dovecot !!!


sudo mkdir -p /etc/ssl/mail
sudo openssl req -new -x509 -days 1461 -nodes -out /etc/ssl/mail/public.pem -keyout /etc/ssl/mail/private.key -subj "/C=RU/ST=Moscow/L=Moscow/O=admin112/OU=admin112/CN=mx1.admin112.ru"

sudo systemctl enable postfix
sudo systemctl restart postfix


sudo apt install -y dovecot-imapd dovecot-pop3d dovecot-mysql
sudo nano /etc/dovecot/conf.d/10-mail.conf
 # Заменяем:
 mail_location = maildir:/home/mail/%d/%u/

sudo nano /etc/dovecot/conf.d/10-master.conf
 # Правим:
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
    group = vmail
  }
}

 # И добавляем в конце:
service stats {
    unix_listener stats-reader {
        user = vmail
        group = vmail
        mode = 0660
    }
    unix_listener stats-writer {
        user = vmail
        group = vmail
        mode = 0660
    }
}


sudo nano /etc/dovecot/conf.d/10-auth.conf
 # Изменяем:
 #!include auth-system.conf.ext
 !include auth-sql.conf.ext

sudo nano /etc/dovecot/conf.d/10-ssl.conf
 # Изменяем:
 ssl = required
 ssl_cert = </etc/ssl/mail/public.pem
 ssl_key = </etc/ssl/mail/private.key

sudo nano /etc/dovecot/conf.d/15-lda.conf
 # Изменяем
 lda_mailbox_autocreate = yes

sudo nano /etc/dovecot/conf.d/auth-sql.conf.ext
 # Проверяем и при необходимости изменяем
passdb {
  …
  args = /etc/dovecot/dovecot-sql.conf.ext
}

userdb {
  …
  args = /etc/dovecot/dovecot-sql.conf.ext
}


sudo nano /etc/dovecot/dovecot-sql.conf.ext
 # Добавляем внизу:
driver = mysql
connect = host=localhost dbname=ИмяБазыДанныхПостфиксАдмин user=ПользовательБазыДанныхПостфиксАдмин password=ПарольБазыДанныхПостфиксАдмин
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'
user_query = SELECT CONCAT('/home/mail/',LCASE(`domain`),'/',LCASE(`maildir`)), 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'


sudo nano /etc/dovecot/dovecot.conf
 # Проверяем и при необходимости изменяем:
 listen = *


sudo systemctl enable dovecot
sudo systemctl restart dovecot


# Входим под администратором - http://<IP-адрес сервера>/postfixadmin/public/
# Переходим в Список доменов - Новый домен
# Заполняем формы и нажимаем Добавить домен
# Теперь переходим в Обзор - Создать ящик
# Вводим данные нового пользователя