Перейти к содержанию

Установка animails и Mailman 3 на базе docker-версий

Информация

Данное руководство является копией репозитория dockerized-animails-mailman. Пожалуйста, публикуйте сообщения о проблемах, вопросы и предложения по улучшению в трекере задач этого репозитория.

Внимание

animails не несет ответственности за любую потерю данных, повреждение оборудования или сломанные клавиатуры. Данное руководство предоставляется без каких-либо гарантий. Сделайте резервные копии перед началом, потому что: Нет бэкапа — нет пощады!

Введение

Цель данного руководства — установить и настроить animails совместно с docker-mailman, а также предоставить полезные скрипты. Важным условием является сохранение animails и Mailman в виде отдельных инсталляций для возможности их независимого обновления.

В интернете существуют и другие руководства, но они либо устарели, либо содержат неполную документацию/конфигурацию. Данное руководство основано на работах:

После выполнения инструкций будут запущены animails и docker-mailman, а Apache в качестве обратного прокси-сервера будет обслуживать веб-интерфейсы.

Используемая операционная система — Ubuntu 20.04 LTS.

Установка

Руководство разделено на следующие этапы:

  1. Настройка DNS
  2. Установка Apache в качестве обратного прокси
  3. Получение SSL-сертификатов через Let's Encrypt
  4. Установка animails с интеграцией Mailman
  5. Установка Mailman
  6. 🏃 Запуск

Настройка DNS

# Name    Type       Value
lists     IN A       1.2.3.4
lists     IN AAAA    dead:beef

Установка Apache в качестве обратного прокси

Установите Apache, например, используя руководство от Digital Ocean: How To Install the Apache Web Server on Ubuntu 20.04.

Активируйте необходимые модули Apache (от имени root или через sudo):

a2enmod rewrite proxy proxy_http headers ssl wsgi proxy_uwsgi http2

Возможно, для работы этих модулей потребуется установить дополнительные пакеты. Вам может помочь этот PPA от Ondřej Surý.

Конфигурация vHost

Скопируйте файлы animails.conf и mailman.conf в папку конфигураций Apache sites-available (например, в /etc/apache2/sites-available).

В файле animails.conf измените:

  • MAILCOW_HOSTNAME на ваш MAILCOW_HOSTNAME

В файле mailman.conf измените:

  • MAILMAN_DOMAIN на ваш домен Mailman (например, lists.example.org)

Не активируйте конфигурацию сейчас, так как SSL-сертификаты и директории еще отсутствуют.

Получение SSL-сертификатов через Let's Encrypt

Проверьте, доступна ли ваша DNS-конфигурация в интернете и указывает ли она на правильные IP-адреса, например, с помощью MXToolBox:

Установите certbot (от имени root или через sudo):

apt install certbot

Получите нужные сертификаты (от имени root или через sudo):

certbot certonly -d MAILCOW_HOSTNAME
certbot certonly -d MAILMAN_DOMAIN

Установка animails с интеграцией Mailman

Установка animails

Следуйте [инструкции по установке animails]../../getstarted/install.ru.md). Пропустите шаг «Запуск animails» и не выполняйте команды pull и up!

Настройка animails

Выполните шаг Инициализация animails из официальной документации и отредактируйте конфигурацию с помощью nano animails.conf, изменив следующие переменные:

HTTP_PORT=18080            # не используйте 8080, так как он нужен mailman
HTTP_BIND=127.0.0.1        #
HTTPS_PORT=18443           # можно использовать 8443
HTTPS_BIND=127.0.0.1       #

SKIP_LETS_ENCRYPT=y        # SSL-терминацию выполнит обратный прокси

SNAT_TO_SOURCE=1.2.3.4     # замените на ваш IPv4
SNAT6_TO_SOURCE=dead:beef  # замените на ваш глобальный IPv6

Добавление интеграции с Mailman

Создайте файл /opt/animails/docker-compose.override.yml (например, через nano) и добавьте следующие строки:

services:
  postfix-animails:
    volumes:
      - /opt/mailman/core/var/data/:/opt/mailman/core/var/data/
    networks:
      - docker-mailman_mailman

networks:
  docker-mailman_mailman:
    external: true
Дополнительный том используется Mailman для генерации файлов конфигурации для animails postfix. Внешняя сеть создается и используется Mailman. animails она необходима для доставки входящей почты списков рассылки в Mailman.

Создайте файл /opt/animails/data/conf/postfix/extra.cf (например, через nano) и добавьте следующие строки:

# mailman

recipient_delimiter = +
unknown_local_recipient_reject_code = 550
owner_request_special = no

local_recipient_maps =
  regexp:/opt/mailman/core/var/data/postfix_lmtp,
  proxy:unix:passwd.byname,
  $alias_maps
virtual_mailbox_maps =
  proxy:mysql:/opt/postfix/conf/sql/mysql_virtual_mailbox_maps.cf,
  regexp:/opt/mailman/core/var/data/postfix_lmtp
transport_maps =
  pcre:/opt/postfix/conf/custom_transport.pcre,
  pcre:/opt/postfix/conf/local_transport,
  proxy:mysql:/opt/postfix/conf/sql/mysql_relay_ne.cf,
  proxy:mysql:/opt/postfix/conf/sql/mysql_transport_maps.cf,
  regexp:/opt/mailman/core/var/data/postfix_lmtp
relay_domains =
  proxy:mysql:/opt/postfix/conf/sql/mysql_virtual_relay_domain_maps.cf,
  regexp:/opt/mailman/core/var/data/postfix_domains
relay_recipient_maps =
  proxy:mysql:/opt/postfix/conf/sql/mysql_relay_recipient_maps.cf,
  regexp:/opt/mailman/core/var/data/postfix_lmtp
Так как здесь мы перезаписываем конфигурацию animails postfix, этот шаг может нарушить обычную транспортировку почты. Проверьте оригинальные файлы конфигурации на предмет изменений.

SSL-сертификаты

Поскольку мы проксируем animails, нам нужно скопировать SSL-сертификаты в файловую структуру animails. Эту задачу выполнит скрипт renew-ssl.sh:

  • Скопируйте файл в /opt/animails
  • Измените animails_HOSTNAME на ваш хостнейм animails
  • Сделайте его исполняемым (chmod a+x renew-ssl.sh)
  • Пока не запускайте его, так как сначала нужен Mailman

Вам нужно создать задачу в cron, чтобы новые сертификаты копировались автоматически. Выполните от имени root или через sudo:

crontab -e

Чтобы запускать скрипт каждый день в 5 утра, добавьте:

0   5  *   *   *     /opt/animails/renew-ssl.sh

Установка Mailman

В целом следуйте инструкциям docker-mailman. Поскольку их много, ниже приведено краткое изложение действий:

От имени root или через sudo:

cd /opt
mkdir -p mailman/core
mkdir -p mailman/web
git clone https://github.com/maxking/docker-mailman
cd docker-mailman

Настройка Mailman

Создайте длинный ключ для Hyperkitty, например, командой cat /dev/urandom | tr -dc a-zA-Z0-9 | head -c30; echo. Сохраните его как HYPERKITTY_KEY.

Создайте длинный пароль для базы данных, например, командой cat /dev/urandom | tr -dc a-zA-Z0-9 | head -c30; echo. Сохраните его как DBPASS.

Создайте длинный ключ для Django, например, командой cat /dev/urandom | tr -dc a-zA-Z0-9 | head -c30; echo. Сохраните его как DJANGO_KEY.

Создайте файл /opt/docker-mailman/docker-compose.override.yaml и замените HYPERKITTY_KEY, DBPASS и DJANGO_KEY на сгенерированные значения:

services:
  mailman-core:
    environment:
    - DATABASE_URL=postgresql://mailman:DBPASS@database/mailmandb
    - HYPERKITTY_API_KEY=HYPERKITTY_KEY
    - TZ=Europe/Berlin
    - MTA=postfix
    restart: always
    networks:
      - mailman

  mailman-web:
    environment:
    - DATABASE_URL=postgresql://mailman:DBPASS@database/mailmandb
    - HYPERKITTY_API_KEY=HYPERKITTY_KEY
    - TZ=Europe/Berlin
    - SECRET_KEY=DJANGO_KEY
    - SERVE_FROM_DOMAIN=MAILMAN_DOMAIN # например, lists.example.org
    - MAILMAN_ADMIN_USER=admin # имя администратора
    - MAILMAN_ADMIN_EMAIL=admin@example.org # email администратора
    - UWSGI_STATIC_MAP=/static=/opt/mailman-web-data/static
    restart: always

  database:
    environment:
    - POSTGRES_PASSWORD=DBPASS
    restart: always

В блоке mailman-web укажите корректные значения для SERVE_FROM_DOMAIN (например, lists.example.org), MAILMAN_ADMIN_USER и MAILMAN_ADMIN_EMAIL. Вам понадобятся данные администратора для входа в веб-интерфейс (Postorius). Для установки пароля в первый раз воспользуйтесь функцией «Забыли пароль» (Forgot password) в веб-интерфейсе.

О других параметрах конфигурации читайте в документации Mailman-web и Mailman-core.

Настройка Mailman core и Mailman web

Создайте файл /opt/mailman/core/mailman-extra.cfg со следующим содержимым. Адрес mailman@example.org должен указывать на действующий почтовый ящик или перенаправление.

[mailman]
default_language: de
site_owner: mailman@example.org

Создайте файл /opt/mailman/web/settings_local.py со следующим содержимым.

# locale
LANGUAGE_CODE = 'ru-ru'

# disable social authentication
MAILMAN_WEB_SOCIAL_AUTH = []

# change it
DEFAULT_FROM_EMAIL = 'mailman@example.org'

DEBUG = False

Вы можете изменить LANGUAGE_CODE и SOCIALACCOUNT_PROVIDERS в соответствии со своими потребностями.

🏃 Запуск

Выполните (от имени root или через sudo):

a2ensite animails.conf
a2ensite mailman.conf
systemctl restart apache2

cd /opt/docker-mailman
docker compose pull
docker compose up -d

cd /opt/animails/
docker compose pull
./renew-ssl.sh
a2ensite animails.conf
a2ensite mailman.conf
systemctl restart apache2

cd /opt/docker-mailman
docker-compose pull
docker-compose up -d

cd /opt/animails/
docker-compose pull
./renew-ssl.sh

Подождите несколько минут! Контейнерам нужно время для создания баз данных и конфигурационных файлов. Это может занять от 1 минуты и более.

Примечания

Новые списки не распознаются postfix мгновенно

При создании нового списка и попытке немедленно отправить письмо postfix может ответить User doesn't exist, так как он еще не знает о необходимости доставки письма в Mailman. Конфигурация в /opt/mailman/core/var/data/postfix_lmtp обновляется не мгновенно. Если список нужен немедленно, перезапустите postfix вручную:

cd /opt/animails
docker compose restart postfix-animails
cd /opt/animails
docker-compose restart postfix-animails

Обновление

Для Mailman просто получите последнюю версию из репозитория GitHub.

Резервное копирование

У animails есть собственный скрипт резервного копирования. [Ознакомьтесь с документацией]../../backup_restore/b_n_r-backup.ru.md) для получения дополнительной информации.

Mailman не содержит инструкций по резервному копированию в файле README.md. В репозитории GitBucket пользователя pgollor есть скрипт, который может быть полезен.

В README.md Mailman инструкции по бэкапу отсутствуют. В gitbucket от pgollor есть скрипт, который может быть полезен.

Список задач (ToDo)

Скрипт установки

Написать скрипт, подобный mailman-animails-integration/mailman-install.sh, так как многие шаги можно автоматизировать.

  1. Запрашивать все переменные конфигурации, создавать пароли и ключи.
  2. Выполнять (полу)автоматическую установку.
  3. Получать удовольствие!