Установка почтового сервера Mailcow на Ubuntu 22.04 LTS
Mailcow — это почтовый сервер который разворачивается в docker контейнере и требует минимум настройки. Maicow состоит из Dovecot, ClamAV, Solr, Oletools, Memcached, Redis, MariaDB, Unbound, PHP, Postfix, ACME, Nginx, Rspamd, SOGo, Netfilter. Для установки mailcow на сервере должен быть установлен docker + docker-compose.
Новый пользователь
У меня на сервере свежеустановленная Ubuntu 22.04, там только пользователь root
, для работы добавим пользователя evgeniy
# useradd -m -s /bin/bash -G sudo evgeniy # passwd evgeniy New password: пароль Retype vew password: пароль passwd: password updated successfully
Добавляеем ДНС-записи
Во-первых, добавим A-запись, которая свяжет ip-адрес нашего сервера 222.222.222.222
с доменным именем mail.example.com
. Во-вторых, добавим MX-запись, которая сообщит отправителю, что письмо с адресом feedback@example.com
нужно отправлять серверу mail.example.com
. В-третьих, добавим SPF-запись, которая сообщит получателям список наших доверенных серверов. Получатели должны принимать только письма от серверов, указанных в A-записях и MX-записях.
Name | Type | TTL | Value |
---|---|---|---|
example.com |
A |
3600 |
111.111.111.111 |
www.example.com |
A |
3600 |
111.111.111.111 |
mail.example.com |
A |
3600 |
222.222.222.222 |
example.com |
MX 10 |
3600 |
mail.example.com |
example.com |
TXT |
3600 |
v=spf1 a mx -all |
Установка Docker
Шаг 1. Для начала обновим список доступных пакетов
$ sudo apt-get update
Шаг 2. Установим пакеты, которые потребуются далее (в том числе, чтобы получать пакеты по https)
$ sudo apt-get install ca-certificates curl gnupg lsb-release
Шаг 3. Добавим GPG ключ официального репозитория Docker
$ sudo mkdir -p /etc/apt/keyrings # может уже существовать $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Можем посмотреть информацию о добавленном ключе
$ file /etc/apt/keyrings/docker.gpg /etc/apt/keyrings/docker.gpg: OpenPGP Public Key Version 4, Created Wed Feb 22 18:36:26 2017, RSA (Encrypt or Sign, 4096 bits); User ID; Signature; OpenPGP Certificate
Шаг 4. После добавления GPG ключа, добавим нужный репозиторий
$ echo \ > "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ > $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
lsb_release -cs
возвращает имя текущего дистрибутива: для Ubuntu 18.04 — Bionic
, для Ubuntu 20.04 — Focal
, для Ubuntu 22.04 — Jammy
.
Шаг 5. Обновляем список доступных пакетов (в том числе из нового репозитория)
$ sudo apt-get update .......... Get:3 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB] Hit:4 http://archive.ubuntu.com/ubuntu jammy InRelease Get:5 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages [12.7 kB] Get:6 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [114 kB] Get:7 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [107 kB] ..........
Шаг 6. Устанавливаем последнюю версию Docker и плагин docker-compose
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Шаг 7. Для проверки запустим контейнер с образом hello-world
$ sudo docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 2db29710123e: Pull complete Digest: sha256:aa0cc8055b82dc2509bed2e19b275c8f463506616377219d9642221ab53cf9fe Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
Оказывается, есть готовый скрипт, который установит docker и docker-compose-plugin
$ sudo -s # следующие команды от пользователя root # curl -sSL https://get.docker.com/ | CHANNEL=stable sh # systemctl enable --now docker
Установка Mailcow
Устанавливать Mailcow надо от пользователя root
$ sudo -s
Переходим в директорию opt
и клонируем репозиторий mailcow
# cd /opt # git clone https://github.com/mailcow/mailcow-dockerized
Запускаем генерацию файла конфигурации /opt/mailcow-dockerized/mailcow.conf
# cd mailcow-dockerized # ./generate_config.sh
Во время генерации будет запрошено доменное имя, на котором будет находится система Mailcow — указываем mail.example.com
. В случае, если на сервере памяти меньше, чем 2.5GB — будет предложено отключить ClamAV. Необходимо будет также указать часовой пояс — например, Europe/Moscow
.
Наконец, нужно будет выбрать, какую версию сборки Mailcow устанавливать — стабильную либо тестовую. Конечно, будем устанавливать стабильную версию.
Available Branches:
- master branch (stable updates) | default, recommended [1]
- nightly branch (unstable updates, testing) | not-production ready [2]
Choose the Branch with it's number [1/2] 1
Скачиваем образы и запускаем контейнеры в работу
# docker compose pull # docker compose up -d
Настройка Mailcow
После установки открываем в браузере страницу https://mail.example.com
и вводим логин и пароль — это admin
и moohoo
.
После первого входа в обязательном порядке меняем пароль у пользователя admin
— верхнее меню System → Конфигурация
.
Для добавления нового почтового домена, переходим в раздел E-mail → Конфигурация
и жмем кнопку «Добавить домен».
Указываем домен example.com
и обязательно перезапускаем контейнер SOGo кнопкой «Добавить домен и перезапустить SOGo».
Для создания почтового ящика переходим на вкладку «Почтовые ящики» и жмем кнопку «Добавить почтовый аккаунт».
Теперь можно переходить в приложение Webmail — верхнее меню Приложение → Webmail
— это веб интерфейс почтового ящика. Но прежде, чем отправить первое письмо, добавим еще одну ДНС-запись, чтобы наши письма не попадали в спам.
Добавляем DKIM-запись
Mailcow уже сгенерировал для нас открытый и закрытый ключи, открытый ключ устанавливаем в качестве значения ДНС-записи. Значение ДНС записи берем здесь — System → Конфигурация → Options → ARC/DKIM ключи
.
Name | Type | TTL | Value |
---|---|---|---|
example.com |
A |
3600 |
111.111.111.111 |
www.example.com |
A |
3600 |
111.111.111.111 |
mail.example.com |
A |
3600 |
222.222.222.222 |
example.com |
MX 10 |
3600 |
mail.example.com |
example.com |
TXT |
3600 |
v=spf1 a mx -all |
dkim._domainkey.example.com |
TXT |
3600 |
v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBg... |
Автонастройка клиентов
Для автоматической настройки почтовый клиент Thunderbird выполняет GET-запрос по протоколу HTTP к поддомену autoconfig.example.com
. Для автоматической настройки почтовый клиент Microsoft Outlook выполянет POST-запрос по протоколу HTTPS к поддомену autodiscover.example.com
. В ответ они получают xml-документ с необходимой для настройки информацией.
http://autoconfig.example.com/mail/config-v1.1.xml?emailaddress=feedback@example.com
<?xml version="1.0"?>
<clientConfig version="1.1">
<emailProvider id="mail.example.com">
<domain>%EMAILDOMAIN%</domain>
<displayName>A mailcow mail server</displayName>
<displayShortName>mail server</displayShortName>
<incomingServer type="imap">
<hostname>mail.example.com</hostname>
<port>993</port>
<socketType>SSL</socketType>
<username>%EMAILADDRESS%</username>
<authentication>password-cleartext</authentication>
</incomingServer>
<incomingServer type="imap">
<hostname>mail.example.com</hostname>
<port>143</port>
<socketType>STARTTLS</socketType>
<username>%EMAILADDRESS%</username>
<authentication>password-cleartext</authentication>
</incomingServer>
<incomingServer type="pop3">
<hostname>mail.example.com</hostname>
<port>995</port>
<socketType>SSL</socketType>
<username>%EMAILADDRESS%</username>
<authentication>password-cleartext</authentication>
</incomingServer>
<incomingServer type="pop3">
<hostname>mail.example.com</hostname>
<port>110</port>
<socketType>STARTTLS</socketType>
<username>%EMAILADDRESS%</username>
<authentication>password-cleartext</authentication>
</incomingServer>
<outgoingServer type="smtp">
<hostname>mail.example.com</hostname>
<port>465</port>
<socketType>SSL</socketType>
<username>%EMAILADDRESS%</username>
<authentication>password-cleartext</authentication>
</outgoingServer>
<outgoingServer type="smtp">
<hostname>mail.example.com</hostname>
<port>587</port>
<socketType>STARTTLS</socketType>
<username>%EMAILADDRESS%</username>
<authentication>password-cleartext</authentication>
</outgoingServer>
<enable visiturl="https://mail.example.com/admin.php">
<instruction>
If you didn't change the password given to you by the administrator or
if you didn't change it in a long time, please consider doing that now.
</instruction>
</enable>
</emailProvider>
<webMail>
<loginPage url="https://mail.example.com/SOGo/"/>
</webMail>
</clientConfig>
Так что нам нужно добавить еще две A-записи
Name | Type | TTL | Value |
---|---|---|---|
example.com |
A |
3600 |
111.111.111.111 |
www.example.com |
A |
3600 |
111.111.111.111 |
mail.example.com |
A |
3600 |
222.222.222.222 |
example.com |
MX 10 |
3600 |
mail.example.com |
example.com |
TXT |
3600 |
v=spf1 a mx -all |
dkim._domainkey.example.com |
TXT |
3600 |
v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBg... |
autoconfig.example.com |
A |
3600 |
mail.example.com |
autodiscover.example.com |
A |
3600 |
mail.example.com |
Проверка отправки почты
Все готово, осталось только проверить, как будут реагировать наши письма серверы, которые их будут принимать — это можно сделать здесь. Сервис посоветовал добавить DMARC-запись — давайте так и сделаем.
Name | Type | TTL | Value |
---|---|---|---|
example.com |
A |
3600 |
111.111.111.111 |
www.example.com |
A |
3600 |
111.111.111.111 |
mail.example.com |
A |
3600 |
222.222.222.222 |
example.com |
MX 10 |
3600 |
mail.example.com |
example.com |
TXT |
3600 |
v=spf1 a mx -all |
dkim._domainkey.example.com |
TXT |
3600 |
v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBg... |
autoconfig.example.com |
A |
3600 |
mail.example.com |
autodiscover.example.com |
A |
3600 |
mail.example.com |
_dmarc.example.com |
TXT |
3600 |
v=DMARC1; p=none |
Еще одна рекомендация — добавить PTR-запись. Для этого нужно обратиться к провайдеру, у которого арендован ip-адрес и сервер.
- Настройка DNS на Ubuntu Server 18.04 LTS
- Ubuntu. Установка и настройка supervisor
- Установка WireGuard на Ubuntu 20.04 LTS. Часть вторая из двух
- Установка WireGuard на Ubuntu 20.04 LTS. Часть первая из двух
- Удаленный рабочий стол в Ubuntu Desktop 18.04 LTS
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 12 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 11 из 12
Поиск: DNS • Docker • Linux • Ubuntu • Настройка • Сервер • Установка • Почта • Mailcow