Docs/docs/services/lxc212-mail/mailcow.md

21 KiB
Raw Blame History

📧 Почтовый сервер Mailcow (Olimp)

Дата обновления: 16.04.2026
Сервер: Olimp (Proxmox VE)
Контейнер: LXC 212 (mail)
Домен: zailon.ru
Внешний IP: 188.73.191.202
Внутренний IP: 192.168.1.212
Путь к данным: /mnt/mailcow/mailcow-dockerized


📋 Содержание

  1. Описание и архитектура
  2. Требования к ресурсам
  3. Подготовка контейнера
  4. Установка Mailcow
  5. Запуск и первичная настройка
  6. Настройка DNS
  7. Настройка Nginx Proxy Manager
  8. Проброс портов на роутере
  9. Настройка почтовых клиентов
  10. Полезные команды
  11. Решение проблем
  12. Безопасность и обслуживание
  13. Создание почтового ящика

1. Описание и архитектура

Mailcow — это готовый почтовый сервер на базе Docker, включающий:

Компонент Назначение
Postfix Приём и отправка писем (SMTP)
Dovecot Доступ к почте (IMAP/POP3)
SOGo Веб-интерфейс (почта, календарь, контакты)
Rspamd Антиспам-фильтр
ClamAV Антивирусная проверка
Unbound Локальный DNS-резолвер
MariaDB/Redis Базы данных и кэш

Архитектура развёртывания:

  • Контейнер LXC 212 (Ubuntu) на хосте Proxmox VE
  • Внутри LXC: Docker + Docker Compose
  • Все сервисы Mailcow запускаются как Docker-контейнеры
  • Данные хранятся в /mnt/mailcow (монтируемый том с HDD)

2. Требования к ресурсам

Минимальные требования

Ресурс Значение
CPU 2 ядра
RAM 4 ГБ (рекомендуется 6 ГБ для стабильной работы ClamAV)
Disk 40 ГБ (система + почта)
Swap 2 ГБ

Рекомендуемые настройки LXC

Выполняется на хосте Proxmox:

pct set 212 -memory 4096 -swap 2048 -cores 2
pct set 212 -features nesting=1,fuse=1

3. Подготовка контейнера

3.1 Проверка конфигурации

Выполняется на хосте Proxmox:

pct config 212

Обязательные параметры в выводе:

  • features: nesting=1,fuse=1
  • unprivileged: 0 (или отсутствие этой строки)
  • lxc.cgroup2.devices.allow: a

3.2 Проверка Docker внутри контейнера

Подключись по SSH к 192.168.1.212 и проверь версии:

docker --version
docker compose version

3.3 Остановка системного Postfix

Системный Postfix в Ubuntu может занимать порт 25:

systemctl stop postfix
systemctl disable postfix

4. Установка Mailcow

4.1 Клонирование репозитория

cd /mnt/mailcow
git clone https://github.com/mailcow/mailcow-dockerized

4.2 Генерация конфигурации

cd /mnt/mailcow/mailcow-dockerized
./generate_config.sh

Ответы на вопросы скрипта:

  1. Mail server hostname (FQDN): mail.zailon.ru
  2. Timezone: Asia/Yekaterinburg (или твоя)
  3. Branch: 1 (master — стабильная)
  4. IPv6: n (если не используется)

4.3 Правка docker-compose.yml для LXC

cd /mnt/mailcow/mailcow-dockerized
sed -i 's/ipv6nat:/#ipv6nat:/g' docker-compose.yml
sed -i 's/^  netfilter:/  #netfilter:/g' docker-compose.yml

5. Запуск и первичная настройка

5.1 Загрузка образов и запуск

cd /mnt/mailcow/mailcow-dockerized
docker compose pull
docker compose up -d

5.2 Проверка статуса контейнеров

cd /mnt/mailcow/mailcow-dockerized
docker compose ps

Ожидаемый результат: все контейнеры в статусе Up.

5.3 Первый вход в админку

  1. Открой в браузере: https://192.168.1.212
  2. Пропусти предупреждение о сертификате
  3. Логин: admin, Пароль: moohoo
  4. Сразу смени пароль в настройках профиля

5.4 Добавление домена

  1. В админке: ConfigurationMail SetupDomains
  2. Нажми Add domain
  3. Введи: zailon.ru
  4. Нажми Add domain and restart SOGo

5.5 Создание почтового ящика

  1. Mail SetupMailboxesAdd mailbox
  2. Заполни:
    • Email: olimp@zailon.ru
    • Name: Имя владельца
    • Password: надёжный пароль
    • Quota: 5120 (5 ГБ)
  3. Нажми Add mailbox

6. Настройка DNS

6.1 Получение записей из Mailcow

В админке: ConfigurationMail SetupDomains → кнопка DNS

6.2 Пример записей для zailon.ru

$ORIGIN zailon.ru.
mail                IN  A       188.73.191.202
@                   IN  MX      mail.zailon.ru. (pri=10)
@                   IN  TXT     "v=spf1 mx a:mail.zailon.ru -all"
dkim._domainkey     IN  TXT     "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkq..."
_dmarc              IN  TXT     "v=DMARC1; p=none; rua=mailto:olimp@zailon.ru"
autodiscover        IN  CNAME   mail.zailon.ru.
autoconfig          IN  CNAME   mail.zailon.ru.
_autodiscover._tcp  IN  SRV     0 0 443 mail.zailon.ru.

Важно: Ключ DKIM берётся из админки Mailcow (кнопка DNS). Он уникальный для твоей установки.

6.3 Обратная запись PTR

Обратись к провайдеру с запросом установить PTR для 188.73.191.202mail.zailon.ru. Без этого письма могут попадать в спам.


7. Настройка Nginx Proxy Manager

7.1 Создание Proxy Host

В админке NPM (LXC 201):

Параметр Значение
Domain Names mail.zailon.ru
Scheme https
Forward Hostname/IP 192.168.1.212
Forward Port 443
SSL Certificate Request a new SSL Certificate
Force SSL ON
Block Common Exploits ON

7.2 Advanced: Custom Nginx Configuration

proxy_ssl_verify off;
proxy_ssl_server_name on;

Это необходимо, так как Mailcow использует самоподписанный сертификат внутри сети.


8. Проброс портов на роутере

Имя Внешний порт Внутренний порт Протокол Назначение
mail_smtp 25 25 TCP Приём почты от внешних серверов
mail_imap 993 993 TCP Безопасный доступ к ящику (IMAP)
mail_smtp_ssl 465 465 TCP Отправка почты (SMTP SSL)
mail_smtp_tls 587 587 TCP Отправка почты (SMTP STARTTLS)

IP устройства: 192.168.1.212


9. Настройка почтовых клиентов

Параметры подключения

Параметр Значение
Email olimp@zailon.ru
Пароль пароль от ящика

Входящая почта (IMAP)

  • Сервер: mail.zailon.ru
  • Порт: 993
  • Безопасность: SSL/TLS

Исходящая почта (SMTP)

  • Сервер: mail.zailon.ru
  • Порт: 465 (SSL/TLS) или 587 (STARTTLS)
  • Аутентификация: Да, логин = email

Рекомендуемые клиенты

  • Android: K-9 Mail (бесплатно, open source) или Aqua Mail (платно, красивый интерфейс)
  • iOS: Родной клиент Почта или Spark
  • Desktop: Thunderbird, Outlook

10. Полезные команды

Переход в директорию Mailcow

cd /mnt/mailcow/mailcow-dockerized

Проверка статуса сервисов

docker compose ps

Просмотр логов

# Все сервисы
docker compose logs -f

# Только postfix
docker compose logs -f postfix-mailcow

# Только последние 50 строк
docker compose logs --tail=50 postfix-mailcow

Перезапуск сервисов

# Один сервис
docker compose restart postfix-mailcow

# Все сервисы
docker compose restart

Полная перезагрузка

docker compose down
docker compose up -d

Обновление Mailcow

./update.sh

Проверка DNS

nslookup -type=MX zailon.ru
nslookup -type=TXT zailon.ru

Проверка открытых портов

ss -tlnp | grep -E ':25|:443|:993'

11. Решение проблем

Письма не приходят извне

  1. Проверь проброс портов на роутере (25, 993, 465)
  2. Проверь DNS-записи: nslookup -type=MX zailon.ru
  3. Проверь логи postfix:
cd /mnt/mailcow/mailcow-dockerized
docker compose logs --tail=100 postfix-mailcow | grep -E 'connect|NOQUEUE|reject'

Ошибка "Waiting for DNS..." в Postfix

Проблема с Docker-сетью в LXC. Решение:

cd /mnt/mailcow/mailcow-dockerized
docker compose down
docker network rm mailcowdockerized_mailcow-network
docker compose up -d

SOGo: "not allowed in state 1"

  1. Очисти куки браузера
  2. Или перезапусти SOGo:
cd /mnt/mailcow/mailcow-dockerized
docker compose restart sogo-mailcow

Письма попадают в спам

  1. Проверь наличие и корректность записей SPF, DKIM, DMARC
  2. Убедись, что настроена PTR-запись у провайдера
  3. Не отправляй массовые рассылки с нового домена

Не могу зайти по https://mail.zailon.ru

  1. Проверь, что в NPM настроен прокси на 192.168.1.212:443
  2. Убедись, что в Custom Config добавлено proxy_ssl_verify off;
  3. Проверь, что сертификат Let's Encrypt выпущен (статус в NPM)

ClamAV не обновляет базы (ошибка 403)

Известная проблема CDN ClamAV. Антивирус продолжит работать на локальных сигнатурах. Для обновления можно:

  1. Подождать 24 часа (кулдаун)
  2. Или отключить ClamAV в mailcow.conf, если не критично:
SKIP_CLAMD=y

Затем: docker compose up -d


12. Безопасность и обслуживание

Регулярные задачи

Задача Периодичность Команда/Действие
Проверка логов Еженедельно docker compose logs --tail=100
Обновление Mailcow По выходу версии ./update.sh
Резервное копирование Ежедневно Настроить backup через Proxmox Backup Server
Проверка места на диске Еженедельно df -h /mnt/mailcow

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

Рекомендуемый способ — через Proxmox Backup Server (PBS):

  1. В веб-интерфейсе Proxmox выбери контейнер 212
  2. BackupBackup now
  3. Режим: snapshot, хранилище: olimpbkp
  4. Расписание: ежедневно в 03:00

Обновление системы

apt update && apt upgrade -y

Перезапуск контейнера (если обновилось ядро) выполняется на хосте Proxmox:

pct reboot 212

Мониторинг

Mailcow интегрируется с внешними системами мониторинга. Для Grafana (LXC 208):

  1. Добавь источник данных Prometheus: http://192.168.1.212:9900/metrics
  2. Импортируй дашборд Mailcow (ID: 13429)

Контакты для экстренных случаев

  • Администратор: Zailon
  • Сервер: Olimp (192.168.1.1)
  • Контейнер почты: 212 (192.168.1.212)
  • Документация: mail.md в репозитории конфигураций

##13. Создание почтового ящика

Через веб-интерфейс Mailcow

  1. Открой https://mail.zailon.ru в браузере
  2. Нажми «Войти» (правый верхний угол)
  3. Введи:
    • Логин: admin
    • Пароль: твой пароль администратора
  4. В левом меню выбери: ConfigurationMail SetupMailboxes
  5. Нажми зелёную кнопку Add mailbox
  6. Заполни форму:
Поле Что вписать Пример
Domain Выбери из списка zailon.ru
Local part Часть до @ zevs
Name Имя владельца Zevs
Password Пароль ящика ТвойНадёжныйПароль123!
Password (repeat) Повтори пароль ТвойНадёжныйПароль123!
Quota Лимит места в МБ 5120 (5 ГБ)
  1. Остальные поля не трогай
  2. Нажми Add mailbox

Ящик создан. Теперь можно:


🌐 Настройка Nginx Proxy Manager для mail.zailon.ru

Делается один раз при первом запуске почтового сервера.

Шаг 1: Открой админку NPM

  1. В браузере перейди: http://192.168.1.201:81
  2. Введи логин/пароль от NPM (если не менял — смотри в group_vars/all.yml или спроси у админа)

Шаг 2: Создай новый Proxy Host

  1. В меню слева выбери HostsProxy Hosts
  2. Нажми кнопку Add Proxy Host (внизу справа)
  3. Заполни вкладку Details:
Поле Значение
Domain Names mail.zailon.ru (нажми Enter после ввода)
Scheme https
Forward Hostname / IP 192.168.1.212
Forward Port 443
Cache Assets выключено
Block Common Exploits включено
WebSockets Support выключено

Шаг 3: Настрой SSL

  1. Перейди на вкладку SSL
  2. Выбери: Request a new SSL Certificate
  3. Поставь галочки:
    • Force SSL
    • HTTP/2 Support
    • I agree to the Let's Encrypt Terms of Service
  4. Поле Email for Let's Encrypt — введи твой email (для уведомлений)

Шаг 4: Добавь настройки для HTTPS-проксирования

  1. Перейди на вкладку Advanced
  2. В поле Custom Nginx Configuration вставь:
proxy_ssl_verify off;
proxy_ssl_server_name on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# Security headers
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options SAMEORIGIN always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), camera=(), microphone=(), payment=()" always;

Шаг 5: Ограничь доступ к админке (опционально, но рекомендуется)

В том же поле Custom Nginx Configuration, после предыдущего блока, добавь:

# Ограничение доступа к админке /admin
location ^~ /admin {
    allow 192.168.1.0/24;
    allow 188.73.191.202;
    allow 192.168.45.0/24;
    deny all;
    
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
    add_header X-Content-Type-Options nosniff always;
    add_header X-Frame-Options SAMEORIGIN always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Permissions-Policy "geolocation=(), camera=(), microphone=(), payment=()" always;
    
    proxy_pass https://192.168.1.212:443;
    proxy_ssl_verify off;
    proxy_ssl_server_name on;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

⚠️ Если не добавляешь ограничение — просто пропусти этот блок.

Шаг 6: Сохрани и проверь

  1. Нажми Save внизу страницы
  2. Подожди 10-20 секунд (пока NPM выпустит сертификат Let's Encrypt)
  3. Открой в браузере: https://mail.zailon.ru
  4. Если видишь страницу входа SOGo — всё работает

🔍 Проверка после настройки

1. Проверь, что сертификат работает

curl -I https://mail.zailon.ru

В ответе должна быть строка:

strict-transport-security: max-age=63072000; includeSubDomains; preload

2. Проверь ограничение админки (если настраивал)

  • С ноутбука в локальной сети: https://mail.zailon.ru/admin → должна открыться форма входа
  • С телефона через мобильный интернет (без VPN): → должна быть ошибка 403 Forbidden

3. Проверь почту

  • Открой https://mail.zailon.ru
  • Войди как zevs@zailon.ru
  • Отправь тестовое письмо самому себе → должно прийти мгновенно

🛠 Если что-то не работает

Проблема Решение
403 Forbidden при входе в админку Проверь, что твой IP есть в allow в блоке location ^~ /admin
502 Bad Gateway Убедись, что Mailcow запущен: docker compose ps в контейнере 212
Браузер ругается на сертификат Подожди 1-2 минуты после сохранения в NPM, обнови страницу
Не приходит письмо с внешнего ящика Проверь проброс порта 25 на роутере и DNS-записи MX/SPF

Если не получается — посмотри логи NPM: в админке NPM → HostsProxy Hosts → три точки у записи mail.zailon.ruLogs.

Примечание: Все команды выполняются от имени root.