Установка почтового сервера Mailcow на Ubuntu 22.04 LTS

05.02.2023

Теги: DNSDockerLinuxUbuntuНастройкаСерверУстановка

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 • Docker • Linux • Ubuntu • Настройка • Сервер • Установка • Почта • Mailcow

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.