🐳 Настройка Docker

Быстрый старт

docker pull ghcr.io/themadorg/madmail:latest

Теги образов (Image Tags)

Тег Описание
latest Последняя стабильная версия из основной ветки (main)
X.Y.Z Конкретная версия (например, 0.18.3)

Метод 1: Простой запуск по IP (SQLite)

docker run -d --name madmail \ -p 25:25 \ -p 143:143 \ -p 465:465 \ -p 587:587 \ -p 993:993 \ -p 80:80 \ -p 443:443 \ -p 1080:1080 \ -v ./madmail.conf:/data/madmail.conf \ -v ./data:/data \ -v ./tls:/data/tls \ -e MADMAIL_HOSTNAME=IP_ВАШЕГО_СЕРВЕРА \ -e MADMAIL_DOMAIN="[IP_ВАШЕГО_СЕРВЕРА]" \ -e MADMAIL_PUBLIC_IP=IP_ВАШЕГО_СЕРВЕРА \ ghcr.io/themadorg/madmail:latest

Вам понадобятся файлы docker-compose.yml и madmail.conf. В этом режиме автоматически генерируются самоподписанные TLS-сертификаты (self-signed).

docker-compose.yml
services:
  madmail:
    image: ghcr.io/themadorg/madmail:latest
    restart: always
    ports:
      - "25:25"      # SMTP
      - "143:143"    # IMAP (STARTTLS)
      - "465:465"    # Submission (TLS/SSL)
      - "587:587"    # Submission (STARTTLS)
      - "993:993"    # IMAPS (TLS/SSL)
      - "80:80"      # HTTP
      - "443:443"    # HTTPS
      - "1080:1080"  # Shadowsocks
    volumes:
      - ./madmail.conf:/data/madmail.conf
      - ./data:/data
      - ./tls:/data/tls
    environment:
      - MADMAIL_HOSTNAME=IP_ВАШЕГО_СЕРВЕРА
      - MADMAIL_DOMAIN=[IP_ВАШЕГО_СЕРВЕРА]
      - MADMAIL_PUBLIC_IP=IP_ВАШЕГО_СЕРВЕРА
      - MADMAIL_SQLITE_UNSAFE_SYNC_OFF=1
Примечание: При использовании IP вместо домена необходимо обернуть его в квадратные скобки в MADMAIL_DOMAIN: [203.0.113.50]

Метод 2: С использованием PostgreSQL

Ошибка database is locked в SQLite решается переходом на PostgreSQL. Также становится доступным pub/sub для обновления IMAP в реальном времени.

docker-compose.yml
services:
  madmail:
    image: ghcr.io/themadorg/madmail:latest
    restart: always
    ports:
      - "25:25"
      - "143:143"
      - "465:465"
      - "587:587"
      - "993:993"
      - "80:80"
      - "443:443"
      - "1080:1080"
    volumes:
      - ./madmail.conf:/data/madmail.conf
      - ./data:/data
      - ./tls:/data/tls
    environment:
      - MADMAIL_HOSTNAME=IP_ВАШЕГО_СЕРВЕРА
      - MADMAIL_DOMAIN=[IP_ВАШЕГО_СЕРВЕРА]
      - MADMAIL_PUBLIC_IP=IP_ВАШЕГО_СЕРВЕРА
      - POSTGRES_USER=madmail
      - POSTGRES_PASSWORD=madmail_pass
      - POSTGRES_DB=madmail
    depends_on:
      - db

  db:
    image: postgres:alpine
    restart: always
    environment:
      - POSTGRES_USER=madmail
      - POSTGRES_PASSWORD=madmail_pass
      - POSTGRES_DB=madmail
    volumes:
      - ./pgdata:/var/lib/postgresql/data

Метод 3: Домен с автоматическим TLS (Let's Encrypt)

⚠️ Предварительные требования:
docker-compose.yml
services:
  madmail:
    image: ghcr.io/themadorg/madmail:latest
    restart: always
    ports:
      - "25:25"
      - "143:143"
      - "465:465"
      - "587:587"
      - "993:993"
      - "80:80"
      - "443:443"
      - "1080:1080"
    volumes:
      - ./madmail.conf:/data/madmail.conf
      - ./data:/data
    environment:
      - MADMAIL_HOSTNAME=chat.example.org
      - MADMAIL_DOMAIN=chat.example.org
      - MADMAIL_PUBLIC_IP=203.0.113.50
      - MADMAIL_ACME_EMAIL=admin@example.org
Как это работает:
  1. Madmail запускает HTTP-сервер на порту 80 для ACME-проверки
  2. Let's Encrypt выдает сертификат при первом TLS-подключении
  3. Сертификаты хранятся в /data/autocert/ и продлеваются автоматически
  4. Обычные HTTP-запросы (не ACME) перенаправляются на HTTPS (302)

Порты

Порт Протокол Описание
25SMTPВходящая/исходящая почта
143IMAPЧтение почты (STARTTLS)
465SubmissionИсходящая почта (TLS/SSL)
587SubmissionИсходящая почта (STARTTLS)
993IMAPSЧтение почты (TLS/SSL)
80HTTPРегистрация + ACME-проверка
443HTTPSРегистрация + ALPN мультиплексор
1080SOCKS5Shadowsocks прокси

Тома (Volumes)

Путь в контейнере Описание
/data/madmail.confФайл конфигурации сервера
/dataДиректория состояния (БД, ключи, сертификаты)
/data/tlsФайлы TLS-сертификатов

Сборка из исходного кода

Dockerfile
docker build -t madmail .
Compose Build
docker compose up -d --build

Docker-образы автоматически собираются и отправляются в GHCR при каждом коммите в ветку main.