Установка почтового сервера postfix, dovecot и squirrelmail в centos/redhat/fedora

php + apache + nginx + mariadb + phpmyadmin

https://hub.docker.com/_/nginx/https://hub.docker.com/_/php/https://hub.docker.com/_/httpd/https://hub.docker.com/_/mariadb/https://hub.docker.com/r/phpmyadmin/phpmyadmin/

Ну, а теперь совмещаем наши конфиги, и получаем неплохое веб-окружение:

Для php мы добавили директиву build (), в которой указали директорию php, где хранится Dockerfile со следующим содержанием:

В данном файле мы обновляем репозитории и устанавливаем php модули ().
Также мы слинковали конфиг php, чтобы можно было его настроить нужным нам образом.
Содержимое php.ini можно взять, например, здесь.

Запускаем, проверяем, радуемся!
Если все сделано правильно, то index.php отработает без ошибок, а в директории project/mysql появятся служебные файлы базы.

Проверка работы квот

Для начала в командной строке вводим:

doveadm quota get -u [email protected]

[email protected] — почтовый пользователь, для которого нужно показать квоту.

Данная команда отобразит квоту для пользователя, например:

Quota name Type    Value Limit                %
User quota STORAGE  16420  50000               32
User quota MESSAGE    14     —                0

Теперь открываем PostfixAdmin — заходим в настройки почтового ящика и ставим небольшой лимит, например, в 5 Мб:

Теперь объем ящика превышает лимит:

doveadm quota get -u [email protected]

Quota name Type    Value Limit                %
User quota STORAGE  16420  5000               328
User quota MESSAGE    14     —                0

* объем превышен, почти, втрое.

Некоторые почтовые клиенты покажут превышение лимита, например, Thunderbird:

Выход за пределы Docker-контейнера

Описание

Термин «выход за пределы контейнера» (container breakout) используется для обозначения ситуации, при которой какой-либо программе, запущенной внутри Docker-контейнера, удается преодолеть механизмы изоляции и получить дополнительные привилегии или доступ к конфиденциальной информации на хосте. Для предотвращения подобных прорывов используется уменьшение количества привилегий контейнера, выдаваемых ему по умолчанию. Например, демон Docker по умолчанию выполняется под рутом, однако существует возможность создать пользовательское пространство имен (user-level namespace) или снять потенциально опасные привилегии контейнера.

Цитата из статьи об уязвимостях, связанных с конфигурацией Docker по умолчанию:

«Этот экспериментальный эксплоит основан на том, что ядро предоставляет любому процессу возможность открыть файл по его inode. В большинстве систем inode корневой директории (/) равен 2. Это дает возможность идти по дереву каталогов файловой системы хоста до тех пор, пока не будет найден искомый объект, например, файл с паролями».

Лучшие практики

  • , которые не нужны приложению, должны быть сняты.

  • Чтобы привилегии контейнера были эквиваленты правам обычного пользователя, создайте для ваших контейнеров изолированное пользовательское пространство имен. избегайте выполнения контейнеров с uid 0.

  • Если без привилегированного контейнера все же не обойтись, убедитесь, что он устанавливается из доверенного репозитория (см. ниже раздел «Подлинность образов контейнеров»).

  • Внимательно следите за случаями монтирования потенциально опасных ресурсов хоста: /var/run/docker.sock), /proc, /dev и т. д. Обычно эти ресурсы нужны для выполнения операций, связанных с базовой функциональностью контейнеров. Убедитесь, что вы понимаете, почему и как необходимо ограничивать доступ процессов к этой информации. Иногда достаточно лишь установки режима «только чтение». Никогда не давайте права на запись, не задавшись вопросом, зачем нужно это право. В любом случае Docker использует copy-on-write, чтобы предотвратить попадание изменений, произошедших в выполняющемся контейнере, в его базовый образ и потенциально в другие контейнеры, которые будут созданы на базе этого образа.

Примеры

Root-пользователь Docker-контейнера по умолчанию может создавать устройства. Вероятно, вы захотите это запретить:

Root также может изменить права доступа любого файла. Это легко проверить: создайте файл под любым обычным пользователем, выполните chmod 600 (чтение и запись доступны только владельцу), зайдите от имени root и убедитесь, что файл вам по-прежнему доступен.

Это также можно исправить, особенно если у вас монтируются папки с конфиденциальными пользовательскими данными.

Создайте обычного пользователя и перейдите в его домашнюю директорию. Затем:

Многие сканеры безопасности и вредоносные программы собирают свои сетевые пакеты с нуля. Такое поведение можно запретить следующим образом:

Полный список привилегий можно найти . Рекомендую с ним ознакомиться и убрать все привилегии, которые вашим контейнерам не нужны.

Если вы создаете контейнер без пространства имен, то по умолчанию процессы, выполняющиеся внутри контейнера, с точки зрения хоста будут работать от имени суперпользователя.

Однако мы можем создать отдельное пользовательское пространство имен. Для этого добавьте ключ conf в файл /etc/docker/daemon.json (аккуратнее, соблюдайте правила синтаксиса json):

Перезапустите Docker. При этом будет создан пользователь dockremap. Новое пространство имен будет пустым.

Снова запустите образ nginx:

Теперь процесс nginx выполняется в другом (пользовательском) пространстве имен. Таким образом нам удалось улучшить изоляцию контейнеров.

Подключение к базе из веб-сервера

По отдельности, наши серверы готовы к работе. Теперь настроим их таким образом, чтобы из веб-сервера можно было подключиться к СУБД.

Зайдем в контейнер с базой данных:

docker exec -it maria_db /bin/bash

Подключимся к mariadb:

:/# mysql -p

Создадим базу данных, если таковой еще нет:

> CREATE DATABASE docker_db DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;

* в данном примере мы создаем базу docker_db.

Создаем пользователя для доступа к нашей базе данных:

> GRANT ALL PRIVILEGES ON docker_db.* TO ‘docker_db_user’@’%’ IDENTIFIED BY ‘docker_db_password’;

* и так, мы дали полные права на базу docker_db пользователю docker_db_user, который может подключаться от любого хоста (%). Пароль для данного пользователя — docker_db_password.

Отключаемся от СУБД:

> quit

Выходим из контейнера:

:/# exit

Теперь перезапустим наши контейнеры с новым параметром, который будет объединять наши контейнеры по внутренней сети.

Останавливаем работающие контейнеры и удаляем их:

docker stop maria_db web_server

docker rm maria_db web_server

Создаем docker-сеть:

docker network create net1

* мы создали сеть net1.

Создаем новые контейнеры из наших образов и добавляем опцию —net, которая указывает, какую сеть будет использовать контейнер:

docker run —name maria_db —net net1 -d -v mariadb:/var/lib/mysql mariadb

docker run —name web_server —net net1 -d -p 80:80 dmosk/webapp:v1

* указав опцию —net, наши контейнеры начинают видеть друг друга по своим именам, которые мы задаем опцией —name.

Готово. Для проверки соединения с базой данных в php мы можем использовать такой скрипт:

<?php
ini_set(«display_startup_errors», 1);
ini_set(«display_errors», 1);
ini_set(«html_errors», 1);
ini_set(«log_errors», 1);
error_reporting(E_ERROR | E_PARSE | E_WARNING);
$con = mysqli_connect(‘maria_db’, ‘docker_db_user’, ‘docker_db_password’, ‘docker_db’);
?>

* в данном примере мы подключаемся к базе docker_db на сервере maria_db с использованием учетной записи docker_db_user и паролем docker_db_password.

После его запуска, мы увидим либо пустой вывод (если подключение выполнено успешно), либо ошибку.

Защита postfix с помощью fail2ban

Изначально fail2ban идет с комплектом готовых настроек и фильтров для защиты большинства популярных сервисов. К ним относится и postfix. Но когда я посмотрел в готовый набор с regexp для postfix, я слегка растерялся :) Он просто огромен. И самое главное, что в таком виде он не заработал на моем лог файле.

Мне стало лень ковыряться в этих правилах. Для защиты postfix от перебора паролей почтовых ящиков, достаточно банить ip адреса из следующих строк лога.

Jun 17 03:14:07 mail postfix/smtpd: warning: unknown: SASL LOGIN authentication failed: UGFzc3dvcmQ6

Для этого достаточно относительно простого regexp.

^%(__prefix_line)swarning: +\: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: *={0,2})?\s*$

Его придумал не я. Честно подсмотрел на просторах интернета. Примеров масса и у нас, и в англоязычном гугле. Далее создаем конфигурационный файл с фильтром из этого regexp — /etc/fail2ban/filter.d/postfix-sasl.conf.

before = common.conf

_daemon = postfix/smtpd
failregex = ^%(__prefix_line)swarning: +\: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: *={0,2})?\s*$
ignoreregex =

Можно сразу же проверить работу этого фильтра с помощью fail2ban-regex. Эта утилита никого не банит, а просто выводит информацию о работе фильтра.

# fail2ban-regex /var/log/maillog /etc/fail2ban/filter.d/postfix-sasl.conf

Команда успешно отработала и вывела результат.

24327 раз данный фильтр распознал строки, попадающие под работу фильтра. Изначально я напрягся, когда прикинул, что именно такое количество ip адресов поедет в бан с помощью iptables. Это еще не критично большое количество, но все равно достаточно много. По одному добавлять такое количество адресов не стоит. Нужно использовать списки, например, .

На деле зря испугался. Никаких проблем не будет и дальше я покажу почему. Правило обработки лога мы проверили и убедились, что оно работает. Дальше добавляем в jail.conf новую секцию.

enabled	= true
filter	= postfix-sasl
port	= smtp,465,submission,imap,imaps,pop3,pop3s
action	= iptables
logpath	= /var/log/maillog
bantime	= 60m
maxretry = 3
findtime = 60m

Пояснять тут особо нечего и так все понятно. Настройка блокировки будет проверять лог файл и записи в нем за последние 60 минут. Если будут 3 совпадения с regexp из фильтра postfix-sasl, ip адрес будет забанен на 60 минут. Таким образом, список забаненных ip адресов будет не очень большой, так как большая часть адресов будет повторяться.

Запускаем fail2ban и добавляем в автозагрузку.

# systemctl enable --now fail2ban

Проверяем лог файл /var/log/fail2ban.

Смотрим правила iptables.

# iptables -L -v -n

У вас должна появиться отдельная цепочка правил f2b-Postfix-sals с заблокированными ip адресами, которые добавил fail2ban. С защитой postfix с помощью fail2ban все. Переходим к Dovecot.

1 Sloppy.io

Sloppy – это быстро, просто и безопасно.

С Sloppy вы можете запустить несколько Docker контейнеров за считанные секунды.

Sloppy – один из лучших вариантов размещения docker контейнеров и запуска их за считанные секунды.

Проект определен в файле JSON.

Вы можете использовать предоставляемый ими CLI с командами, установленными для развертывания, обслуживания и мониторинга контейнеров.

Он также поставляется с веб-опцией для легкого создания проектов, обслуживания и мониторинга docker контейнеров.

С Sloppy у вас есть множество вариантов использования образов Docker из общедоступных в Docker Hub.

Вы также можете использовать образы из любого другого публичного или частного реестра.

При создании приложений через веб-интерфейс они начнут автоматически рекомендовать параметры образа Docker, как только вы начнете вводить имя образа.

Контейнеры, работающие в этой инфраструктуре, являются высокодоступным оборудованием, поэтому вам не нужно беспокоиться о том, что какой-либо контейнер выйдет из строя.

Они упрощают обслуживание вашего контейнера Docker благодаря функциям непрерывного развертывания, отката и постоянных томов.

Вы можете обновить контейнеры с нулевым временем простоя, так как они запускают новые контейнеры и останавливают старые контейнеры после запуска новых контейнеров.

В случае ошибки в любом из ваших обновлений, вы можете легко вернуться к предыдущей стабильной версии всего за три клика.

Данные хранятся в виде блоков, которые распределены по нескольким физическим устройствам.

Таким образом, вам не нужно беспокоиться о потере ваших данных вообще.

Вы можете отслеживать все показатели (загрузка ЦП, сетевой трафик, использование памяти и т. д.) с интервалом 5 минут.

В случае сбоя любого приложения оно автоматически перезапускается после нескольких последовательных проверок, если оно все еще не работает.

Он также поставляется с предварительно сконфигурированным экземпляром GitLab CE, который автоматически создает контейнеры, когда вы нажимаете обновление кода.

Установка нужных пакетов

Выполним следующую команду для установки Postfix, Dovecot, OpenSSL и MySQL:

В процессе установки появится несколько диалогов первоначальной настройки пакетов, вот основные шаги:

  • Во время установки сервера MySQL, если он не был установлен ранее, потребуется ввести пароль для пользователя root. Пароль следует выбрать надёжный;
  • Тип используемого Postfix сервера, — в одноимённом диалоге, — «Internet Site»;
  • В диалоге настройки Postfix следует определиться с почтовым именем. Имеется ввиду полное доменное имя сервера, в нашем примере это mysrv.example.com, его ещё называют FQDN (Fully Qualified Domain Name).

Так же нам понадобится отличный инструмент mailx, с его помощью мы будем отсылать тестовые письма непосредственно из консоли:

или, если недоступен первый вариант прораммы:

Итак мы установили все необходимые пакеты и готовы перейти к детальной настройке конфигурации.

Установка почтового клиента

В данном разделе мы установим пакет s-nail для взаимодействия с доставляемой почтой. Перед тем как начать установку, рекомендуем проверить настройку переменной среды «MAIL». Клиенту эта переменная необходима для того, чтобы определять места почты для пользователя.

Если необходимо гарантированно задать переменную MAIL, вне зависимости от способа доступа к учетной записи, потребуется указать ее в файле /etc/bash.bashrc и добавить в /etc/profile.d, чтобы она использовалась всеми юзерами.

Для этого введем следующее:

echo 'export MAIL=~/Maildir' | sudo tee -a /etc/bash.bashrc | sudo tee -a /etc/profile.d/mail.sh

Чтобы прочитать переменную текущего сеанса, можно ввести:

source /etc/profile.d/mail.sh

Теперь мы можем переходить к установке клиента s-nail. Прописываем для этого:

sudo apt install s-nail

Пока что не запускаем его, добавим в него несколько записей. Сначала откроем файл в редакторе nano:

sudo nano /etc/s-nail.rc

В конец вставим следующее:

. . .

set emptystart

set folder=Maildir

set record=+sent

Расшифруем каждую строчку:

  • set emptystart – дает возможность клиенту открываться даже при пустом почтовом ящике;
  • set folder=Maildir – прописывает для директории Maildir переменную folder;
  • set record=+sent – создает файл sent в формате mbox для хранения отправленной почты в каталоге, заданном в переменной folder.

На этом с файлом заканчиваем – сохраняемся и закрываем его. Теперь нам потребуется выполнить еще одно действие – инициализировать структуру Maildir. Чтобы это сделать, необходимо отправить себе электронное письмо командой s-nail. Так как файл sent доступен только после создания Maildir, потребуется отключить запись в этот файл. Для этого воспользуемся командой -Snorecord.

Для отправки письма добавим строку в команду s-nail

Обратите внимание, что в конце указывается имя пользователя – вам потребуется изменить его на свое

echo 'init' | s-nail -s 'init' -Snorecord UserNameZ7

В ответе вы можете увидите сообщение:

Can't canonicalize "/home/sammy/Maildir" 

Это нормально – такое сообщение обычно появляется только при первой отправке.

Убедимся, что каталог был создан:

ls -R ~/Maildir

В результате должно отобразиться примерно следующее:

/home/ UserNameZ7/Maildir/:

cur  new  tmp

/home/ UserNameZ7/Maildir/cur:

/home/ UserNameZ7/Maildir/new:

1463177269.Vfd01I40e4dM691221.mail.example.com

/home/ UserNameZ7/Maildir/tmp:

Теперь мы можем перейти к тестированию почтового клиента.

Нужно установить SquirrelMail.

И выполните команду для установки:

# yum install squirrelmail

Настройка Squirrelmail  измените параметры в зависимости от требований.

# cd /usr/share/squirrelmail/config/
# ./conf.pl

главное меня Squirrelmail для установки

Начнем по порядку, вводим цифру 1.

конфигурация SquirrelMail

Введите название организации и нажмите Enter:
linux-notes.org

К таким образом, настройте все детали, такие как организация, логотип, название провайдера в приведенном выше мастера. После того как вы закончите, нажмите кнопку «S», чтобы сохранить изменения и нажмите «R», чтобы вернуться обратно в главное меню.

Теперь введите «2» и перейдем к настройкам сервера почты, нужно тут будет ввести доменное имя и почтового агент и т.д.:

конфигурация SquirrelMail, вкладка под номером 2

Введите «1», ввод почтового домена (например у меня это linux-notes.org) и нажмите клавишу ввода.

Введите «3» и перейдите от Sendmail к Postfix (т.е. SMTP):

конфигурация SquirrelMail, вкладка под номером 3

Введите «2», чтобы переключиться с почтовой системы Sendmail на Postfix как показано на рисунке ниже.

переключиться с почтовой системы Sendmail на Postfix

Теперь введите «S», а затем «Q» для сохранения и выхода конфигурацию с Squirrelmail.

Теперь нужно создать squirrelmail виртуальный хост в конфиге апача:

# vim /etc/httpd/conf/httpd.conf

Alias /squirrelmail /usr/share/squirrelmail
<Directory /usr/share/squirrelmail>
Options Indexes FollowSymLinks
RewriteEngine On
AllowOverride All
DirectoryIndex index.php
Order allow,deny
Allow from all
</Directory>
# /etc/init.d/httpd restart

После все всей установки я создам пользователя captainua и создадим ему пароль:

# useradd captainua
# passwd captainua

Включим свои iptables:

# /etc/init.d/iptables start
# chkconfig iptables on

Вот и все пока. Мы успешно настроили локальный почтовый сервер, который будет служить для приема / отправки писем в локальной сети. Но если хотите настроить общественный почтовый сервер для отправки и получения почты для внешней вашей сети, то вы должны настроить почтовый сервер с открытым IP и вписать MX- записи вашего почтового сервера в их DNS-сервера, и все, готово! Все будет так же, как я описал выше.На этом я завершу свою тему «Установка почтового сервера Postfix, Dovecot и SquirrelMail в CentOS/Redhat/Fedora». Спасибо что используете мой сайт.

Добавление контейнера MySQL

Как и многие другие продукты и услуги, MySQL имеет общедоступные образы контейнеров, доступные в реестре Docker. Как и мой собственный контейнер Микроблог, MySQL полагается на переменные среды, которые должны быть переданы в . Это настройки типа пароля, имени базы данных и т.д. Не смотря на то, что есть много образов MySQL в реестре, я решил использовать тот, который официально поддерживается командой MySQL. Вы можете найти подробную информацию об образе контейнера MySQL на его странице реестра: https://hub.docker.com/r/mysql/mysql-server/.

Если вы помните трудоемкий процесс настройки MySQL в главе 17, то вы оцените Docker, увидев, как легко развернуть MySQL. Вот команда , которая запускает сервер MySQL:

Вот и все! На любой машине, на которой установлен Docker, вы можете выполнить приведенную выше команду и получить полностью установленный сервер MySQL со случайно сгенерированным паролем root, совершенно новую базу данных под названием и пользователя с тем же именем и настройками полного доступа к базе данных

Обратите внимание, что вам нужно будет ввести правильный пароль в качестве значения для переменной среды

Теперь на стороне приложения, как и для традиционного развертывания на Ubuntu, мне нужно добавить клиентский пакет MySQL. Я снова буду использовать , который я могу добавить в Dockerfile:

При каждом изменении приложения или файла Dockerfile образ контейнера необходимо перестроить:

Теперь я могу снова запустить Microblog, но на этот раз со ссылкой на контейнер базы данных, чтобы обе могли общаться через сеть:

Параметр указывает Docker сделать еще один контейнер доступным. Аргумент содержит два имени, разделенных двоеточием. Первая часть-это имя или идентификатор контейнера для связи, в данном случае , который я создал выше. Вторая часть определяет имя хоста, которое может использоваться в этом контейнере для ссылок (link-ов). Здесь я использую в качестве универсального имени, которое представляет сервер баз данных.

Когда связь между двумя контейнерами установлена, я могу установить переменную окружения , для направления SQLAlchemy на использование базы данных MySQL в другом контейнере. URL-адрес базы данных будет использовать -в качестве имени хоста базы данных, -как имена базы данных и пользователя, и -который вы выбрали при запуске MySQL.

Я заметил одну особенность, когда экспериментировал с контейнером MySQL, которая заключается в том, что запуск этого контейнера занимает несколько секунд до готовности принять соединения с базой данных. Если вы запустите подряд контейнер MySQL и контейнер приложения сразу после попытки скрипта boot.sh запустить может произойти сбой из-за того, что база данных не готова принимать подключения. Чтобы сделать мое решение более надежным, я решил добавить цикл повтора в boot.sh:

Этот цикл проверки кода выхода команды , и если он не равен нулю, значит, что что-то пошло не так, поэтому он делает паузу пять секунд, а затем повторяет попытку.

Возможности и особенности среды разработки

  • Несколько версий PHP — 7.3 и 7.1 с набором наиболее востребованных расширений.

  • Возможность использовать для web-проектов разные версии PHP.

  • Готовый к работе монитор процессов Supervisor.

  • Предварительно сконфигурированный веб-сервер Nginx.

  • Базы данных: MySQL 5.7, MySQL 8, PostgreSQL (latest), MongoDB 4.2, Redis (latest).

  • Настройка основных параметров окружения через файл .env.

  • Возможность модификации сервисов через docker-compose.yml.

  • Последняя версия docker-compose.yml.

  • Все docker-контейнеры базируются на официальных образах.

  • Структурированный Dockerfile для создания образов PHP.

  • Каталоги большинства docker-контейнеров, в которых хранятся пользовательские данные и параметры конфигурации смонтированы на локальную машину.

В целом, среда разработки удовлетворяет требованию — при использовании Docker каждый контейнер должен содержать в себе только один сервис.

Репозиторий проекта

Nginx балансер

Тут сразу стоит уточнить, что, в принципе распараллелить процесс можно было бы с помощью Gunicorn веб-сервера, в частности добавить в Dockerfile в строку запуска Gunicorn веб-сервера , чтобы было процессов. Однако я исходил из того, что в Docker контейнере не нужно плодить процессы, кроме необходимых, поэтому решил разделить процессы по контейнерам (одна ML модель — один контейнер), а не сваливать все процессы в один контейнер. (Пишите в комментах, как бы сделали вы)

Чтобы балансировщик нагрузки работал, нужно, чтобы Nginx перенаправлял запросы на порт 5000, который слушает наш микросервис. Исходный код в файле nginx.conf

В заключительном docker-compose.yml файле я распараллелил созданный ранее микросервис, который назвал здесь с помощью параметра .

Как видно, микросервис также продолжает слушать порт 5000 внутри виртуальной сети докера, в то же самое время перенаправляет трафик от порта 4000 к порту 5000 также внутри виртуальной сети докера, а уже порт 5000 внешней сети я пробросил на 4000 внутренний порт . Таким образом, для внешнего веб-сервера ничего не поменялось, также не пришлось менять исходный код микросервиса.

Чтобы всё запустить, необходимо выполнить в корневой папке проекта:

Для проверки работы микросервиса можно открыть адрес в браузере и начать посылать в него цифры нарисованные мышкой, в результате должно получиться что-то вроде этого:

Настройка почтового сервера

Чтобы не заниматься курением конфигов, а результат был предсказуем ‒ я сделал скрипт, который автоматизирует 90% всего процесса из вышеупомянутого гайда с некоторыми отличиями:

  • Я не хочу ставить на почтовый сервер ресурсоемкий Nextcloud, вместо него я буду использовать Rainloop

  • Подрежем еще несколько мета-тегов: X-Mailer, X-Originating-IP, X-PHP-Originating-Script, Mime-Version. При этом в оригинальном гайде фильтрация конфигурируется в master.cf, а у меня в main.cf

Скрипт устанавливает необходимые пакеты, конфигурирует apache, БД, конфигурирует почтовые службы и на выходе получается практически готовый к употреблению почтовый сервер. При этом я пока не стал включать в скрипт генерирование SSL и DKIM, сделаем это руками чуть ниже.

Скрипт пока не тестировался на корректность работы при многократном запуске. Если почтовый сервер у вас развернут как виртуальная машина, то перед выполнением лучше сделать снапшот ВМ.

Скачиваем и распаковываем скрипт:

Всего в каталоге 3 файла:

  • — основной скрипт конфигурирования сервера

  • — скрипт создания почтового юзера

  • — скрипт смены пароля для существующего почтового юзера

Запускаем . Скрипт попросит ввести следующие данные: имя хоста почтового сервера (в этом гайде это просто mail), имя домена, который был ранее зарегистрирован (например, example.com), IP адрес почтового сервера в локальной сети. Имя хоста + домен как раз образуют полное имя mail.example.com. По завершению работы скрипта почтовые сервисы остаются в выключенном состоянии, т.к. перед запуском надо сгенерировать SSL сертификаты и DKIM. Так же по завершению будет отображен админский пароль от БД. Этот пароль нужно вставить в скрипты и вместо слова PASSWORD, см в файлах вторую строку:

Возможные проблемы

Единственная проблема, замеченная в логах, это несоответствие пакета cmusieve в Debian 6 Squeeze. В файле /home/vmail/ наблюдалось примерно следующее:

Дабы исправить положение установим нужный пакет, который теперь называется sieve, в этом собственно и проблема:

Потом, нужно открыть файл /etc/dovecot/dovecot.conf на редактирование и заменить строку:

На нижеуказанную:

Перезагружаем Dovecot:

После этих несложных действий логи стали чисты.

——

На всякий случай, при возникновении ощибки: «Fatal: Unknown database driver ‘mysql’».
Dovecot требуется пакет dovecot-mysql для MySQL авторизации:

Перезагружаем Dovecot:

Заключение

В итоге мы создали два простеньких микросервиса, упаковали их в докер-контейнеры и совместно запустили на одной машине. У полученной системы, однако, есть ряд недостатков:

  • Плохая отказоустойчивость — у нас все работает на одном сервере
  • Плохая масштабируемость — при увеличении нагрузки было бы неплохо автоматически разворачивать дополнительные экземпляры сервисов и балансировать нагрузку между ними
  • Сложность запуска — нам понадобилось ввести как минимум 3 команды, причем с определенными параметрами (это только для 2 сервисов)

Для устранения вышеперечисленных проблем существует ряд решений, таких как Docker Swarm, Nomad, Kubernetes или OpenShift. Если вся система будет написана на Java можно посмотреть в сторону Spring Cloud (хорошая статья).

В следующей части я расскажу про то, как я настраивал Kubernetes и деплоил проект в Google Kubernetes Engine.

Заключение

Вот так современные технологии упрощают и ускоряют разработку и обслуживание. Сравните с тем, что надо сделать, чтобы настроить типовой веб сервер вручную — настройка веб сервера apache. А тут раз, два и все готово. И потом переносится на любую ОС с докером за минуту. Другое дело, что чтобы во всем этом разбираться, надо сначала научиться вручную все это настраивать, а потом переходить к контейнерам. Иначе они будут как черный ящик. Когда что-то сломается, останется только потыкать в него, но это не приведет к решению проблемы.

Другой вариант решения вопроса — автоматизировать все это с помощью ansible. Я пробовал что-то делать в этом направлении, но реально написать хороший плейбук занимает много времени. Если работаешь не на однотипном потоке, это не оправдывает затраты времени. С докером быстрее и проще получается.

Онлайн курсы по Mikrotik

Если у вас есть желание научиться работать с роутерами микротик и стать специалистом в этой области, рекомендую пройти курсы по программе, основанной на информации из официального курса MikroTik Certified Network Associate. Помимо официальной программы, в курсах будут лабораторные работы, в которых вы на практике сможете проверить и закрепить полученные знания. Все подробности на сайте .

Стоимость обучения весьма демократична, хорошая возможность получить новые знания в актуальной на сегодняшний день предметной области. Особенности курсов:

  • Знания, ориентированные на практику;
  • Реальные ситуации и задачи;
  • Лучшее из международных программ.

Онлайн курс «DevOps практики и инструменты»

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.

Проверьте себя на вступительном тесте и смотрите программу детальнее по .

Итог

Тестирование почты

Итак после всех манипуляций, мы можем посмотреть, насколько балов оценивается письмо с нашей почты.

Это можно сделать на специальном сервисе:

Тестирование почты

Копируем адрес почты, который нам выдали. Каждый раз он генерируется новый. В примере — [email protected], отправляем туда письмо со своего почтового ящика.

Всего, на бесплатной основе, можно отправить 3 письма в день, дополнительные проверки за дополнительную плату.

Итак, мы отправили письмо, и теперь жмем «Then check your score«.

Оценка проверки

Итак, сервис оценивает наше письмо как 10 балов из 10 возможных, единственная желтая галочка, говорит о слишком малом количестве символов в письме, в остальном все отлично.

Результат оценки означает, что наши письма с вероятностью в 99,9 процента, будут доходить до любого почтового сервера, именно во Входящие, а не в Спам.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Ваша ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: