Mailcow – готовый почтовый сервер на основе Postfix, Dovecot и другого программного обеспечения с открытым исходным кодом, который обеспечивает удобный современный веб-интерфейс для администрирования и использования электронной почты. В качестве почтового web клиента используется SOGo.
Mailcow это простой, универсальный комбайн с простым интерфейсом, который основан на docker контейнерах и можно использовать для быстрого развертывания полнофункционального почтового сервиса в небольших организациях. По простоте и функционалу он превосходит популярный iRedMail.
В этой статье мы рассмотрим, как настроить необходимые DNS записи для работы почты и развернуть почтовый сервер mailcow на Ubuntu 20.04.
Добавляем официальный репозиторий Docker
Mailcow основан на контейнерах, поэтому нужно сначала установить Docker. Обновите существующий перечень пакетов:
sudo apt update
Затем установите пакеты, которые позволяют apt использовать пакеты по HTTPS:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Следующие команды позволяет загрузить и установить официальный ключ GPG Docker. Ключ используется для проверки пакетов, установленных из репозитория Docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Теперь, когда официальный ключ GPG установлен, выполните следующие команды, чтобы добавить стабильный репозиторий Docker в Ubuntu:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Затем обновите базу данных пакетов информацией из вновь добавленного репозитория:
sudo apt update
Далее устанавливаем Docker:
sudo apt install docker-ce
Убедитесь, что Docker CE установлен правильно, запустив образ hello-world:
sudo docker run hello-world
Вы должны увидеть строки, похожие на показанные ниже:
Output: docker-compose version 1.28.6, build 5db8d86f
Установка Docker Compose
В Ubuntu Linux вы можете загрузить Docker Compose со страницы выпуска репозитория Compose на GitHub . Для загрузки последней версии 1.28.6 выполните следующие команды:
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
После загрузки сделаем файл исполняемым и создадим символическую ссылку на /usr/binary
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
Проверьте, что Docker Compose работает:
docker-compose –version
Установка MailCow
Теперь, когда Docker и Docker Compose установлены, можно приступить к установке Mailcow.
Сначала установите Git:
sudo apt install git
После этого перейдите в каталог /opt и склонируйте репозиторий mailcow-dockerized:
cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
Затем запустите скрипт чтобы загрузить зависимости Mailcow и сгенерировать конфиг файл:
sudo ./generate_config.sh
Сначала нужно указать имя почтового сервера (host name), например
mail.example.ru
:
Укажите временную зону (Europe/Moscow).
Timezone [Etc/UTC]: Europe/Moscow
Мы сгенерировали конфиг mailcow.conf на основе которого будет собираться связка из docker-контейнеров. При необходимости можно изменить порты если они у вас уже заняты, например, другими докер контейнерами, а также изменить hostname (MAILCOW_HOSTNAME=mail.example.ru)
Порты по умолчанию:
SMTP_PORT=25 SMTPS_PORT=465 SUBMISSION_PORT=587 IMAP_PORT=143 IMAPS_PORT=993 POP_PORT=110 POPS_PORT=995 SIEVE_PORT=4190 DOVEADM_PORT=127.0.0.1:19991 HTTP=80 HTTPS=443
Запускаем установку всех связанных контейнеров командой:
sudo docker-compose up -d
Установка может занять от 5 до 15 минут. В конце установки вы увидим что-то похожее…
Creating mailcowdockerized_dockerapi-mailcow_1 ... done Creating mailcowdockerized_olefy-mailcow_1 ... done Creating mailcowdockerized_memcached-mailcow_1 ... done Creating mailcowdockerized_watchdog-mailcow_1 ... done Creating mailcowdockerized_unbound-mailcow_1 ... done Creating mailcowdockerized_sogo-mailcow_1 ... done Creating mailcowdockerized_ejabberd-mailcow_1 ... done Creating mailcowdockerized_clamd-mailcow_1 ... done Creating mailcowdockerized_solr-mailcow_1 ... done Creating mailcowdockerized_redis-mailcow_1 ... done Creating mailcowdockerized_php-fpm-mailcow_1 ... done Creating mailcowdockerized_mysql-mailcow_1 ... done Creating mailcowdockerized_nginx-mailcow_1 ... done Creating mailcowdockerized_dovecot-mailcow_1 ... done Creating mailcowdockerized_postfix-mailcow_1 ... done Creating mailcowdockerized_acme-mailcow_1 ... done Creating mailcowdockerized_netfilter-mailcow_1 ... done Creating mailcowdockerized_rspamd-mailcow_1 ... done Creating mailcowdockerized_ipv6nat-mailcow_1 ... done
Теперь вы можете получить доступ к веб интерфейсу mailcow
https://${MAILCOW_HOSTNAME}
с учетными данными по умолчанию admin и паролем администратора moohoo. (У меня это http://192.168.140.134/)
Настройка DNS записей для почтового сервера
PTR-запись
Убедитесь, что запись PTR вашего IP-адреса соответствует FQDN вашего хоста mailcow: ${MAILCOW_HOSTNAME}. Эта запись обычно устанавливается у провайдера, у которого вы арендовали IP-адрес (сервер).
Минимальная конфигурация DNS
В этом примере показан набор записей для одного домена, управляемого mailcow. Каждому домену, добавленному в mailcow, для правильной работы необходим как минимум этот набор записей:
#Name | Type | Value |
IN A | 1.2.3.4 | |
autodiscover | IN CNAME | mail.example.ru. (your ${MAILCOW_HOSTNAME}) |
autoconfig | IN CNAME | mail.example.ru. (your ${MAILCOW_HOSTNAME}) |
@ | IN MX 0 | mail.example.ru. (your ${MAILCOW_HOSTNAME}) |
MX-запись вид DNS-записи, предназначенный для регистрации почтовых SMTP серверов. Именно с ее помощью почтовый агент отправителя определяет smtp сервер, на которые будет выполняться доставку письма.
DKIM-запись
Настоятельно рекомендуется создать запись DKIM TXT в пользовательском интерфейсе mailcow и установить соответствующую запись TXT в записях DNS.
#Name | Type | Value |
dkim._domainkey | IN TXT | «v=DKIM1;k=rsa;t=s;s=email;p=MIIB…» |
SPF-запись
SP позволяет владельцу домена указать в TXT-записи, соответствующей имени домена, список серверов, имеющих право отправлять email-сообщения с обратными адресами в этом домене.
Пример SPF-данных в TXT-записи DNS:
#Name | Type | Value |
IN TXT | «v=spf1 a mx -all» |
DMARC-запись
DMARC — предназначенна для снижения количества спамовых и фишинговых электронных писем, основанная на идентификации почтовых доменов отправителя на основании правил и признаков, заданных на почтовом сервере получателя
Пример DMARS-данных в TXT-записи DNS:
#Name | Type | Value |
_dmarc | IN TXT | «v=DMARC1; p=quarantine; rua=mailto:[email protected]; ruf=mailto:[email protected]; sp=quarantine» |
Управление Docker контейнерами Mailcow
Управление контейнерами, их состояние, перезапуск и просмотр журналов, можно осуществлять с помощью пользовательского интерфейса mailcow, а также через стандартные команды docker-compose.
Создание почтового домена, ящика и проверка работоспособности
Теперь вам нужно добавить обслуживаемый домен через веб интерфейс mailcow. Вверху, в основных вкладках выберите “Конфигурация” -> “Настройка почты”.
Далее: на вкладке “Домены”. В меню справа, нажимаем на “Добавить домен”.
Затем: в появившемся окне заполните основные параметры (Максимальное количество ящиков, их размер, нужно ли создавать глобальную адресную книгу и т.д.) и нажимаем на “Добавить домен и перезапустить SOGo”.
Для создания почтового ящика необходимо перейти на вкладку “Почтовые ящики” и нажать на “Добавить почтовый аккаунт”
Затем в появившемся окне заполняем основные параметры (имя, размер ящика, пароль) и нажимаем на “Добавить”
Теперь можно зайти в веб интерфейс почтового ящика перейдя по адресу http://${MAILCOW_HOSTNAME}/SOGo (у меня это http://192.168.140.134/SOGo/).
После успешной автаризации мы увидем главное экран почтового клиента.
Mailcow это набор контейнеров docker, который позволит вам максимально быстро развернуть простой и современный почтовый сервер с дружественными интерфейсом.
Спасибо.
Пользую эту связку, но без докера.
Поднимал и настраивал все руками — получил большой опыт.
У меня привязка к LDAP (AD).
PS. У sogo есть неприятная особенность. Попробуйте создать пол-ля с фамиилией, где 2-3-й буквой будет Б. Затем создать письмо и попытаться поискать в адресной книге этого пол-ля. У вас получится набрать только буквы ДО буквы Б — sogo воспринимает Б как ЗАПЯТУЮ (
Я писал им про это,но они до сих пор это не исправили.
Костыль (войти в докер-контейнер сого):
cp -fv /usr/lib/GNUstep/SOGo/WebServerResources/js/Mailer.services.js{,.bak}
sed -i 's/,n.KEY_CODE.COMMA,n.KEY_CODE.SEMICOLON//' /usr/lib/GNUstep/SOGo/WebServerResources/js/Mailer.services.js
cp -fv /usr/lib/GNUstep/SOGo/WebServerResources/js/Mailer.services.js.map{,.bak}
sed -i 's/"COMMA","SEMICOLON",//' /usr/lib/GNUstep/SOGo/WebServerResources/js/Mailer.services.js.map
cp -fv /usr/lib/GNUstep/SOGo/WebServerResources/js/Mailer/MessageEditorController.js{,.bak}
sed -i -e '/this\.recipientSeparatorKeys.*\[$/,/\];$/c\
this\.recipientSeparatorKeys = \[\
\$mdConstant\.KEY_CODE\.ENTER,\
\$mdConstant\.KEY_CODE\.TAB\
\];' /usr/lib/GNUstep/SOGo/WebServerResources/js/Mailer/MessageEditorController.js
docker exec -it 532d7f9c59dc bash «cp -fv /usr/lib/GNUstep/SOGo/WebServerResources/js/Mailer.services.js{,.bak}»
bash: cp -fv /usr/lib/GNUstep/SOGo/WebServerResources/js/Mailer.services.js{,.bak}: No such file or directory
У меня Sogo не в докере.Поищите руками в докере этот файл.
а как ты привязал к ldap, можешь рассказать поподробнее
https://github.com/Programmierus/ldap-mailcow
и что, хочешь сказать оно заработало?
А как это все лучше бэкапить?
В комплекте есть скрипты, вот здесь подробно описано:
_https://mailcow.github.io/mailcow-dockerized-docs/b_n_r_backup/
sudo docker run hello-world — после выдало ошибку:
docker: Error response from daemon: Head _https://registry-1.docker.io/v2/library/hello-world/manifests/latest: Get _https://auth.docker.io/token?scope=repository%3Alibrary%2Fhello-world%3Apull&service=registry.docker.io: x509: certificate signed by unknown authority.
А масштабироваться через docker swarm всё это будет?
Странно. Третья интекрация. На Hyper-v. Диск фииксировыанный. Находил рекомендациии в конфиге удалить oom_control. Короче, что не делал — что то не выходит.
free -h
total used free shared buff/cache available
Mem: 5.7Gi 2.0Gi 806Mi 1.0Mi 2.9Gi 3.4Gi
Swap: 3.7Gi 0.0Ki 3.7Gi
Creating mailcowdockerized_watchdog-mailcow_1 … error
Creating mailcowdockerized_dockerapi-mailcow_1 …
Creating mailcowdockerized_sogo-mailcow_1 …
Creating mailcowdockerized_clamd-mailcow_1 … error
Creating mailcowdockerized_olefy-mailcow_1 …
ERROR: for mailcowdockerized_clamd-mailcow_1 Cannot start service clamd-mailcow: error while creating mount source path ‘/opt/mailcow-dockerized/data/conf/clamav’: mkdir /opt/mailcow-dockerized: read-only file system
Creating mailcowdockerized_solr-mailcow_1 … done
Creating mailcowdockerized_unbound-mailcow_1 … error
Creating mailcowdockerized_memcached-mailcow_1 … done
Creating mailcowdockerized_redis-mailcow_1 … done
ERROR: for mailcowdockerized_sogo-mailcow_1 Cannot start service sogo-mailcow: error while creating mount source path ‘/opt/mailcow-dockerized/data/conf/sogo/
Creating mailcowdockerized_dockerapi-mailcow_1 … done
ERROR: for mailcowdockerized_unbound-mailcow_1 Cannot start service unbound-mailcow: error while creating mount source path ‘/opt/mailcow-dockerized/data/hook
Creating mailcowdockerized_olefy-mailcow_1 … done
Creating mailcowdockerized_php-fpm-mailcow_1 … error
ERROR: for mailcowdockerized_php-fpm-mailcow_1 Cannot start service php-fpm-mailcow: error while creating mount source path ‘/opt/mailcow-dockerized/data/hooks/phpfpm’: mkdir /opt/mailcow-dockerized: read-only file system
ERROR: for clamd-mailcow Cannot start service clamd-mailcow: error while creating mount source path ‘/opt/mailcow-dockerized/data/conf/clamav’: mkdir /opt/mailcow-dockerized: read-only file system
ERROR: for watchdog-mailcow Cannot start service watchdog-mailcow: error while creating mount source path ‘/opt/mailcow-dockerized/data/assets/ssl’: mkdir /opt/mailcow-dockerized: read-only file system
ERROR: for sogo-mailcow Cannot start service sogo-mailcow: error while creating mount source path ‘/opt/mailcow-dockerized/data/conf/sogo/custom-favicon.ico’: mkdir /opt/mailcow-dockerized: read-only file system
ERROR: for unbound-mailcow Cannot start service unbound-mailcow: error while creating mount source path ‘/opt/mailcow-dockerized/data/hooks/unbound’: mkdir /opt/mailcow-dockerized: read-only file system
ERROR: for php-fpm-mailcow Cannot start service php-fpm-mailcow: error while creating mount source path ‘/opt/mailcow-dockerized/data/hooks/phpfpm’: mkdir /opt/mailcow-dockerized: read-only file system
ERROR: Encountered errors while bringing up the project.
[email protected]:/opt/mailcow-dockerized#
What is happening?
Please do not stop the stack while we are initializing the database or do other preparations.
What is happening? — Nginx cannot connect to an upstream server or other services are not ready yet.
This is fine if mailcow was just installed or updated and can take a few minutes to complete.
Please check the logs or contact support if the error persists.
Quick debugging
Check Nginx and PHP logs:
docker-compose logs —tail=200 php-fpm-mailcow nginx-mailcow
Make sure your SQL credentials in mailcow.conf (a link to .env) do fit your initialized SQL volume. If you see an access denied, you might have the wrong mailcow.conf:
source mailcow.conf ; docker-compose exec mysql-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME}
In case of a previous failed installation, create a backup of your existing data, followed by removing all volumes and starting over (NEVER do this with a production system, it will remove ALL data):
BACKUP_LOCATION=/tmp/ ./helper-scripts/backup_and_restore.sh backup all
docker-compose down —volumes ; docker-compose up -d
Make sure your timezone is correct. Use «America/New_York» for example, do not use spaces. Check here for a list.
Кто-то сталкивался с такой ошибкой после запуска докер стака?
# cd /var/docker/mailcow-dockerized
# docker-compose stop
# docker-compose rm -f
# docker system prune -a
[y]
# rm -rf /var/lib/docker/volumes/mailcow*
# service docker restart
# docker-compose up -d
Mailcow поддерживает также roundcube webmail,а можно ли сделать следующим образом:при нажатии кнопки на главное странице webmail, открывались автоматически не сого(что по умолчанию),а можно было сделать выбор между sogo и roundcube
После команды sudo docker-compose up -d ошибки:
ERROR: The Compose file ‘./docker-compose.yml’ is invalid because:
services.nginx-mailcow.ports contains an invalid type, it should be a number, or an object
services.nginx-mailcow.ports contains an invalid type, it should be a number, or an object
В файле docker-compose.yml 380 и 381 строки измените на
— «${HTTPS_PORT:-443}:443»
— «${HTTP_PORT:-80}:80»
Creating mailcowdockerized_dockerapi-mailcow_1 … done
Creating mailcowdockerized_memcached-mailcow_1 …
Creating mailcowdockerized_sogo-mailcow_1 … done
Creating mailcowdockerized_watchdog-mailcow_1 …
Creating mailcowdockerized_solr-mailcow_1 … done
Creating mailcowdockerized_olefy-mailcow_1 … done
Creating mailcowdockerized_olefy-mailcow_1 …
Creating mailcowdockerized_redis-mailcow_1 …
ERROR: for mailcowdockerized_unbound-mailcow_1 UnixHTTPConnectionPool(host=’localhost’, port=None): Read timed out. (read timeout=60)
ERROR: for mailcowdockerized_redis-mailcow_1 UnixHTTPConnectionPool(host=’localhost’, port=None): Read timed out. (read timeout=60)
ERROR: for mailcowdockerized_memcached-mailcow_1 UnixHTTPConnectionPool(host=’localhost’, port=None): Read timed out. (read timeout=60)
ERROR: for mailcowdockerized_watchdog-mailcow_1 UnixHTTPConnectionPool(host=’localhost’, port=None): Read timed out. (read timeout=60)
ERROR: for unbound-mailcow UnixHTTPConnectionPool(host=’localhost’, port=None): Read timed out. (read timeout=60)
ERROR: for redis-mailcow UnixHTTPConnectionPool(host=’localhost’, port=None): Read timed out. (read timeout=60)
ERROR: for memcached-mailcow UnixHTTPConnectionPool(host=’localhost’, port=None): Read timed out. (read timeout=60)
ERROR: for watchdog-mailcow UnixHTTPConnectionPool(host=’localhost’, port=None): Read timed out. (read timeout=60)
ERROR: An HTTP request took too long to complete. Retry with —verbose to obtain debug information.
If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).
теперь это
Starting mailcowdockerized_redis-mailcow_1 …
mailcowdockerized_olefy-mailcow_1 is up-to-date
mailcowdockerized_watchdog-mailcow_1 is up-to-date
mailcowdockerized_sogo-mailcow_1 is up-to-date
mailcowdockerized_unbound-mailcow_1 is up-to-date
mailcowdockerized_solr-mailcow_1 is up-to-date
mailcowdockerized_memcached-mailcow_1 is up-to-date
mailcowdockerized_mysql-mailcow_1 is up-to-date
mailcowdockerized_clamd-mailcow_1 is up-to-date
Starting mailcowdockerized_postfix-mailcow_1 …
mailcowdockerized_dovecot-mailcow_1 is up-to-date
mailcowdockerized_ofelia-mailcow_1 is up-to-date
mailcowdockerized_rspamd-mailcow_1 is up-to-date
Starting mailcowdockerized_postfix-mailcow_1 … error
Starting mailcowdockerized_redis-mailcow_1 … errortfix-mailcow_1 (38ff9213f3e3b0331976cccb30a4db5e2a0bff22528af3d2462904f2cf3a13b7): Error starting userland proxy: listen tcp4 0.0.0.0:25: bind: address already in use
ERROR: for mailcowdockerized_redis-mailcow_1 Cannot start service redis-mailcow: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: open /proc/sys/net/core/somaxconn: no such file or directory: unknown
ERROR: for postfix-mailcow Cannot start service postfix-mailcow: driver failed programming external connectivity on endpoint mailcowdockerized_postfix-mailcow_1 (38ff9213f3e3b0331976cccb30a4db5e2a0bff22528af3d2462904f2cf3a13b7): Error starting userland proxy: listen tcp4 0.0.0.0:25: bind: address already in use
ERROR: for redis-mailcow Cannot start service redis-mailcow: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: open /proc/sys/net/core/somaxconn: no such file or directory: unknown
ERROR: Encountered errors while bringing up the project.
всё сделал, шикарно, а как сделать чтоб при входе на почту открывался сразу SOGo и не mailcow
подскажите куда подсунуть сертификаты ссл?
это сделал, как сделать редирект на сого, если использую 301ый, то картинки не грузятся
Подскажите пожалуйста у меня после установки отсутствуют ARC/DKIM ключи, добавить не могу пишет Доступ запрещён, или указаны неверные данные
Отбой сделал через openssl genrsa -out mail.example.ru 1024
Добрый день, подскажите пожалуйста, установил докер потом mailcow все норм, создал домен-почту, но при входе в SOGo нет ни одной папки вообще.
не решили проблему?
нет, образ ставил на виртуалку, может что то нужно в правилах прописать или куда копать хз, как будто dovecot не работает, хотя контейнер запущен
в логах постфикса ошибки:
warning: process /usr/lib/postfix/sbin/smtpd pid 428 exit status 1
warning: /usr/lib/postfix/sbin/smtpd: bad command startup — throttling
нет, образ ставил на виртуалку, может что то нужно в правилах прописать или куда копать хз, как будто dovecot не работает, хотя контейнер запущен
Подскажите, как изменить порядок отображения почтовых папок?
Или хоть по алфавиту их расположить…